您好,登錄后才能下訂單哦!
Redis 集群是一個(gè)分布式(distributed)、容錯(cuò)(fault-tolerant)的 Redis 實(shí)現(xiàn),集群可以使用的功能是普通單機(jī) Redis 所能使用的功能的一個(gè)子集(subset)。
Redis 集群中不存在中心(central)節(jié)點(diǎn)或者代理(proxy)節(jié)點(diǎn),集群的其中一個(gè)主要設(shè)計(jì)目標(biāo)是達(dá)到線性可擴(kuò)展性(linear scalability)。
Redis 集群為了保證一致性(consistency)而犧牲了一部分容錯(cuò)性:系統(tǒng)會(huì)在保證對(duì)網(wǎng)絡(luò)斷線(net split)和節(jié)點(diǎn)失效(node failure)具有有限(limited)抵抗力的前提下,盡可能地保持?jǐn)?shù)據(jù)的一致性。
請(qǐng)注意,本教程使用于Redis3.0(包括3.0)以上版本
如果你計(jì)劃部署集群,那么我們建議你從閱讀這個(gè)文檔開始。
Redis集群介紹
Redis 集群是一個(gè)提供在多個(gè)Redis間節(jié)點(diǎn)間共享數(shù)據(jù)的程序集。
Redis集群并不支持處理多個(gè)keys的命令,因?yàn)檫@需要在不同的節(jié)點(diǎn)間移動(dòng)數(shù)據(jù),從而達(dá)不到像Redis那樣的性能,在高負(fù)載的情況下可能會(huì)導(dǎo)致不可預(yù)料的錯(cuò)誤.
Redis 集群通過(guò)分區(qū)來(lái)提供一定程度的可用性,在實(shí)際環(huán)境中當(dāng)某個(gè)節(jié)點(diǎn)宕機(jī)或者不可達(dá)的情況下繼續(xù)處理命令. Redis 集群的優(yōu)勢(shì):
自動(dòng)分割數(shù)據(jù)到不同的節(jié)點(diǎn)上。
整個(gè)集群的部分節(jié)點(diǎn)失敗或者不可達(dá)的情況下能夠繼續(xù)處理命令。
Redis 集群的數(shù)據(jù)分片
Redis 集群沒有使用一致性hash, 而是引入了 哈希槽的概念.
Redis 集群有16384個(gè)哈希槽,每個(gè)key通過(guò)CRC16校驗(yàn)后對(duì)16384取模來(lái)決定放置哪個(gè)槽.集群的每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分hash槽,舉個(gè)例子,比如當(dāng)前集群有3個(gè)節(jié)點(diǎn),那么:
節(jié)點(diǎn) A 包含 0 到 5500號(hào)哈希槽.
節(jié)點(diǎn) B 包含5501 到 11000 號(hào)哈希槽.
節(jié)點(diǎn) C 包含11001 到 16384號(hào)哈希槽.
這種結(jié)構(gòu)很容易添加或者刪除節(jié)點(diǎn). 比如如果我想新添加個(gè)節(jié)點(diǎn)D, 我需要從節(jié)點(diǎn) A, B, C中得部分槽到D上. 如果我像移除節(jié)點(diǎn)A,需要將A中得槽移到B和C節(jié)點(diǎn)上,然后將沒有任何槽的A節(jié)點(diǎn)從集群中移除即可. 由于從一個(gè)節(jié)點(diǎn)將哈希槽移動(dòng)到另一個(gè)節(jié)點(diǎn)并不會(huì)停止服務(wù),所以無(wú)論添加刪除或者改變某個(gè)節(jié)點(diǎn)的哈希槽的數(shù)量都不會(huì)造成集群不可用的狀態(tài).
Redis 集群的主從復(fù)制模型
為了使在部分節(jié)點(diǎn)失敗或者大部分節(jié)點(diǎn)無(wú)法通信的情況下集群仍然可用,所以集群使用了主從復(fù)制模型,每個(gè)節(jié)點(diǎn)都會(huì)有N-1個(gè)復(fù)制品.
在我們例子中具有A,B,C三個(gè)節(jié)點(diǎn)的集群,在沒有復(fù)制模型的情況下,如果節(jié)點(diǎn)B失敗了,那么整個(gè)集群就會(huì)以為缺少5501-11000這個(gè)范圍的槽而不可用.
然而如果在集群創(chuàng)建的時(shí)候(或者過(guò)一段時(shí)間)我們?yōu)槊總€(gè)節(jié)點(diǎn)添加一個(gè)從節(jié)點(diǎn)A1,B1,C1,那么整個(gè)集群便有三個(gè)master節(jié)點(diǎn)和三個(gè)slave節(jié)點(diǎn)組成,這樣在節(jié)點(diǎn)B失敗后,集群便會(huì)選舉B1為新的主節(jié)點(diǎn)繼續(xù)服務(wù),整個(gè)集群便不會(huì)因?yàn)椴壅也坏蕉豢捎昧?br />
不過(guò)當(dāng)B和B1 都失敗后,集群是不可用的.
Redis 一致性保證
Redis 并不能保證數(shù)據(jù)的強(qiáng)一致性. 這意味這在實(shí)際中集群在特定的條件下可能會(huì)丟失寫操作.
第一個(gè)原因是因?yàn)榧菏怯昧水惒綇?fù)制. 寫操作過(guò)程:
客戶端向主節(jié)點(diǎn)B寫入一條命令.
主節(jié)點(diǎn)B向客戶端回復(fù)命令狀態(tài).
主節(jié)點(diǎn)將寫操作復(fù)制給他得從節(jié)點(diǎn) B1, B2 和 B3.
主節(jié)點(diǎn)對(duì)命令的復(fù)制工作發(fā)生在返回命令回復(fù)之后, 因?yàn)槿绻看翁幚砻钫?qǐng)求都需要等待復(fù)制操作完成的話, 那么主節(jié)點(diǎn)處理命令請(qǐng)求的速度將極大地降低 —— 我們必須在性能和一致性之間做出權(quán)衡。 注意:Redis 集群可能會(huì)在將來(lái)提供同步寫的方法。 Redis 集群另外一種可能會(huì)丟失命令的情況是集群出現(xiàn)了網(wǎng)絡(luò)分區(qū), 并且一個(gè)客戶端與至少包括一個(gè)主節(jié)點(diǎn)在內(nèi)的少數(shù)實(shí)例被孤立。
舉個(gè)例子 假設(shè)集群包含 A 、 B 、 C 、 A1 、 B1 、 C1 六個(gè)節(jié)點(diǎn), 其中 A 、B 、C 為主節(jié)點(diǎn), A1 、B1 、C1 為A,B,C的從節(jié)點(diǎn), 還有一個(gè)客戶端 Z1 假設(shè)集群中發(fā)生網(wǎng)絡(luò)分區(qū),那么集群可能會(huì)分為兩方,大部分的一方包含節(jié)點(diǎn) A 、C 、A1 、B1 和 C1 ,小部分的一方則包含節(jié)點(diǎn) B 和客戶端 Z1 .
Z1仍然能夠向主節(jié)點(diǎn)B中寫入, 如果網(wǎng)絡(luò)分區(qū)發(fā)生時(shí)間較短,那么集群將會(huì)繼續(xù)正常運(yùn)作,如果分區(qū)的時(shí)間足夠讓大部分的一方將B1選舉為新的master,那么Z1寫入B中得數(shù)據(jù)便丟失了.
注意, 在網(wǎng)絡(luò)分裂出現(xiàn)期間, 客戶端 Z1 可以向主節(jié)點(diǎn) B 發(fā)送寫命令的最大時(shí)間是有限制的, 這一時(shí)間限制稱為節(jié)點(diǎn)超時(shí)時(shí)間(node timeout), 是 Redis 集群的一個(gè)重要的配置選項(xiàng):
搭建并使用Redis集群
搭建集群的第一件事情我們需要一些運(yùn)行在 集群模式的Redis實(shí)例. 這意味這集群并不是由一些普通的Redis實(shí)例組成的,集群模式需要通過(guò)配置啟用,開啟集群模式后的Redis實(shí)例便可以使用集群特有的命令和特性了.
目前redis支持的cluster特性
1):節(jié)點(diǎn)自動(dòng)發(fā)現(xiàn)
2):slave->master 選舉,集群容錯(cuò)
3):Hot resharding:在線分片
4):進(jìn)群管理:cluster xxx
5):基于配置(nodes-port.conf)的集群管理
6):ASK 轉(zhuǎn)向/MOVED 轉(zhuǎn)向機(jī)制.
1)redis-cluster架構(gòu)圖
架構(gòu)細(xì)節(jié):
(1)所有的redis節(jié)點(diǎn)彼此互聯(lián)(PING-PONG機(jī)制),內(nèi)部使用二進(jìn)制協(xié)議優(yōu)化傳輸速度和帶寬.
(2)節(jié)點(diǎn)的fail是通過(guò)集群中超過(guò)半數(shù)的節(jié)點(diǎn)檢測(cè)失效時(shí)才生效.
(3)客戶端與redis節(jié)點(diǎn)直連,不需要中間proxy層.客戶端不需要連接集群所有節(jié)點(diǎn),連接集群中任何一個(gè)可用節(jié)點(diǎn)即可
(4)redis-cluster把所有的物理節(jié)點(diǎn)映射到[0-16383]slot上,cluster 負(fù)責(zé)維護(hù)node<->slot<->value2) redis-cluster選舉:容錯(cuò)
(1)領(lǐng)著選舉過(guò)程是集群中所有master參與,如果半數(shù)以上master節(jié)點(diǎn)與master節(jié)點(diǎn)通信超過(guò)(cluster- node-timeout),認(rèn)為當(dāng)前master節(jié)點(diǎn)掛掉.
(2):什么時(shí)候整個(gè)集群不可用(cluster_state:fail),當(dāng)集群不可用時(shí),所有對(duì)集群的操作做都不可用,收到 ((error) CLUSTERDOWN The cluster is down)錯(cuò)誤
a:如果集群任意master掛掉,且當(dāng)前master沒有slave.集群進(jìn)入fail狀態(tài),也可以理解成進(jìn)群的slot映射 [0-16383]不完成時(shí)進(jìn)入fail狀態(tài).
b:如果進(jìn)群超過(guò)半數(shù)以上master掛掉,無(wú)論是否有slave集群進(jìn)入fail狀態(tài).
一、環(huán)境
os:centos7 ip:192.168.19.132 redis:3.2.9 gem-redis:3.2.2
二、搭建集群
1、本機(jī)下載redis-3.2.9.tar.gz
[root@zookeeper ~]# cd /usr/local/src/ [root@zookeeper src]# wget http://download.redis.io/releases/redis-3.2.9.tar.gz
2、安裝
root@zookeeper ~]# yum -y install tcl-8.5* [root@zookeeper src]# tar zxf redis-3.2.9.tar.gz -C /usr/local/ [root@zookeeper src]# ln -s /usr/local/redis-3.2.9 /usr/local/redis [root@zookeeper src]# cd /usr/local/redis 第一種: [root@zookeeper redis]# make MALLOC=libc && make install [root@zookeeper redis]# make test(可選,等待時(shí)間長(zhǎng)) ...... \o/ All tests passed without errors! Cleanup: may take some time... OK make[1]: Leaving directory `/usr/local/redis-3.2.9/src' 第二種make: make完成之后,進(jìn)行install,默認(rèn)安裝路徑為/usr/local/bin下,這里我們把他安裝目錄放到/usr/local/redis下,使用PREFIX指定目錄: [root@zookeeper redis]# make && make PREFIX=/usr/local/redis install
將redis可執(zhí)行目錄添加到環(huán)境變量中,編輯~/.bash_profile添加redis環(huán)境變量:
[root@zookeeper ~]# vim ~/.bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin:/usr/local/redis/bin export PATH [root@zookeeper ~]# source ~/.bash_profile
3、創(chuàng)建文件夾
[root@zookeeper redis]# mkdir -p /data/cluster [root@zookeeper redis]# cd /data/cluster/ [root@zookeeper cluster]# mkdir 7000 7001 7002 7003 7004 7005
4、拷貝修改配置文件
[root@zookeeper cluster]# mkdir /var/log/redis/ [root@zookeeper cluster]# cp /usr/local/redis/redis.conf 7000/redis-7000.conf vim 7000/redis-7000.conf ...... bind 192.168.19.132 port 7000 daemonize yes cluster-enabled yes cluster-config-file nodes-7000.conf cluster-node-timeout 15000 pidfile /var/run/redis_7000.pid logfile "/var/log/redis/redis-7000.log" 改完之后將此配置文件cp到所有節(jié)點(diǎn)上,并且修改端口號(hào)和cluster-config-file項(xiàng)。 [root@zookeeper cluster]# cp 7000/redis-7000.conf 7001/redis-7001.conf [root@zookeeper cluster]# cp 7000/redis-7000.conf 7002/redis-7002.conf [root@zookeeper cluster]# cp 7000/redis-7000.conf 7003/redis-7003.conf [root@zookeeper cluster]# cp 7000/redis-7000.conf 7004/redis-7004.conf [root@zookeeper cluster]# cp 7000/redis-7000.conf 7005/redis-7005.conf ......(修改配置文件請(qǐng)參考redis-7000.conf) [root@zookeeper cluster]# vim 7001/redis-7001.conf [root@zookeeper cluster]# vim 7002/redis-7002.conf [root@zookeeper cluster]# vim 7003/redis-7003.conf [root@zookeeper cluster]# vim 7004/redis-7004.conf [root@zookeeper cluster]# vim 7005/redis-7005.conf
5、啟動(dòng)6個(gè)實(shí)例
[root@zookeeper cluster]# redis-server 7000/redis-7000.conf [root@zookeeper cluster]# redis-server 7001/redis-7001.conf [root@zookeeper cluster]# redis-server 7002/redis-7002.conf [root@zookeeper cluster]# redis-server 7003/redis-7003.conf [root@zookeeper cluster]# redis-server 7004/redis-7004.conf [root@zookeeper cluster]# redis-server 7005/redis-7005.conf [root@zookeeper cluster]# 關(guān)閉命令:[root@zookeeper cluster]# redis-cli -p 端口號(hào) shutdown
用redis-cli -c -h -p命令登錄
-c是以集群方式登錄;
-h后跟主機(jī)號(hào) ;
-p后跟端口號(hào)。
綁定了127.0.0.1則可以省略-h參數(shù)。不加-c則客戶端不自動(dòng)切換。
例如:客戶端登錄7000端口的,設(shè)置的數(shù)據(jù)應(yīng)該存放在7001上則會(huì)報(bào)錯(cuò)請(qǐng)轉(zhuǎn)到7001。而加上-c啟動(dòng)則會(huì)自動(dòng)切換到7001客戶端保存。
6、查看redis進(jìn)程啟動(dòng)狀態(tài)
[root@zookeeper cluster]# ps -ef| grep redis root 18839 1 0 22:58 ? 00:00:00 redis-server 192.168.19.132:7000 [cluster] root 18843 1 0 22:58 ? 00:00:00 redis-server 192.168.19.132:7001 [cluster] root 18847 1 0 22:58 ? 00:00:00 redis-server 192.168.19.132:7002 [cluster] root 18851 1 0 22:59 ? 00:00:00 redis-server 192.168.19.132:7003 [cluster] root 18855 1 0 22:59 ? 00:00:00 redis-server 192.168.19.132:7004 [cluster] root 18859 1 0 22:59 ? 00:00:00 redis-server 192.168.19.132:7005 [cluster] root 18865 2891 0 22:59 pts/1 00:00:00 grep --color=auto redis [root@zookeeper cluster]#
7、部署集群
7.1、安裝ruby依賴,返回安裝軟件目錄
root@zookeeper src]# yum install ruby rubygems -y [root@zookeeper src]# wget https://rubygems.org/downloads/redis-3.2.2.gem 安裝集群管理工具 Redis作者應(yīng)該是個(gè)Ruby愛好者,Ruby客戶端就是他開發(fā)的。這次集群的管理功能沒有嵌入到Redis代碼中,于是作者又順手寫了個(gè)叫做redis-trib的管理腳本。redis-trib依賴Ruby和RubyGems,以及redis擴(kuò)展??梢韵扔脀hich命令查看是否已安裝ruby和rubygems,用gem list –local查看本地是否已安裝redis擴(kuò)展。 [root@zookeeper src]# gem install -l redis-3.2.2.gem Successfully installed redis-3.2.2 Parsing documentation for redis-3.2.2 Installing ri documentation for redis-3.2.2 1 gem installed
7.2、將集群管理程序復(fù)制到/usr/local/bin/
[root@zookeeper src]# cp /usr/local/redis/src/redis-trib.rb /usr/local/bin/redis-trib
可以看到redis-trib.rb具有以下功能:
1、create:創(chuàng)建集群
2、check:檢查集群
3、info:查看集群信息
4、fix:修復(fù)集群
5、reshard:在線遷移slot
6、rebalance:平衡集群節(jié)點(diǎn)slot數(shù)量
7、add-node:將新節(jié)點(diǎn)加入集群
8、del-node:從集群中刪除節(jié)點(diǎn)
9、set-timeout:設(shè)置集群節(jié)點(diǎn)間心跳連接的超時(shí)時(shí)間
10、call:在集群全部節(jié)點(diǎn)上執(zhí)行命令
11、import:將外部redis數(shù)據(jù)導(dǎo)入集群
8、創(chuàng)建集群
[root@zookeeper cluster]# redis-trib create --replicas 1 192.168.19.132:7000 192.168.19.132:7001 192.168.19.132:7002 192.168.19.132:7003 192.168.19.132:7004 192.168.19.132:7005 >>> Creating cluster >>> Performing hash slots allocation on 7 nodes... Using 3 masters: 192.168.19.132:7000 192.168.19.132:7001 192.168.19.132:7002 Adding replica 192.168.19.132:7003 to 192.168.19.132:7000 Adding replica 192.168.19.132:7004 to 192.168.19.132:7001 Adding replica 192.168.19.132:7005 to 192.168.19.132:7002 M: 3546a9930ce08543731c4d49ae8609d75b0b8193 192.168.19.132:7000 slots:0-16383 (16384 slots) master M: 1dd532b0f41b98574b6cd355fa58a2773c9da8fe 192.168.19.132:7001 slots:5461-10922 (5462 slots) master M: 2900e315a4a01df8609eafe0f9fd2a1d779ecc69 192.168.19.132:7002 slots:10923-16383 (5461 slots) master S: 71c8cea8e3e9c913eb7c09bd3f95c03985938eca 192.168.19.132:7003 replicates 3546a9930ce08543731c4d49ae8609d75b0b8193 S: 046a02ea253d8912b87c13e98b28f81e6c54c0b1 192.168.19.132:7004 replicates 1dd532b0f41b98574b6cd355fa58a2773c9da8fe S: 8a666ed58930673b7dfc6d005c2a937751350f77 192.168.19.132:7005 replicates 2900e315a4a01df8609eafe0f9fd2a1d779ecc69 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.19.132:7000) M: 3da69162cde5884f21cec07f6f812ffbdda0cfc4 192.168.19.132:7000 slots:0-10922 (10923 slots) master 3 additional replica(s) M: d30be1d1232e55f3cc69d8d11e9eb9a870160ac1 192.168.19.132:7001 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: 6bd6589a69ce37da5335ffd10b042ce0b02e3247 192.168.19.132:7004 slots: (0 slots) slave replicates d30be1d1232e55f3cc69d8d11e9eb9a870160ac1 S: 12d7db519133b96bac51b79204f69eabdfe75627 192.168.19.132:7002 slots: (0 slots) slave replicates 3da69162cde5884f21cec07f6f812ffbdda0cfc4 S: 8a9d6189b42bef127ab388e221d8225938c3f038 192.168.19.132:7003 slots: (0 slots) slave replicates 3da69162cde5884f21cec07f6f812ffbdda0cfc4 S: 2cfb927fc17988be6fee6b5eb1249e2789a76f82 192.168.19.132:7005 slots: (0 slots) slave replicates 3da69162cde5884f21cec07f6f812ffbdda0cfc4 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
當(dāng)我們同意這份計(jì)劃之后輸入yes,,Can I set the above configuration? (type 'yes' to accept): yes,開始執(zhí)行節(jié)點(diǎn)握手和槽分配操作。
最后輸出報(bào)告說(shuō)明,16384個(gè)槽全部被分配,集群創(chuàng)建成功。這里需要注意給redis-trib.rb的節(jié)點(diǎn)地址必須是不包含任何槽/數(shù)據(jù)的節(jié)點(diǎn),否則會(huì)拒絕創(chuàng)建集群。
--replicascas參數(shù)制定集群中每個(gè)主節(jié)點(diǎn)配置幾個(gè)從節(jié)點(diǎn),這里設(shè)置為1.節(jié)點(diǎn)列表順序用于確定主從角色,先主節(jié)點(diǎn)之后是從節(jié)點(diǎn)。
創(chuàng)建流程如下:
1、首先為每個(gè)節(jié)點(diǎn)創(chuàng)建ClusterNode對(duì)象,包括連接每個(gè)節(jié)點(diǎn)。檢查每個(gè)節(jié)點(diǎn)是否為獨(dú)立且db為空的節(jié)點(diǎn)。執(zhí)行l(wèi)oad_info方法導(dǎo)入節(jié)點(diǎn)信息。
2、檢查傳入的master節(jié)點(diǎn)數(shù)量是否大于等于3個(gè)。只有大于3個(gè)節(jié)點(diǎn)才能組成集群。
3、計(jì)算每個(gè)master需要分配的slot數(shù)量,以及給master分配slave。分配的算法大致如下:
先把節(jié)點(diǎn)按照host分類,這樣保證master節(jié)點(diǎn)能分配到更多的主機(jī)中。
不停遍歷遍歷host列表,從每個(gè)host列表中彈出一個(gè)節(jié)點(diǎn),放入interleaved數(shù)組。直到所有的節(jié)點(diǎn)都彈出為止。
master節(jié)點(diǎn)列表就是interleaved前面的master數(shù)量的節(jié)點(diǎn)列表。保存在masters數(shù)組。
計(jì)算每個(gè)master節(jié)點(diǎn)負(fù)責(zé)的slot數(shù)量,保存在slots_per_node對(duì)象,用slot總數(shù)除以master數(shù)量取整即可。
遍歷masters數(shù)組,每個(gè)master分配slots_per_node個(gè)slot,最后一個(gè)master,分配到16384個(gè)slot為止。
接下來(lái)為master分配slave,分配算法會(huì)盡量保證master和slave節(jié)點(diǎn)不在同一臺(tái)主機(jī)上。對(duì)于分配完指定slave數(shù)量的節(jié)點(diǎn),還有多余的節(jié)點(diǎn),也會(huì)為這些節(jié)點(diǎn)尋找master。分配算法會(huì)遍歷兩次masters數(shù)組。
第一次遍歷masters數(shù)組,在余下的節(jié)點(diǎn)列表找到replicas數(shù)量個(gè)slave。每個(gè)slave為第一個(gè)和master節(jié)點(diǎn)host不一樣的節(jié)點(diǎn),如果沒有不一樣的節(jié)點(diǎn),則直接取出余下列表的第一個(gè)節(jié)點(diǎn)。
第二次遍歷是在對(duì)于節(jié)點(diǎn)數(shù)除以replicas不為整數(shù),則會(huì)多余一部分節(jié)點(diǎn)。遍歷的方式跟第一次一樣,只是第一次會(huì)一次性給master分配replicas數(shù)量個(gè)slave,而第二次遍歷只分配一個(gè),直到余下的節(jié)點(diǎn)被全部分配出去。
4、打印出分配信息,并提示用戶輸入“yes”確認(rèn)是否按照打印出來(lái)的分配方式創(chuàng)建集群。
5、輸入“yes”后,會(huì)執(zhí)行flush_nodes_config操作,該操作執(zhí)行前面的分配結(jié)果,給master分配slot,讓slave復(fù)制master,對(duì)于還沒有握手(cluster meet)的節(jié)點(diǎn),slave復(fù)制操作無(wú)法完成,不過(guò)沒關(guān)系,flush_nodes_config操作出現(xiàn)異常會(huì)很快返回,后續(xù)握手后會(huì)再次執(zhí)行flush_nodes_config。
6、給每個(gè)節(jié)點(diǎn)分配epoch,遍歷節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)分配的epoch比之前節(jié)點(diǎn)大1。
7、節(jié)點(diǎn)間開始相互握手,握手的方式為節(jié)點(diǎn)列表的其他節(jié)點(diǎn)跟第一個(gè)節(jié)點(diǎn)握手。
8、然后每隔1秒檢查一次各個(gè)節(jié)點(diǎn)是否已經(jīng)消息同步完成,使用ClusterNode的get_config_signature方法,檢查的算法為獲取每個(gè)節(jié)點(diǎn)cluster nodes信息,排序每個(gè)節(jié)點(diǎn),組裝成node_id1:slots|node_id2:slot2|...的字符串。如果每個(gè)節(jié)點(diǎn)獲得字符串都相同,即認(rèn)為握手成功。
9、此后會(huì)再執(zhí)行一次flush_nodes_config,這次主要是為了完成slave復(fù)制操作。
10、最后再執(zhí)行check_cluster,全面檢查一次集群狀態(tài)。包括和前面握手時(shí)檢查一樣的方式再檢查一遍。確認(rèn)沒有遷移的節(jié)點(diǎn)。確認(rèn)所有的slot都被分配出去了。
11、至此完成了整個(gè)創(chuàng)建流程,返回[OK] All 16384 slots covered.。
9、集群完整性檢查
[root@zookeeper ~]# redis-trib check 192.168.19.132:7000 >>> Performing Cluster Check (using node 192.168.19.132:7000) M: 8a628ee2e98c70a404be020cba3dfc1172a38335 192.168.19.132:7000 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 154e2f4f3fad75a564f9fe2efcde7820284116c6 192.168.19.132:7003 slots: (0 slots) slave replicates 8a628ee2e98c70a404be020cba3dfc1172a38335 S: f2707a3052d3dc91358b73b4786e4c8e20662a79 192.168.19.132:7004 slots: (0 slots) slave replicates 0e4d1ee05b090c45ce979bc9e8ad4c027d5332ef M: 0e4d1ee05b090c45ce979bc9e8ad4c027d5332ef 192.168.19.132:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) M: 08d3663dc9e0f5f02e2bff07640d67e406211e49 192.168.19.132:7002 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: a44237119e6b2129e457d2f48a584b94b1b815f5 192.168.19.132:7005 slots: (0 slots) slave replicates 08d3663dc9e0f5f02e2bff07640d67e406211e49 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. [root@zookeeper ~]# redis-trib check 192.168.19.132:7004 >>> Performing Cluster Check (using node 192.168.19.132:7004) S: f2707a3052d3dc91358b73b4786e4c8e20662a79 192.168.19.132:7004 slots: (0 slots) slave replicates 0e4d1ee05b090c45ce979bc9e8ad4c027d5332ef M: 0e4d1ee05b090c45ce979bc9e8ad4c027d5332ef 192.168.19.132:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: 154e2f4f3fad75a564f9fe2efcde7820284116c6 192.168.19.132:7003 slots: (0 slots) slave replicates 8a628ee2e98c70a404be020cba3dfc1172a38335 M: 08d3663dc9e0f5f02e2bff07640d67e406211e49 192.168.19.132:7002 slots:10923-16383 (5461 slots) master 1 additional replica(s) M: 8a628ee2e98c70a404be020cba3dfc1172a38335 192.168.19.132:7000 slots:0-5460 (5461 slots) master 1 additional replica(s) S: a44237119e6b2129e457d2f48a584b94b1b815f5 192.168.19.132:7005 slots: (0 slots) slave replicates 08d3663dc9e0f5f02e2bff07640d67e406211e49 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
10 測(cè)試
[root@zookeeper ~]# redis-cli -h 192.168.19.132 -p 7000 192.168.19.132:7000> CLUSTER INFO cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:1 cluster_stats_messages_sent:414 cluster_stats_messages_received:414 3192.168.19.132:7000> CLUSTER NODES 154e2f4f3fad75a564f9fe2efcde7820284116c6 192.168.19.132:7003 slave 8a628ee2e98c70a404be020cba3dfc1172a38335 0 1496720263710 4 connected f2707a3052d3dc91358b73b4786e4c8e20662a79 192.168.19.132:7004 slave 0e4d1ee05b090c45ce979bc9e8ad4c027d5332ef 0 1496720264715 5 connected 0e4d1ee05b090c45ce979bc9e8ad4c027d5332ef 192.168.19.132:7001 master - 0 1496720262702 2 connected 5461-10922 08d3663dc9e0f5f02e2bff07640d67e406211e49 192.168.19.132:7002 master - 0 1496720265722 3 connected 10923-16383 a44237119e6b2129e457d2f48a584b94b1b815f5 192.168.19.132:7005 slave 08d3663dc9e0f5f02e2bff07640d67e406211e49 0 1496720266730 6 connected 8a628ee2e98c70a404be020cba3dfc1172a38335 192.168.19.132:7000 myself,master - 0 0 1 connected 0-5460
當(dāng)前集群狀態(tài)是OK,集群進(jìn)入在線狀態(tài)。cluster nodes可以看到節(jié)點(diǎn)和槽的分配關(guān)系,目前還有三個(gè)及誒按沒有使用,作為一個(gè)完整的集群,每個(gè)負(fù)責(zé)處理槽的節(jié)點(diǎn)都應(yīng)該具有從節(jié)點(diǎn),保證當(dāng)它出現(xiàn)故障時(shí)可以自動(dòng)進(jìn)行故障轉(zhuǎn)移。集群模式下,Redis節(jié)點(diǎn)角色分為主節(jié)點(diǎn)和從節(jié)點(diǎn)。首次啟動(dòng)的節(jié)點(diǎn)和被分配槽的節(jié)點(diǎn)都是主節(jié)點(diǎn),從節(jié)點(diǎn)負(fù)責(zé)復(fù)制主節(jié)點(diǎn)槽信息和相關(guān)數(shù)據(jù)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。