redis-cluster架構圖node
(1)全部的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.linux
(2)節點的fail是經過集羣中超過半數的節點檢測失效時才生效.redis
(3)客戶端與redis節點直連,不須要中間proxy層.客戶端不須要鏈接集羣全部節點,鏈接集羣中任何一個可用節點便可算法
(4)redis-cluster把全部的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->valuecentos
Redis 集羣中內置了 16384 個哈希槽,當須要在 Redis 集羣中放置一個 key-value 時,redis 先對 key 使用 crc16 算法算出一個結果,而後把結果對 16384 求餘數,這樣每一個 key 都會對應一個編號在 0-16383 之間的哈希槽,redis 會根據節點數量大體均等的將哈希槽映射到不一樣的節點ruby
Key:a微信
計算a的hash值,例如值爲100,100這個槽在server1上,因此a應該放到server1.架構
Key:helloapp
Hash值:10032,此槽在server2上。Hell能夠應該存在server2.分佈式
(1)領着投票過程是集羣中全部master參與,若是半數以上master節點與master節點通訊超過(cluster-node-timeout),認爲當前master節點掛掉.
(2):何時整個集羣不可用(cluster_state:fail)?
a:若是集羣任意master掛掉,且當前master沒有slave.集羣進入fail狀態,也能夠理解成集羣的slot映射[0-16383]不完成時進入fail狀態. ps : redis-3.0.0.rc1加入cluster-require-full-coverage參數,默認關閉,打開集羣兼容部分失敗.
b:若是集羣超過半數以上master掛掉,不管是否有slave集羣進入fail狀態.
ps:當集羣不可用時,全部對集羣的操做作都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤
操做系統 centos6.5
redis 版本 redis3.0
集羣中有三個節點的集羣,每一個節點有一主一備。須要6臺虛擬機。
搭建一個僞分佈式的集羣,使用6個redis實例來模擬。
搭建集羣須要使用到官方提供的ruby腳本。
須要安裝ruby的環境。
安裝ruby
yum install ruby
yum install rubygems
redis集羣管理工具redis-trib.rb
[root@bogon ~]# cd redis-3.0.0
[root@bogon redis-3.0.0]# cd src
[root@bogon src]# ll *.rb
-rwxrwxr-x. 1 root root 48141 Apr 1 07:01 redis-trib.rb
[root@bogon src]#
腳本須要的ruby包:redis-3.0.0.gem
須要上傳到linux服務。
安裝ruby的包:
gem install redis-3.0.0.gem
[root@bogon ~]# gem install redis-3.0.0.gem
Successfully installed redis-3.0.0
1 gem installed
Installing ri documentation for redis-3.0.0...
Installing RDoc documentation for redis-3.0.0...
第一步:建立6個redis實例,端口號從7001~7006
第二步:修改redis的配置文件
1、修改端口號
2、打開cluster-enable前面的註釋。
第三步:把建立集羣的ruby腳本複製到redis-cluster目錄下。
第四步:啓動6個redis實例
分別進入7001、7002、...7006目錄,執行:
./redis-server ./redis.conf
第五步:建立集羣。
./redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005 192.168.25.153:7006
說明:
redis集羣至少須要3個主節點,每一個主節點有一個從節點總共6個節點
replicas指定爲1表示每一個主節點有一個從節點
注意:
若是執行時報以下錯誤:
[ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
解決方法是刪除生成的配置文件nodes.conf,若是不行則說明如今建立的結點包括了舊集羣的結點信息,須要刪除redis的持久化文件後再重啓redis,好比:appendonly.aof、dump.rdb
[root@bogon redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005 192.168.25.153:7006
>>> Creating cluster
Connecting to node 192.168.25.153:7001: OK
Connecting to node 192.168.25.153:7002: OK
Connecting to node 192.168.25.153:7003: OK
Connecting to node 192.168.25.153:7004: OK
Connecting to node 192.168.25.153:7005: OK
Connecting to node 192.168.25.153:7006: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.25.153:7001
192.168.25.153:7002
192.168.25.153:7003
Adding replica 192.168.25.153:7004 to 192.168.25.153:7001
Adding replica 192.168.25.153:7005 to 192.168.25.153:7002
Adding replica 192.168.25.153:7006 to 192.168.25.153:7003
M: 5a8523db7e12ca600dc82901ced06741b3010076 192.168.25.153:7001
slots:0-5460 (5461 slots) master
M: bf6f0929044db485dea9b565bb51e0c917d20a53 192.168.25.153:7002
slots:5461-10922 (5462 slots) master
M: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca 192.168.25.153:7003
slots:10923-16383 (5461 slots) master
S: 2a61b87b49e5b1c84092918fa2467dd70fec115f 192.168.25.153:7004
replicates 5a8523db7e12ca600dc82901ced06741b3010076
S: 14848b8c813766387cfd77229bd2d1ffd6ac8d65 192.168.25.153:7005
replicates bf6f0929044db485dea9b565bb51e0c917d20a53
S: 3192cbe437fe67bbde9062f59d5a77dabcd0d632 192.168.25.153:7006
replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca
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 192.168.25.153:7001)
M: 5a8523db7e12ca600dc82901ced06741b3010076 192.168.25.153:7001
slots:0-5460 (5461 slots) master
M: bf6f0929044db485dea9b565bb51e0c917d20a53 192.168.25.153:7002
slots:5461-10922 (5462 slots) master
M: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca 192.168.25.153:7003
slots:10923-16383 (5461 slots) master
M: 2a61b87b49e5b1c84092918fa2467dd70fec115f 192.168.25.153:7004
slots: (0 slots) master
replicates 5a8523db7e12ca600dc82901ced06741b3010076
M: 14848b8c813766387cfd77229bd2d1ffd6ac8d65 192.168.25.153:7005
slots: (0 slots) master
replicates bf6f0929044db485dea9b565bb51e0c917d20a53
M: 3192cbe437fe67bbde9062f59d5a77dabcd0d632 192.168.25.153:7006
slots: (0 slots) master
replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@bogon redis-cluster]#
到此安裝成功
查看Reids進程
集羣建立成功登錄任意redis結點查詢集羣中的節點狀況。
客戶端以集羣方式登錄:
說明:
./redis-cli -c -h 192.168.101.3 -p 7001 ,其中-c表示以集羣方式鏈接redis,-h指定ip地址,-p指定端口號
cluster nodes 查詢集羣結點信息
cluster info 查詢集羣狀態信息
集羣建立成功後能夠向集羣中添加節點,下面是添加一個master主節點
添加7007結點,參考集羣結點規劃章節添加一個「7007」目錄做爲新節點。
執行下邊命令:
./redis-trib.rb add-node 192.168.101.3:7007 192.168.101.3:7001
查看集羣結點發現7007已添加到集羣中:
添加完主節點須要對主節點進行hash槽分配這樣該主節才能夠存儲數據。
redis集羣有16384個槽,集羣中的每一個結點分配自已槽,經過查看集羣結點能夠看到槽佔用狀況。
給剛添加的7007結點分配槽:
第一步:鏈接上集羣
./redis-trib.rb reshard 192.168.101.3:7001(鏈接集羣中任意一個可用結點都行)
第二步:輸入要分配的槽數量
輸入 500表示要分配500個槽、
第三步:輸入接收槽的結點id
這裏準備給7007分配槽,經過cluster nodes查看7007結點id爲15b809eadae88955e36bcdbb8144f61bbbaf38fb
輸入:15b809eadae88955e36bcdbb8144f61bbbaf38fb
第四步:輸入源結點id
這裏輸入all
第五步:輸入yes開始移動槽到目標結點id
集羣建立成功後能夠向集羣中添加節點,下面是添加一個slave從節點。
添加7008從結點,將7008做爲7007的從結點。
./redis-trib.rb add-node --slave --master-id 主節點id 添加節點的ip和端口 集羣中已存在節點ip和端口
執行以下命令:
./redis-trib.rb add-node --slave --master-id cad9f7413ec6842c971dbcc2c48b4ca959eb5db4 192.168.101.3:7008 192.168.101.3:7001
cad9f7413ec6842c971dbcc2c48b4ca959eb5db4 是7007結點的id,可經過cluster nodes查看。
注意:若是原來該結點在集羣中的配置信息已經生成cluster-config-file指定的配置文件中(若是cluster-config-file沒有指定則默認爲nodes.conf),這時可能會報錯:
[ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
解決方法是刪除生成的配置文件nodes.conf,刪除後再執行./redis-trib.rb add-node指令
查看集羣中的結點,剛添加的7008爲7007的從節點:
./redis-trib.rb del-node 127.0.0.1:7005 4b45eb75c8b428fbd77ab979b85080146a9bc017
刪除已經佔有hash槽的結點會失敗,報錯以下:
[ERR] Node 127.0.0.1:7005 is not empty! Reshard data away and try again.
須要將該結點佔用的hash槽分配出去(參考hash槽從新分配章節)。
[root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.153 -p 7002 -c
[root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.153 -p 7002
192.168.25.153:7002> set a 100
(error) MOVED 15495 192.168.25.153:7003
192.168.25.153:7002>
[root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.153 -p 7002 -c
192.168.25.153:7002> set a 100
-> Redirected to slot [15495] located at 192.168.25.153:7003
OK
192.168.25.153:7003>
redis01/redis-cli -p 7001 shutdown
最後分享一個微信公衆賬號騎豬上樹 這是我本身開發的微信機器人謝謝你們