溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Redis Cluster集群部署方案

發(fā)布時(shí)間:2020-07-14 02:40:55 來(lái)源:網(wǎng)絡(luò) 閱讀:25078 作者:zyx1990zm 欄目:建站服務(wù)器

什么是 Redis 集群

    

    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)圖

Redis Cluster集群部署方案

架構(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ò)

Redis Cluster集群部署方案


(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ù)。





向AI問一下細(xì)節(jié)

免責(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)容。

AI