第七章· Redis Cluster 核心技術

1、Redis Cluster 分佈式集羣

1.什麼是Redis Cluster

1)Redis集羣是一個能夠在多個Redis節點之間進行數據共享的設施(installation)。node

2)Redis集羣不支持那些須要同時處理多個鍵的Redis命令,由於執行這些命令須要在多個Redis節點之間移動數據,而且在高負載的狀況下,這些命令將下降Redis集羣的性能,並致使不可預測的行爲。redis

3)Redis集羣經過分區(partition)來提供必定程度的可用性(availability):即便集羣中有一部分節點失效或者沒法進行通信,集羣也能夠繼續處理命令請求。數據庫

4)Redis集羣有將數據自動切分(split)到多個節點的能力。vim

2.Redis Cluster的特色

高性能ruby

1.在多酚片節點中,將16384個槽位,均勻分佈到多個分片節點中
2.存數據時,將key作crc16(key),而後和16384進行取模,得出槽位值(0-16384之間)
3.根據計算得出的槽位值,找到相對應的分片節點的主節點,存儲到相應槽位上
4.若是客戶端當時鏈接的節點不是未來要存儲的分片節點,分片集羣會將客戶端鏈接切換至真正存儲節點進行數據存儲服務器

高可用
在搭建集羣時,會爲每個分片的主節點,對應一個從節點,實現slaveof功能,同時當主節點down,實現相似於sentinel的自動failover的功能。
app

3.Redis Cluster客戶端鏈接任意節點

如圖所示,當咱們用客戶端鏈接A分片時,若是按照數據的取模,咱們想要訪問的數據,不在A分片中,那麼集羣會自動將請求進行轉發。tcp

4.redis集羣數據共享(設計理念)

Redis 集羣使用數據分片(sharding)而非一致性哈希(consistency hashing)來實現: 一個 Redis 集羣包含 16384 個哈希槽(hash slot), 數據庫中的每一個鍵都屬於這 16384 個哈希槽的其中一個, 集羣使用公式 CRC16(key) % 16384 來計算鍵 key 屬於哪一個槽, 其中 CRC16(key) 語句用於計算鍵 key 的 CRC16 校驗和 。分佈式

1.節點 A 負責處理 0 號至 5500 號哈希槽。
2.節點 B 負責處理 5501 號至 11000 號哈希槽。
3.節點 C 負責處理 11001 號至 16384 號哈希槽。
性能

5.Redis Cluster運行機制

全部的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.
節點的fail是經過集羣中超過半數的master節點檢測失效時才生效.
客戶端與redis節點直連,不須要中間proxy層.客戶端不須要鏈接集羣全部節點,鏈接集羣中任何一個可用節點便可
把全部的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->key

6.Redis Cluster如何作集羣複製

爲了使得集羣在一部分節點下線或者沒法與集羣的大多數(majority)節點進行通信的狀況下, 仍然能夠正常運做, Redis 集羣對節點使用了主從複製功能: 集羣中的每一個節點都有 1 個至 N 個複製品(replica), 其中一個複製品爲主節點(master), 而其他的 N-1 個複製品爲從節點(slave)。

在以前列舉的節點 A 、B 、C 的例子中, 若是節點 B 下線了, 那麼集羣將沒法正常運行, 由於集羣找不到節點來處理 5501 號至 11000 號的哈希槽。

假如在建立集羣的時候(或者至少在節點 B 下線以前), 咱們爲主節點 B 添加了從節點 B1 , 那麼當主節點 B 下線的時候, 集羣就會將 B1 設置爲新的主節點, 並讓它代替下線的主節點 B , 繼續處理 5501 號至 11000 號的哈希槽, 這樣集羣就不會由於主節點 B 的下線而沒法正常運做了。

不過若是節點 B 和 B1 都下線的話, Redis 集羣仍是會中止運做。

集羣的複製特性重用了 SLAVEOF 命令的代碼,因此集羣節點的複製行爲和 SLAVEOF 命令的複製行爲徹底相同。

7.Redis Cluster故障轉移

1)在集羣裏面,節點會對其餘節點進行下線檢測。

2)當一個主節點下線時,集羣裏面的其餘主節點負責對下線主節點進行故障移。

3)換句話說,集羣的節點集成了下線檢測和故障轉移等相似 Sentinel 的功能。

4)由於 Sentinel 是一個獨立運行的監控程序,而集羣的下線檢測和故障轉移等功能是集成在節點裏面的,它們的運行模式很是地不一樣,因此儘管這二者的功能很類似,但集羣的實現沒有重用 Sentinel 的代碼。

8.Redis Cluster中執行命令的兩種狀況

1)命令發送到了正確的節點:命令要處理的鍵所在的槽正好是由接收命令的節點負責,那麼該節點執行命令,就像單機 Redis 服務器同樣。

2)命令發送到了錯誤的節點:接收到命令的節點並不是處理鍵所在槽的節點,那麼節點將向客戶端返回一個轉向(redirection)錯誤,告知客戶端應該到哪一個節點去執行這個命令,客戶端會根據錯誤提示的信息,從新向正確的節點發送命令。

2、Redis Cluster 安裝部署

1.部署Redis Cluster

6個redis實例,通常會放到3臺硬件服務器
注:在企業規劃中,一個分片的兩個分到不一樣的物理機,防止硬件主機宕機形成的整個分片數據丟失。

環境規劃

外網IP 內網IP 端口 安裝包
10.0.0.51 172.16.1.51 7000,7001 redis-3.2.12.tar.gz
10.0.0.52 172.16.1.52 7002,7003 redis-3.2.12.tar.gz
10.0.0.53 172.16.1.53 7004,7005 redis-3.2.12.tar.gz

安裝集羣插件

#EPEL源安裝ruby支持
[root@db01 ~]# yum install ruby rubygems -y

#查看gem源
[root@db01 ~]# gem sources -l
*** CURRENT SOURCES ***

http://rubygems.org/
#添加阿里雲的gem源
[root@db01 ~]# gem sources -a http://mirrors.aliyun.com/rubygems/
http://mirrors.aliyun.com/rubygems/ added to sources 
#刪除國外gem源
[root@db01 ~]# gem sources  --remove https://rubygems.org/
http://rubygems.org/ removed from sources
#再次查看gem源
[root@db01 ~]# gem sources -l
#使用gem安裝redis的ruby插件
[root@db01 ~]# gem install redis -v 3.3.3
Successfully installed redis-3.3.3
1 gem installed
Installing ri documentation for redis-3.3.3...
Installing RDoc documentation for redis-3.3.3...

準備6個實例

#下載
[root@db01 ~]# wget http://download.redis.io/releases/redis-3.2.12.tar.gz
#解壓
[root@db01 ~]# tar xf redis-3.2.12.tar.gz
#移動到指定目錄
[root@db01 ~]# mv redis-3.2.12 /application/
#作軟連接
[root@db01 ~]# ln -s /application/redis-3.2.12 /application/redis
#進入redis目錄
[root@db01 ~]# cd /application/redis
#編譯
[root@db01 redis]# make
#添加環境變量
[root@db01 redis]# vim /etc/profile.d/redis.sh
export PATH="/application/redis/src:$PATH"
#啓動redis
[root@db01 redis]# src/redis-server &

配置多實例

#建立多實例目錄
[root@db01 ~]# mkdir -p /data/700{0..5}

#編輯多實例配置文件
[root@db01 ~]# vim /data/7000/redis.conf
port 7000
daemonize yes
pidfile /data/7000/redis.pid
loglevel notice
logfile "/data/7000/redis.log"
dbfilename dump.rdb
dir /data/7000
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes


[root@db01 ~]# vim /data/7001/redis.conf
port 7001
daemonize yes
pidfile /data/7001/redis.pid
loglevel notice
logfile "/data/7001/redis.log"
dbfilename dump.rdb
dir /data/7001
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes


[root@db01 ~]# vim /data/7002/redis.conf
port 7002
daemonize yes
pidfile /data/7002/redis.pid
loglevel notice
logfile "/data/7002/redis.log"
dbfilename dump.rdb
dir /data/7002
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes



[root@db01 ~]# vim /data/7003/redis.conf
port 7003
daemonize yes
pidfile /data/7003/redis.pid
loglevel notice
logfile "/data/7003/redis.log"
dbfilename dump.rdb
dir /data/7003
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes



[root@db01 ~]# vim /data/7004/redis.conf
port 7004
daemonize yes
pidfile /data/7004/redis.pid
loglevel notice
logfile "/data/7004/redis.log"
dbfilename dump.rdb
dir /data/7004
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes


[root@db01 ~]# vim /data/7005/redis.conf
port 7005
daemonize yes
pidfile /data/7005/redis.pid
loglevel notice
logfile "/data/7005/redis.log"
dbfilename dump.rdb
dir /data/7005
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

#啓動節點
[root@db01 ~]# redis-server /data/7000/redis.conf 
[root@db01 ~]# redis-server /data/7001/redis.conf 
[root@db01 ~]# redis-server /data/7002/redis.conf 
[root@db01 ~]# redis-server /data/7003/redis.conf 
[root@db01 ~]# redis-server /data/7004/redis.conf 
[root@db01 ~]# redis-server /data/7005/redis.conf 

#檢查端口
[root@db01 ~]# netstat -lntup|grep 700*
tcp        0      0 0.0.0.0:17003               0.0.0.0:*                   LISTEN      7433/redis-server *
tcp        0      0 0.0.0.0:17004               0.0.0.0:*                   LISTEN      7437/redis-server *
tcp        0      0 0.0.0.0:17005               0.0.0.0:*                   LISTEN      7443/redis-server *
tcp        0      0 0.0.0.0:7000                0.0.0.0:*                   LISTEN      7423/redis-server *
tcp        0      0 0.0.0.0:7001                0.0.0.0:*                   LISTEN      7425/redis-server *
tcp        0      0 0.0.0.0:7002                0.0.0.0:*                   LISTEN      7429/redis-server *
tcp        0      0 0.0.0.0:7003                0.0.0.0:*                   LISTEN      7433/redis-server *
tcp        0      0 0.0.0.0:7004                0.0.0.0:*                   LISTEN      7437/redis-server *
tcp        0      0 0.0.0.0:7005                0.0.0.0:*                   LISTEN      7443/redis-server *
tcp        0      0 0.0.0.0:17000               0.0.0.0:*                   LISTEN      7423/redis-server *
tcp        0      0 0.0.0.0:17001               0.0.0.0:*                   LISTEN      7425/redis-server *
tcp        0      0 0.0.0.0:17002               0.0.0.0:*                   LISTEN      7429/redis-server *
tcp        0      0 :::17003                    :::*                        LISTEN      7433/redis-server *
tcp        0      0 :::17004                    :::*                        LISTEN      7437/redis-server *
tcp        0      0 :::17005                    :::*                        LISTEN      7443/redis-server *
tcp        0      0 :::7000                     :::*                        LISTEN      7423/redis-server *
tcp        0      0 :::7001                     :::*                        LISTEN      7425/redis-server *
tcp        0      0 :::7002                     :::*                        LISTEN      7429/redis-server *
tcp        0      0 :::7003                     :::*                        LISTEN      7433/redis-server *
tcp        0      0 :::7004                     :::*                        LISTEN      7437/redis-server *
tcp        0      0 :::7005                     :::*                        LISTEN      7443/redis-server *
tcp        0      0 :::17000                    :::*                        LISTEN      7423/redis-server *
tcp        0      0 :::17001                    :::*                        LISTEN      7425/redis-server *
tcp        0      0 :::17002                    :::*                        LISTEN      7429/redis-server *

#檢查進程
[root@db01 ~]# ps -ef|grep redis
root       7423      1  0 18:30 ?        00:00:00 redis-server *:7000 [cluster]
root       7425      1  0 18:30 ?        00:00:00 redis-server *:7001 [cluster]
root       7429      1  0 18:30 ?        00:00:00 redis-server *:7002 [cluster]
root       7433      1  0 18:30 ?        00:00:00 redis-server *:7003 [cluster]
root       7437      1  0 18:30 ?        00:00:00 redis-server *:7004 [cluster]
root       7443      1  0 18:30 ?        00:00:00 redis-server *:7005 [cluster]

將全部節點加入集羣

#前三個爲主節點,後三個爲從節點
[root@db01 ~]# redis-trib.rb create --replicas 1 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
#顯示信息
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
#前三個爲主節點
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
#主從關係
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
#槽位分配
M: c1838701432c77418850dcab8fbc6edd8c15c697 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: 80d141fdf0af0a90c98ab911812e810ac073940f 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: c74da3c4b8250425fa3626fd486364371188b1ee 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
S: 15bb1efcbddf404ed079651b34cc4d8a56e769e8 127.0.0.1:7003
   replicates c1838701432c77418850dcab8fbc6edd8c15c697
S: 797516c376ab94eb8211414efd5cf5e4074945d7 127.0.0.1:7004
   replicates 80d141fdf0af0a90c98ab911812e810ac073940f
S: 49de58635d02ee66ce950e44bf06d055faf44131 127.0.0.1:7005
   replicates c74da3c4b8250425fa3626fd486364371188b1ee
Can I set the above configuration? (type 'yes' to accept):yes

查看集羣狀態

#查看集羣主節點狀態
[root@db01 ~]# redis-cli -p 7000 cluster nodes |grep master
c74da3c4b8250425fa3626fd486364371188b1ee 127.0.0.1:7002 master - 0 1554633602486 3 connected 10923-16383
80d141fdf0af0a90c98ab911812e810ac073940f 127.0.0.1:7001 master - 0 1554633602990 2 connected 5461-10922
c1838701432c77418850dcab8fbc6edd8c15c697 127.0.0.1:7000 master - 0 1554633603493 1 connected 0-5460

#查看集羣從節點狀態
[root@db01 ~]# redis-cli -p 7004 cluster nodes |grep slave
15bb1efcbddf404ed079651b34cc4d8a56e769e8 127.0.0.1:7003 slave c1838701432c77418850dcab8fbc6edd8c15c697 0 1554633682768 4 connected
49de58635d02ee66ce950e44bf06d055faf44131 127.0.0.1:7005 slave c74da3c4b8250425fa3626fd486364371188b1ee 0 1554633683273 6 connected
797516c376ab94eb8211414efd5cf5e4074945d7 127.0.0.1:7004 myself,slave 80d141fdf0af0a90c98ab911812e810ac073940f 0 0 5 connected

3、Redis Cluster 集羣管理操做(核心)

1.如何添加Redis Cluster節點

在另一臺機器上,準備兩個實例,或者在本機也能夠。

#建立多實例目錄
[root@db02 ~]# mkdir -p /data/700{6,7}


#添加多實例配置文件
[root@db02 ~]# vim /data/7006/redis.conf
port 7006
daemonize yes
pidfile /data/7006/redis.pid
loglevel notice
logfile "/data/7006/redis.log"
dbfilename dump.rdb
dir /data/7006
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes


[root@db02 ~]# vim /data/7007/redis.conf
port 7007
daemonize yes
pidfile /data/7007/redis.pid
loglevel notice
logfile "/data/7007/redis.log"
dbfilename dump.rdb
dir /data/7007
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

#啓動多實例
[root@db02 ~]# redis-server /data/7006/redis.conf
[root@db02 ~]# redis-server /data/7007/redis.conf

#檢測端口
[root@db02 ~]# netstat -lntup|grep 700
tcp        0      0 0.0.0.0:17006               0.0.0.0:*                   LISTEN      4896/redis-server *
tcp        0      0 0.0.0.0:17007               0.0.0.0:*                   LISTEN      4900/redis-server *
tcp        0      0 0.0.0.0:7006                0.0.0.0:*                   LISTEN      4896/redis-server *
tcp        0      0 0.0.0.0:7007                0.0.0.0:*                   LISTEN      4900/redis-server *
tcp        0      0 :::17006                    :::*                        LISTEN      4896/redis-server *
tcp        0      0 :::17007                    :::*                        LISTEN      4900/redis-server *
tcp        0      0 :::7006                     :::*                        LISTEN      4896/redis-server *
tcp        0      0 :::7007                     :::*                        LISTEN      4900/redis-server *

#檢測進程
[root@db02 ~]# ps -ef|grep redis
root       4896      1  0 19:35 ?        00:00:00 redis-server *:7006 [cluster]
root       4900      1  0 19:35 ?        00:00:00 redis-server *:7007 [cluster]

2.添加節點

#在主節點上執行,將db02上的redis添加到7000端口所在主節點
[root@db01 ~]# redis-trib.rb add-node 172.16.1.52:7006 172.16.1.51:7000
>>> Adding node 172.16.1.52:7006 to cluster 172.16.1.51:7000
>>> Performing Cluster Check (using node 172.16.1.51:7000)
M: c1838701432c77418850dcab8fbc6edd8c15c697 172.16.1.51:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: c74da3c4b8250425fa3626fd486364371188b1ee 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 15bb1efcbddf404ed079651b34cc4d8a56e769e8 127.0.0.1:7003
   slots: (0 slots) slave
   replicates c1838701432c77418850dcab8fbc6edd8c15c697
M: 80d141fdf0af0a90c98ab911812e810ac073940f 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 797516c376ab94eb8211414efd5cf5e4074945d7 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 80d141fdf0af0a90c98ab911812e810ac073940f
S: 49de58635d02ee66ce950e44bf06d055faf44131 127.0.0.1:7005
   slots: (0 slots) slave
   replicates c74da3c4b8250425fa3626fd486364371188b1ee
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 172.16.1.52:7006 to make it join the cluster.
[OK] New node added correctly.

#查看master狀態
[root@db01 ~]# redis-cli -p 7000 cluster nodes |grep master
c74da3c4b8250425fa3626fd486364371188b1ee 127.0.0.1:7002 master - 0 1554637395372 3 connected 10923-16383
c1838701432c77418850dcab8fbc6edd8c15c697 172.16.1.51:7000 myself,master - 0 0 1 connected 0-5460
#能夠看到7006節點上並無槽位
f4e3ce12a9aa1fe741634e74b88bb8b70b414f51 172.16.1.52:7006 master - 0 1554637395476 0 connected
80d141fdf0af0a90c98ab911812e810ac073940f 127.0.0.1:7001 master - 0 1554637394866 2 connected 5461-1092

3.擴展槽位,添加主節點

#從新分片
[root@db01 ~]# redis-trib.rb reshard 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: c1838701432c77418850dcab8fbc6edd8c15c697 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: c74da3c4b8250425fa3626fd486364371188b1ee 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
M: f4e3ce12a9aa1fe741634e74b88bb8b70b414f51 172.16.1.52:7006
   slots: (0 slots) master
   0 additional replica(s)
S: 15bb1efcbddf404ed079651b34cc4d8a56e769e8 127.0.0.1:7003
   slots: (0 slots) slave
   replicates c1838701432c77418850dcab8fbc6edd8c15c697
M: 80d141fdf0af0a90c98ab911812e810ac073940f 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 797516c376ab94eb8211414efd5cf5e4074945d7 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 80d141fdf0af0a90c98ab911812e810ac073940f
S: 49de58635d02ee66ce950e44bf06d055faf44131 127.0.0.1:7005
   slots: (0 slots) slave
   replicates c74da3c4b8250425fa3626fd486364371188b1ee
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
#你想要轉移多少slot(槽位)到新節點
How many slots do you want to move (from 1 to 16384)?4096
#哪一個節點接收這些槽位?ID
What is the receiving node ID? f4e3ce12a9aa1fe741634e74b88bb8b70b414f51
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
#源節點的ID
Source node #1:all
#是否確認分片計劃
Do you want to proceed with the proposed reshard plan (yes/no)? yes

4.擴展槽位,添加從節點

#查詢主節點ID
[root@db01 ~]# redis-cli -p 7000 cluster nodes |grep master
c74da3c4b8250425fa3626fd486364371188b1ee 127.0.0.1:7002 master - 0 1554638379595 3 connected 12288-16383
c1838701432c77418850dcab8fbc6edd8c15c697 172.16.1.51:7000 myself,master - 0 0 1 connected 1365-5460
f4e3ce12a9aa1fe741634e74b88bb8b70b414f51 172.16.1.52:7006 master - 0 1554638379089 7 connected 0-1364 5461-6826 10923-12287
80d141fdf0af0a90c98ab911812e810ac073940f 127.0.0.1:7001 master - 0 1554638378584 2 connected 6827-10922

#添加從節點
[root@db01 ~]# redis-trib.rb add-node --slave --master-id f4e3ce12a9aa1fe741634e74b88bb8b70b414f51 172.16.1.52:7007 172.16.1.51:7000
>>> Adding node 172.16.1.52:7007 to cluster 172.16.1.51:7000
>>> Performing Cluster Check (using node 172.16.1.51:7000)
M: c1838701432c77418850dcab8fbc6edd8c15c697 172.16.1.51:7000
   slots:1365-5460 (4096 slots) master
   1 additional replica(s)
M: c74da3c4b8250425fa3626fd486364371188b1ee 127.0.0.1:7002
   slots:12288-16383 (4096 slots) master
   1 additional replica(s)
M: f4e3ce12a9aa1fe741634e74b88bb8b70b414f51 172.16.1.52:7006
   slots:0-1364,5461-6826,10923-12287 (4096 slots) master
   0 additional replica(s)
S: 15bb1efcbddf404ed079651b34cc4d8a56e769e8 127.0.0.1:7003
   slots: (0 slots) slave
   replicates c1838701432c77418850dcab8fbc6edd8c15c697
M: 80d141fdf0af0a90c98ab911812e810ac073940f 127.0.0.1:7001
   slots:6827-10922 (4096 slots) master
   1 additional replica(s)
S: 797516c376ab94eb8211414efd5cf5e4074945d7 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 80d141fdf0af0a90c98ab911812e810ac073940f
S: 49de58635d02ee66ce950e44bf06d055faf44131 127.0.0.1:7005
   slots: (0 slots) slave
   replicates c74da3c4b8250425fa3626fd486364371188b1ee
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 172.16.1.52:7007 to make it join the cluster.
Waiting for the cluster to join....
>>> Configure node as replica of 172.16.1.52:7006.
[OK] New node added correctly.

#查看主節點狀態
[root@db01 ~]# redis-cli -p 7000 cluster nodes |grep master
c74da3c4b8250425fa3626fd486364371188b1ee 127.0.0.1:7002 master - 0 1554638533957 3 connected 12288-16383
c1838701432c77418850dcab8fbc6edd8c15c697 172.16.1.51:7000 myself,master - 0 0 1 connected 1365-5460
f4e3ce12a9aa1fe741634e74b88bb8b70b414f51 172.16.1.52:7006 master - 0 1554638535468 7 connected 0-1364 5461-6826 10923-12287
80d141fdf0af0a90c98ab911812e810ac073940f 127.0.0.1:7001 master - 0 1554638535971 2 connected 6827-10922

#查看從節點狀態
[root@db01 ~]# redis-cli -p 7000 cluster nodes |grep slave
15bb1efcbddf404ed079651b34cc4d8a56e769e8 127.0.0.1:7003 slave c1838701432c77418850dcab8fbc6edd8c15c697 0 1554638570751 4 connected
797516c376ab94eb8211414efd5cf5e4074945d7 127.0.0.1:7004 slave 80d141fdf0af0a90c98ab911812e810ac073940f 0 1554638571257 5 connected
62952416217385e535fdceb68a9a6825c752714c 172.16.1.52:7007 slave f4e3ce12a9aa1fe741634e74b88bb8b70b414f51 0 1554638572266 7 connected
49de58635d02ee66ce950e44bf06d055faf44131 127.0.0.1:7005 slave c74da3c4b8250425fa3626fd486364371188b1ee 0 1554638572266 6 connected

5.刪除節點

#從新分片
[root@db01 ~]# redis-trib.rb reshard 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: c1838701432c77418850dcab8fbc6edd8c15c697 127.0.0.1:7000
   slots:1365-5460 (4096 slots) master
   1 additional replica(s)
M: c74da3c4b8250425fa3626fd486364371188b1ee 127.0.0.1:7002
   slots:12288-16383 (4096 slots) master
   1 additional replica(s)
M: f4e3ce12a9aa1fe741634e74b88bb8b70b414f51 172.16.1.52:7006
   slots:0-1364,5461-6826,10923-12287 (4096 slots) master
   1 additional replica(s)
S: 15bb1efcbddf404ed079651b34cc4d8a56e769e8 127.0.0.1:7003
   slots: (0 slots) slave
   replicates c1838701432c77418850dcab8fbc6edd8c15c697
M: 80d141fdf0af0a90c98ab911812e810ac073940f 127.0.0.1:7001
   slots:6827-10922 (4096 slots) master
   1 additional replica(s)
S: 797516c376ab94eb8211414efd5cf5e4074945d7 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 80d141fdf0af0a90c98ab911812e810ac073940f
S: 62952416217385e535fdceb68a9a6825c752714c 172.16.1.52:7007
   slots: (0 slots) slave
   replicates f4e3ce12a9aa1fe741634e74b88bb8b70b414f51
S: 49de58635d02ee66ce950e44bf06d055faf44131 127.0.0.1:7005
   slots: (0 slots) slave
   replicates c74da3c4b8250425fa3626fd486364371188b1ee
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
#移動多少槽位
How many slots do you want to move (from 1 to 16384)?4096
#接收槽位的節點ID
What is the receiving node ID? c1838701432c77418850dcab8fbc6edd8c15c697
#源節點的ID
Source node #1:f4e3ce12a9aa1fe741634e74b88bb8b70b414f51
#結束
Source node #2:done
#是否確認分片計劃
Do you want to proceed with the proposed reshard plan (yes/no)? yes

#查看主節點狀態獲取ID
[root@db01 ~]# redis-cli -p 7000 cluster nodes |grep master
c74da3c4b8250425fa3626fd486364371188b1ee 127.0.0.1:7002 master - 0 1554638856125 3 connected 12288-16383
c1838701432c77418850dcab8fbc6edd8c15c697 172.16.1.51:7000 myself,master - 0 0 8 connected 0-6826 10923-12287
f4e3ce12a9aa1fe741634e74b88bb8b70b414f51 172.16.1.52:7006 master - 0 1554638856632 7 connected
80d141fdf0af0a90c98ab911812e810ac073940f 127.0.0.1:7001 master - 0 1554638856632 2 connected 6827-10922

#查看從節點狀態獲取ID
[root@db01 ~]# redis-cli -p 7000 cluster nodes |grep slave
15bb1efcbddf404ed079651b34cc4d8a56e769e8 127.0.0.1:7003 slave c1838701432c77418850dcab8fbc6edd8c15c697 0 1554638997865 8 connected
797516c376ab94eb8211414efd5cf5e4074945d7 127.0.0.1:7004 slave 80d141fdf0af0a90c98ab911812e810ac073940f 0 1554638998876 5 connected
62952416217385e535fdceb68a9a6825c752714c 172.16.1.52:7007 slave c1838701432c77418850dcab8fbc6edd8c15c697 0 1554638998371 8 connected
49de58635d02ee66ce950e44bf06d055faf44131 127.0.0.1:7005 slave c74da3c4b8250425fa3626fd486364371188b1ee 0 1554638997865 6 connected

#刪除節點
[root@db01 ~]# redis-trib.rb del-node 172.16.1.52:7006 f4e3ce12a9aa1fe741634e74b88bb8b70b414f51
>>> Removing node f4e3ce12a9aa1fe741634e74b88bb8b70b414f51 from cluster 172.16.1.52:7006
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

[root@db01 ~]# redis-trib.rb del-node 172.16.1.52:7007 62952416217385e535fdceb68a9a6825c752714c
>>> Removing node 62952416217385e535fdceb68a9a6825c752714c from cluster 172.16.1.52:7007
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

#查看主節點狀態,檢查節點是否刪除
[root@db01 ~]# redis-cli -p 7000 cluster nodes |grep master
c74da3c4b8250425fa3626fd486364371188b1ee 127.0.0.1:7002 master - 0 1554639086209 3 connected 12288-16383
c1838701432c77418850dcab8fbc6edd8c15c697 172.16.1.51:7000 myself,master - 0 0 8 connected 0-6826 10923-12287
80d141fdf0af0a90c98ab911812e810ac073940f 127.0.0.1:7001 master - 0 1554639085704 2 connected 6827-10922

#查看從節點狀態,檢查節點是否刪除
[root@db01 ~]# redis-cli -p 7000 cluster nodes |grep slave
15bb1efcbddf404ed079651b34cc4d8a56e769e8 127.0.0.1:7003 slave c1838701432c77418850dcab8fbc6edd8c15c697 0 1554639091757 8 connected
797516c376ab94eb8211414efd5cf5e4074945d7 127.0.0.1:7004 slave 80d141fdf0af0a90c98ab911812e810ac073940f 0 1554639092261 5 connected
49de58635d02ee66ce950e44bf06d055faf44131 127.0.0.1:7005 slave c74da3c4b8250425fa3626fd486364371188b1ee 0 1554639091256 6 connected
相關文章
相關標籤/搜索