構建redis cluster。而後測試,操做redis cluster。redis集羣中的data會自動被分片在跨多個reids nodeds.
參考官當點擊這裏java
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目錄下併發
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.
不管python,java, ruby仍是go,node.js,都有額外客戶端庫訪問redis cluster。這裏就使用redis-cli來訪問,特別處就是加上-c參數,就能夠了。工具
1. redis-cli -c -p 7000 # 就能夠經過7000的訪問redis cluster集羣了 不過redis-cli 是一個比較簡單的客戶端。比較好的客戶端應該是緩存了hash slots與對應節點的地址,直接訪問對應的node,而不用經過redirect
redis-cli --cluster add-node 127.0.0.1:your_new_port 127.0.0.1:7000
增長一個複製節點有兩種方式:測試
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
很簡單,只須要重啓升級便可,沒有其它影響。
若是從單個master,或者其它狀況要將數據遷移到redis cluster,那麼就可能存在一些事務問題或者說是多key同時操做問題。
因爲第一種狀況沒法解決,因此咱們聚焦在2,3狀況。
這裏有另外一個方式去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。