06. redis cluster

Redis Cluster

構建redis cluster。而後測試,操做redis cluster。redis集羣中的data會自動被分片在跨多個reids nodeds.
參考官當點擊這裏java

redis cluster 特色

  1. 自動分片dataset數據集到rediscluster的節點2中。自動哦!
  2. redis cluster提供持續使用操做數據功能,當出現集羣中一些節點失敗或者不能communicte和其它正常節點時。

搭建redis cluster

  • 下載

wget http://download.redis.io/releases/redis-5.0.5.tar.gznode

tar xf redis-5.0.5.tar.gzpython

  • 編譯

cd redis-5.0.5redis

make緩存

  • 安裝

make install PREFIX=/server/redis # PREFIX指定將編譯好的redis相關二進制文件安裝到指定目錄。ruby

  • 安裝後二進制文件路徑

二進制文件將在PREFIX/bin目錄下併發

  • 構建redis cluster集羣
1. 從新建立一個redis_cluster目錄,用於部署每個redis節點實例
2. 在redis_cluster目錄下建立redis節點實例目錄,已官網例子,6個節點實例,3主3從。
3. cd redis_cluster && mkdir 700{0,1,2,3,4,5}  # 在集羣目錄中建立6個實例目錄。
4. 而後在7000-7005 每一個目錄下建立一個redis.conf文件,做爲每一個節點的配置文件。
5. 集羣節點最小配置項以下,添加到每一個redis.conf文件中,可是要修改port爲對應的目錄號。
------redis.conf配置文件內容以下---------
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
------分割線----------------------------
6. 拷貝剛纔安裝的二進制路徑bin下的redis-server到每一個7000-7005目錄下
7. 而後每一個目錄下執行 ./redis-server ./reids.conf 啓動每一個redis cluster 節點實例
8. 若是是redis 5 版本及以上。就直接能夠利用redis-cli程序來構建new cluster,並檢測和從新分片咱們的redis集羣數據。若是是5如下的版本參考[點擊這裏](https://redis.io/topics/cluster-tutorial)或者google, 咱們都是用5版原本作。
9. 經過redis-cli命令來執行: redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
10. 集羣的構建配置過程是一個自動化配置的過程,可是最後會詢問是否配置,而後鍵入yes就能夠了。

11. 固然在redis的源碼目錄的utils下有一個目錄叫create-cluster 裏面就包含了方便建立集羣的工具,參考其中的README文件
12. 至此,redis cluster的簡單搭建就完成了。

下面是執行redis-cli命令的輸出app

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:7004 to 127.0.0.1:7000
Adding replica 127.0.0.1:7005 to 127.0.0.1:7001
Adding replica 127.0.0.1:7003 to 127.0.0.1:7002
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: cb891554949583a7a54edf59e33bec838a230274 127.0.0.1:7000
   slots:[0-5460] (5461 slots) master
M: cffc46853e7b8187172ccbfe2694065084eda1e7 127.0.0.1:7001
   slots:[5461-10922] (5462 slots) master
M: 8756a8eb3b7803aa917be509d54a1294fbbf6be1 127.0.0.1:7002
   slots:[10923-16383] (5461 slots) master
S: 558a8e71c5d7a41813539653ab3c8bd2ed98e8dc 127.0.0.1:7003
   replicates 8756a8eb3b7803aa917be509d54a1294fbbf6be1
S: d30fa58dd88767dbc7b393f1cf8f51765562c30d 127.0.0.1:7004
   replicates cb891554949583a7a54edf59e33bec838a230274
S: bcf8db2410a78b3aff9b071035e168bcfbd28e28 127.0.0.1:7005
   replicates cffc46853e7b8187172ccbfe2694065084eda1e7
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
....
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: cb891554949583a7a54edf59e33bec838a230274 127.0.0.1:7000
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: cffc46853e7b8187172ccbfe2694065084eda1e7 127.0.0.1:7001
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 558a8e71c5d7a41813539653ab3c8bd2ed98e8dc 127.0.0.1:7003
   slots: (0 slots) slave
   replicates 8756a8eb3b7803aa917be509d54a1294fbbf6be1
S: bcf8db2410a78b3aff9b071035e168bcfbd28e28 127.0.0.1:7005
   slots: (0 slots) slave
   replicates cffc46853e7b8187172ccbfe2694065084eda1e7
S: d30fa58dd88767dbc7b393f1cf8f51765562c30d 127.0.0.1:7004
   slots: (0 slots) slave
   replicates cb891554949583a7a54edf59e33bec838a230274
M: 8756a8eb3b7803aa917be509d54a1294fbbf6be1 127.0.0.1:7002
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

訪問redis cluster

不管python,java, ruby仍是go,node.js,都有額外客戶端庫訪問redis cluster。這裏就使用redis-cli來訪問,特別處就是加上-c參數,就能夠了。工具

redis-cli 訪問redis cluster

1. redis-cli -c -p 7000  # 就能夠經過7000的訪問redis cluster集羣了
不過redis-cli 是一個比較簡單的客戶端。比較好的客戶端應該是緩存了hash slots與對應節點的地址,直接訪問對應的node,而不用經過redirect

從新分片數據

新加master節點

  1. 首先節點得配置爲cluster 模式,而後啓動運行,端口不能與已存在的redis cluster 節點衝突。
  2. 而後執行如下命令:
    redis-cli --cluster add-node 127.0.0.1:your_new_port 127.0.0.1:7000
    這時候新節點就會處於myself,master 狀態。
  3. 新節點目前的狀態算是加入到了redis cluster,可是和其它節點不同:首先,它是沒有hash slots,即沒有數據的;再,它是不會參加選舉當一個slave想變爲master時。
  4. 注意,固然能夠經過從新分片,來給新節點分配hash slots。

新加一個複製slave節點

增長一個複製節點有兩種方式:測試

方式一

redis-cli --cluster add-node 127.0.0.1:your_new_slave_port 127.0.0.1:7000 --cluster-slave
注意, 咱們這裏沒有指定做爲slave的master。這種狀況,redis-cli將會添加這個新的slave到一個隨機的master ,這個master缺乏slave.

若是指定master,執行下面:
redis-cli --cluster add-node 127.0.0.1:your_new_slave_port 127.0.0.1:7000 --cluster-slave --cluster-master-id the_id_of_master

方式二

其實就是講新節點經過添加爲master的方式,而後命令行登陸該節點,而後執行CLUSTER REPLICATE命令來指定變爲slave.
執行命令以下:
>cluster replicate the_id_of_master
這條命令也能夠將一個slave成爲另外一個master的slave.

刪除一個節點

刪除一個slave節點:
redis-cli --cluster del-node 127.0.0.1:7000 node-id

對於master節點的刪除,master節點必須是空的,若是不是空,那麼須要從新分片數據,將其數據從新分片到其它的master中。而後再刪除已經變爲空的master節點。

還有一種方案是,經過執行一個手動的failover操做,讓它的slave變爲master,再刪除已經變爲slave的節點。

災備節點

若是每個master都有slave,那麼咱們還能夠在實例幾個災備slave節點,用於當一個master擋掉,只有一個slave時,這個slave變爲master,而災備的slave就會變爲新master的slave,從而避免單master故障。

節點變爲災備節點經過:migration

升級或者須要重啓節點

對於slave

很簡單,只須要重啓升級便可,沒有其它影響。

對於master

  1. 使用 CLUSTER FAILOVER 去讓master變爲slave
  2. 等待master變爲slave
  3. 而後就能夠升級已經變成slave的節點
  4. 若是須要升級後再變爲master,再觸發一次cluster failover來轉換

遷移到redis cluster

若是從單個master,或者其它狀況要將數據遷移到redis cluster,那麼就可能存在一些事務問題或者說是多key同時操做問題。

  1. 對於事務,多key操做,lua腳本,key都在用切不在同一個hash tag。這種狀況redis cluster是沒法解決的。
  2. 對於上述操做,若是是在同一個hash tag,這種redis cluster能夠解決。
  3. 對於上述操做,若是多key其它併發鏈接沒有被使用,這種redis cluster能夠解決。

因爲第一種狀況沒法解決,因此咱們聚焦在2,3狀況。

  1. 中止你的clients, 非自動實時遷移到redis cluster是可能的。你可能須要去編排一個實時的遷移在你的應用上下文幻境中。
  2. 生成一個 append only file 用於你的全部N master,利用 BGREWRITEAOF 命令, 而後等待AOF生成完成。
  3. 保存你的AOF 文件 從aof-1 到 aof-N , 到如今,你能夠中止你的老的節點實例。
  4. 建立一個redis cluster 組成是 N master 0 slave,slave將後面來添加。肯定你全部的節點使用aof開啓。
  5. 中止全部的cluster節點,替換掉他們的AOF使用前面存在的AOF文件,aof-1 用於第一個節點,aof-2用於第二個節點, 知道aof-N。
  6. 重啓全部的cluster節點使用新的aof文件。他們將完成 這些的keys不該該在這裏 根據他們的配置。
  7. 使用 redis-cli --cluster fix 命令用於修復cluster,以致於全部的keys 將被遷移根據 the hash slots each node is authoritative or not
  8. 使用 redis-cli --cluster check 在最後,肯定你的cluster 是ok的。
  9. 重啓你全部的clistes 被改成使用redis cluster aware client library.

這裏有另外一個方式去import data 從已存在的instances到redis cluster, 就是使用 redis-cli --cluster import 命令。

命令刪除全部的keys 在運行中的instanc 到指定 已存在的 redis cluster. 然而,注意 若是你使用redis 2.8 實例做爲這個source instance 操做可能慢,由於2.8 沒有實現migrate 鏈接緩存,因此你可能想重啓你的source instance使用reids 3.x before to perform such operation。

相關文章
相關標籤/搜索