天天看點

Redis 叢集搭建Redis 叢集搭建前言一、部署前準備二、安裝 redis三、安裝 redis 叢集四、叢集常用指令

文章目錄

  • Redis 叢集搭建
  • 前言
  • 一、部署前準備
    • 1、虛拟機準備
    • 2、配置虛拟機防火牆
  • 二、安裝 redis
    • 1、下載下傳源碼并解壓
    • 2、編譯安裝
    • 3、配置 redis
    • 4、啟動 redis
    • 5、用戶端指令連接配接測試
  • 三、安裝 redis 叢集
    • 1、哈希槽的概念
    • 2、叢集環境準備
    • 3、叢集安裝
      • 3.1 叢集配置參數
      • 3.2 第一步
      • 2.3 第二步
    • 4、啟動叢集
  • 四、叢集常用指令
    • 1、檢視叢集資訊
    • 2、重新配置設定槽位
    • 3、檢視槽位配置設定情況
    • 4、檢視叢集狀态
    • 5、其它指令

Redis 叢集搭建

前言

百度了很多文章,大概都是在本機上跑一台虛機,然後将所有的redis叢集的6個節點(最小叢集)都安裝在這台虛機上,而實際在真實的應用場景中,可能會分别在6台機器上安裝,經過實踐,發現在在6台機器上安裝會出現一些異想不到的問題。

本文以3台虛機安裝redis最小叢集(6個節點)。

一、部署前準備

1、虛拟機準備

本例中相關參數說明:

實體主機IP:192.168.168.156,作業系統:Windows7

虛拟機與實體主機的網橋位址:192.168.56.1

3台虛拟機IP分别是:192.168.56.11、192.168.56.12、192.168.56.13,作業系統:CentOS7.5

保證3台虛拟機之間網絡通暢,可以互ping,同時3台虛拟機也可以與網橋 192.168.56.1、實體主機 192.168.168.156 互ping。

2、配置虛拟機防火牆

為了保證 redis 啟動後服務能被正常通路以及 redis 叢集之間互相通信,需要放開 6379 和 16379 端口,在CentOS7下使用如下指令,在public區域放開 6379、16379、6380、16380 端口,允許外部通路,将 3 台虛拟機均按如下操作放開端口:

firewall-cmd --zone=public --add-port=6379/tcp --permanent  #(--permanent永久生效,沒有此參數重新開機後失效)
firewall-cmd --zone=public --add-port=16379/tcp --permanent
firewall-cmd --zone=public --add-port=6380/tcp --permanent
firewall-cmd --zone=public --add-port=16380/tcp --permanent
firewall-cmd --reload
           

是否成功放開此端口,在主控端上使用如下指令測試,如果輸出結果為yes,說明防火牆配置成功

firewall-cmd --zone=public --query-port=6379/tcp
firewall-cmd --zone=public --query-port=16379/tcp
firewall-cmd --zone=public --query-port=6380/tcp
firewall-cmd --zone=public --query-port=16380/tcp
           

二、安裝 redis

1、下載下傳源碼并解壓

從 redis 官網 得知,隻能下載下傳源碼編譯後安裝,此處使用官網截止 2019-10-15 前的最新穩定版本 redis-5.0.5.tar.gz,在第1台虛拟機(192.168.56.11)的 /home/system/soft 目錄中進行下載下傳并解壓:

[[email protected] soft]$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz
--2019-10-22 15:13:24--  http://download.redis.io/releases/redis-5.0.5.tar.gz
正在解析主機 download.redis.io (download.redis.io)... 109.74.203.151
正在連接配接 download.redis.io (download.redis.io)|109.74.203.151|:80... 已連接配接。
已發出 HTTP 請求,正在等待回應... 200 OK
長度:1975750 (1.9M) [application/x-gzip]
正在儲存至: “redis-5.0.5.tar.gz.1”

100%[==================================================================================================================================>] 1,975,750   21.4KB/s 用時 77s    

2019-10-22 15:14:43 (25.0 KB/s) - 已儲存 “redis-5.0.5.tar.gz.1” [1975750/1975750])
[[email protected] soft]# tar -zxvf redis-5.0.5.tar.gz 
[[email protected] soft]# ll
總用量 847584
drwxrwxr-x. 6 system dev      4096 5月  16 00:07 redis-5.0.5
-rw-r--r--. 1 system dev   1975750 5月  16 00:26 redis-5.0.5.tar.gz
           

2、編譯安裝

如果在編譯中出現錯誤,使用

yum install gcc,tcl

安裝 gcc、tcl 編譯環境。

[[email protected] soft]# cd redis-5.0.5/
[[email protected] redis-5.0.5]# make MALLOC=libc                      # 等待 make 結束
[[email protected] redis-5.0.5]# make install PREFIX=/usr/local/redis  # 将 redis 安裝到 /usr/local/redis 目錄 
           

3、配置 redis

将 redis 配置為背景運作,修改 redis.conf 中的 deamonize=yes,操作如下:

[[email protected] soft]# cd /usr/local/redis                              # 進入安裝目錄檢視
[[email protected] redis]# ll
總用量 0
drwxr-xr-x. 2 root root 168 10月 18 13:11 bin
[[email protected] redis]# cd bin                                          # 進入 bin 目錄 
[[email protected] bin]# cp /home/system/soft/redis-5.0.5/redis.conf .     # 複制源碼目錄中的 redis.conf 到 bin 目錄
[[email protected] bin]# ll
總用量 32804
-rw-r--r--. 1 root root     112 10月 18 13:09 dump.rdb
-rwxr-xr-x. 1 root root 4366616 10月 17 17:42 redis-benchmark
-rwxr-xr-x. 1 root root 8111824 10月 17 17:42 redis-check-aof
-rwxr-xr-x. 1 root root 8111824 10月 17 17:42 redis-check-rdb
-rwxr-xr-x. 1 root root 4806856 10月 17 17:42 redis-cli
-rw-r--r--. 1 root root   61798 10月 17 18:39 redis.conf                 # redis 配置檔案 
lrwxrwxrwx. 1 root root      12 10月 17 17:42 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 8111824 10月 17 17:42 redis-server
[[email protected] bin]# vim redis.conf                                     # 修改 daemonize 為 yes
           

4、啟動 redis

使用指定配置檔案啟動 redis,并以背景程序模式運作。

[[email protected] bin]# ./redis-server /usr/local/redis/bin/redis.conf 
17235:C 22 Oct 2019 17:02:36.771 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
17235:C 22 Oct 2019 17:02:36.771 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=17235, just started
17235:C 22 Oct 2019 17:02:36.771 # Configuration loaded
[[email protected] bin]# netstat -ntlp | grep 6379
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      17236/./redis-serve 
           

5、用戶端指令連接配接測試

使用 redis-cli 指令連接配接測試。

[[email protected] bin]# ./redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> ping
PONG
[[email protected] bin]# 
           

三、安裝 redis 叢集

1、哈希槽的概念

​ redis 叢集中内置了 16384 個哈希槽,當需要在 Redis 叢集中放置一個 key-value 時,redis 先對 key 使用 crc16 算法算出一個結果,然後把結果對 16384 求餘數, 這樣每個 key 都會對應一個編号在 0-16383 之間的哈希槽,redis 會根據節點數量大緻均等的将哈希槽映射到不同的節點。

​ redis 叢集沒有使用一緻性hash,而是引入了哈希槽的概念。

​ redis 叢集有16384個哈希槽,每個 key 通過CRC16校驗後對16384取模來決定放置哪個槽.叢集的每個節點負責一部分hash槽。這種結構很容易添加或者删除節點,并且無論是添加删除或者修改某一個節點,都不會造成叢集不可用的狀态。

​ 使用哈希槽的好處就在于可以友善的添加或移除節點。當需要增加節點時,隻需要把其他節點的某些哈希槽挪到新節點就可以了; 當需要移除節點時,隻需要把移除節點上的哈希槽挪到其他節點就行了; 這樣以後新增或移除節點的時候不用先停掉所有的 redis 服務而繼續運作。

2、叢集環境準備

redis 叢集至少需要 3 個節點,因為投票容錯機制要求超過半數節點認為某個節點挂了該節點才是挂了,是以 2 個節點無法構成叢集。要保證叢集的高可用,需要每個節點都有從節點,也就是備份節點,是以redis 叢集至少需要 6 台伺服器。結合本文最開始配置的 3 台虛拟機,每台虛拟機上運作 1 主 1 備 redis 節點。

3、叢集安裝

在前面安裝好單台 redis 的基礎上,開始安裝 redis 叢集。

3.1 叢集配置參數

  • cluster-enabled <yes/no>:如果是yes,表示啟用叢集,否則以單例模式啟動
  • cluster-config-file : 可選,這不是一個使用者可編輯的配置檔案,這個檔案是Redis叢集節點自動持久化每次配置的改變,為了在啟動的時候重新讀取它。
  • cluster-node-timeout :逾時時間,叢集節點不可用的最大時間。如果一個master節點不可到達超過了指定時間,則認為它失敗了。注意,每一個在指定時間内不能到達大多數master節點的節點将停止接受查詢請求。
  • cluster-slave-validity-factor :如果設定為0,則一個slave将總是嘗試故障轉移一個master。如果設定為一個正數,那麼最大失去連接配接的時間是node timeout乘以這個factor。
  • cluster-migration-barrier :一個master和slave保持連接配接的最小數量(即:最少與多少個slave保持連接配接),也就是說至少與其它多少slave保持連接配接的slave才有資格成為master。
  • cluster-require-full-coverage <yes/no>:如果設定為yes,這也是預設值,如果key space沒有達到百分之多少時停止接受寫請求。如果設定為no,将仍然接受查詢請求,即使它隻是請求部分key。

3.2 第一步

在第1台虛拟機 192.168.56.11 上安裝 1 主 1 備 redis 服務。

  • /usr/local 目錄下建立 redis-cluster 目錄
  • 分别複制 /usr/local/redis/bin 到 /usr/local/redis-cluster/redis-6379、/usr/local/redis-cluster/redis-6380
  • 修改 /usr/local/redis-cluster/redis-6379/redis.conf 配置檔案中的端口為 6379,修改 /usr/local/redis-cluster/redis-6380/redis.conf 配置檔案中的端口為 6380
  • 分别啟動 /usr/local/redis-cluster/redis-6379、/usr/local/redis-cluster/redis-6380 兩個服務,并檢查 6379、6380、16379、16380 端口是否啟動 (說明:開啟叢集後,6379為用戶端提供服務端口;16379為叢集節點通路群集總線端口 ,即二進制協定的節點到節點通信通道,節點使用群集總線進行故障檢測,配置更新,故障轉移授權等)
[[email protected] local]# mkdir redis-cluster
[[email protected] local]# cd redis-cluster
[[email protected] redis-cluster]# cp /usr/local/redis/bin /usr/local/redis-cluster/redis-6379
[[email protected] redis-cluster]# cp /usr/local/redis/bin /usr/local/redis-cluster/redis-6380
           

修改 redis.conf 配置檔案,增加叢集配置資訊。

# 修改端口号,并啟用叢集模式
[[email protected] redis-cluster]# vi redis-6379/redis.conf                                      # 修改 port=6379,cluster-enabled=yes
daemonize yes
bind 192.168.56.11
port 6379
pidfile /var/run/redis-cluster/redis-6379.pid

cluster-enabled yes
cluster-config-file node-6380.conf
cluster-node-timeout 5000
           
[[email protected] redis-cluster]# vi redis-6380/redis.conf                                      # 修改 port=6380,cluster-enabled=yes
daemonize yes
bind 192.168.56.11
port 6380
pidfile /var/run/redis-cluster/redis-6380.pid

cluster-enabled yes
cluster-config-file node-6380.conf
cluster-node-timeout 5000
           

分别啟動并驗證 6379、6380 兩個服務。

# 啟動 redis-6379
[[email protected] redis-cluster]# cd redis-6379/
[[email protected] redis-6379]# ./redis-server redis.conf
3191:C 22 Oct 2019 18:29:23.847 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3191:C 22 Oct 2019 18:29:23.847 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=3191, just started
3191:C 22 Oct 2019 18:29:23.847 # Configuration loaded
# 啟動 redis-6380
[[email protected] redis-6379]# cd ../redis-6380
[[email protected] redis-6380]# ./redis-server redis.conf
3587:C 22 Oct 2019 18:29:56.101 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3587:C 22 Oct 2019 18:29:56.101 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=3587, just started
3587:C 22 Oct 2019 18:29:56.101 # Configuration loaded
# 檢查端口是否啟動
[[email protected] redis-cluster]# netstat -ntlp | grep -E "6379|6380"
tcp        0      0 192.168.56.11:6379      0.0.0.0:*               LISTEN      3192/./redis-server 
tcp        0      0 192.168.56.11:6380      0.0.0.0:*               LISTEN      3588/./redis-server 
tcp        0      0 192.168.56.11:16379     0.0.0.0:*               LISTEN      3192/./redis-server 
tcp        0      0 192.168.56.11:16380     0.0.0.0:*               LISTEN      3588/./redis-server 
           

2.3 第二步

同樣的方法,将第 2 台、第 3 台虛拟機安裝 1 主 1 備 redis 服務,此處為了友善,直接使用 scp 指令從第 1 台虛拟機

192.168.56.11

上将

redis-cluster

複制過來并啟動

redis-6379、redis-6380

# 從第 1 台虛拟機複制 redis-cluster 目錄
[[email protected] local]# scp -r [email protected]:/usr/local/redis-cluster/ .
[[email protected] local]# cd redis-cluster
[[email protected] redis-cluster]# ll
總用量 0
drwxr-xr-x. 2 root root 212 10月 18 14:58 redis-6379
drwxr-xr-x. 2 root root 212 10月 18 14:58 redis-6380
# 啟動 redis-6379
[[email protected] redis-cluster]# cd redis-6379/
[[email protected] redis-6379]# ./redis-server redis.conf
3191:C 22 Oct 2019 18:29:23.847 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3191:C 22 Oct 2019 18:29:23.847 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=3191, just started
3191:C 22 Oct 2019 18:29:23.847 # Configuration loaded
# 啟動 redis-6380
[[email protected] redis-6379]# cd ../redis-6380
[[email protected] redis-6380]# ./redis-server redis.conf
3587:C 22 Oct 2019 18:29:56.101 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3587:C 22 Oct 2019 18:29:56.101 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=3587, just started
3587:C 22 Oct 2019 18:29:56.101 # Configuration loaded
# 檢查端口是否啟動
[[email protected] redis-cluster]# netstat -ntlp | grep -E "6379|6380"
tcp        0      0 192.168.56.12:6379      0.0.0.0:*               LISTEN      3192/./redis-server 
tcp        0      0 192.168.56.12:6380      0.0.0.0:*               LISTEN      3588/./redis-server 
tcp        0      0 192.168.56.12:16379     0.0.0.0:*               LISTEN      3192/./redis-server 
tcp        0      0 192.168.56.12:16380     0.0.0.0:*               LISTEN      3588/./redis-server 
           

第 3 台虛拟機安裝方式同上,此處不再贅述。

4、啟動叢集

在第 1 台虛拟機上 redis-6379 目錄中使用如下指令啟動叢集

# 基于工程自動建構鏡像
[[email protected] redis-6379]# ./redis-cli --cluster create 192.168.56.11:6379 192.168.56.11:6380 192.168.56.12:6379 192.168.56.12:6380 192.168.56.13:6379 192.168.56.13:6380 --cluster-replicas 1
           

如果出現如下錯誤,說明 redis 執行個體上的資料不為空,需要删除 node-xxxx.conf 檔案并使用 redis-cli 逐個連接配接 6 個 redis 執行個體,執行 flushdb 清空資料。

[ERR] Node 192.168.56.11:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
           

删除 node-6379.conf、node-6380.conf 檔案,并清空第 1 台虛拟上 6379、6380 上 redis 執行個體的資料。

# 删除 node-6379.conf 檔案
[[email protected] redis-6379]# rm node-6379.conf
rm:是否删除普通檔案 "node-6379.conf"?y
# 清空 redis-6379 資料
[[email protected] redis-6379]# ./redis-cli -h 192.168.56.11 -p 6379
192.168.56.11:6379> flushdb
OK
192.168.56.11:6379> exit

# 删除 node-6380.conf 檔案
[[email protected] redis-6380]# rm node-6380.conf
rm:是否删除普通檔案 "node-6380.conf"?y
# 清空 redis-6380 資料
[[email protected] redis-6380]# ./redis-cli -h 192.168.56.11 -p 6380
192.168.56.11:6380> flushdb
OK
192.168.56.11:6380> exit
           

依次對第 2 台、第 3 台虛拟機進行同樣操作,完成後,再次啟動叢集。

[[email protected] redis-6379]# ./redis-cli --cluster create 192.168.56.11:6379 192.168.56.11:6380 192.168.56.12:6379 192.168.56.12:6380 192.168.56.13:6379 192.168.56.13:6380 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.56.12:6380 to 192.168.56.11:6379
Adding replica 192.168.56.13:6380 to 192.168.56.12:6379
Adding replica 192.168.56.11:6380 to 192.168.56.13:6379
M: 3ada712db1d5487e6ed8e468a73c225ec7024609 192.168.56.11:6379
   slots:[0-5460] (5461 slots) master
S: 6d97248d7624b9380b34156dc864eaa8203438a6 192.168.56.11:6380
   replicates b686b70f648f0f3c7b6a5f52f6047aef51160943
M: 039436617b5cf1b342bb6f81ee52d8dbf41130a6 192.168.56.12:6379
   slots:[5461-10922] (5462 slots) master
S: 32dd53593ffe47bec3399a6e7f3933c233bed40f 192.168.56.12:6380
   replicates 3ada712db1d5487e6ed8e468a73c225ec7024609
M: b686b70f648f0f3c7b6a5f52f6047aef51160943 192.168.56.13:6379
   slots:[10923-16383] (5461 slots) master
S: 006eab9f0d62de4370ff30f5abc3345af0f2829a 192.168.56.13:6380
   replicates 039436617b5cf1b342bb6f81ee52d8dbf41130a6
Can I set the above configuration? (type 'yes' to accept): 
           

可以看到,192.168.56.11:6379、192.168.56.12:6379、192.168.56.13:6379 分别為第 1、2、3 個 master 節點

192.168.56.12:6380 為 192.168.56.11:6379 的 slave 節點,192.168.56.13:6380 為 192.168.56.12:6379 的 slave 節點,192.168.56.11:6380 為 192.168.56.13:6379 的 slave 節點

0-5460 個哈希槽配置設定給了第 1 個主從節點,5461-10922 個哈希槽配置設定給了第 2 個主從節點,10923-16381 個哈希槽配置設定給了第 3 個主從節點

最後一句

Can I set the above configuration? (type 'yes' to accept):

意思是是否能看見上述配置設定的配置資訊,輸入

yes

後會開始等待所有剩下節點加入叢集

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
....
           

**(重要):**如果此處一直處于等待中,說明剩下的節點未被發現或通知到加入叢集,需要使用

redis-cli

分别登入各節點,并輸入

cluster meet 192.168.56.11:6379

# 登入第 1 台虛拟機 192.168.56.11:6380
[[email protected] redis-6379]# ./redis-cli -h 192.168.56.11 -p 6380
192.168.56.11:6380> cluster meet 192.168.56.11:6379
OK
192.168.56.11:6379> exit
[[email protected] redis-6379]#
# 依次登入剩下所有節點,并輸入此資訊
           

傳回叢集啟動視窗,會發現所有節點已成功發現并加入叢集了

[[email protected] redis-6379]# ./redis-cli --cluster create 192.168.56.11:6379 192.168.56.11:6380 192.168.56.12:6379 192.168.56.12:6380 192.168.56.13:6379 192.168.56.13:6380 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.56.12:6380 to 192.168.56.11:6379
Adding replica 192.168.56.13:6380 to 192.168.56.12:6379
Adding replica 192.168.56.11:6380 to 192.168.56.13:6379
M: 3ada712db1d5487e6ed8e468a73c225ec7024609 192.168.56.11:6379
   slots:[0-5460] (5461 slots) master
S: 6d97248d7624b9380b34156dc864eaa8203438a6 192.168.56.11:6380
   replicates b686b70f648f0f3c7b6a5f52f6047aef51160943
M: 039436617b5cf1b342bb6f81ee52d8dbf41130a6 192.168.56.12:6379
   slots:[5461-10922] (5462 slots) master
S: 32dd53593ffe47bec3399a6e7f3933c233bed40f 192.168.56.12:6380
   replicates 3ada712db1d5487e6ed8e468a73c225ec7024609
M: b686b70f648f0f3c7b6a5f52f6047aef51160943 192.168.56.13:6379
   slots:[10923-16383] (5461 slots) master
S: 006eab9f0d62de4370ff30f5abc3345af0f2829a 192.168.56.13:6380
   replicates 039436617b5cf1b342bb6f81ee52d8dbf41130a6
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.56.11:6379)
M: 3ada712db1d5487e6ed8e468a73c225ec7024609 192.168.56.11:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: b686b70f648f0f3c7b6a5f52f6047aef51160943 192.168.56.13:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 006eab9f0d62de4370ff30f5abc3345af0f2829a 192.168.56.13:6380
   slots: (0 slots) slave
   replicates 039436617b5cf1b342bb6f81ee52d8dbf41130a6
S: 32dd53593ffe47bec3399a6e7f3933c233bed40f 192.168.56.12:6380
   slots: (0 slots) slave
   replicates 3ada712db1d5487e6ed8e468a73c225ec7024609
M: 039436617b5cf1b342bb6f81ee52d8dbf41130a6 192.168.56.12:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 6d97248d7624b9380b34156dc864eaa8203438a6 192.168.56.11:6380
   slots: (0 slots) slave
   replicates b686b70f648f0f3c7b6a5f52f6047aef51160943
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[[email protected] redis-6379]# 
           

四、叢集常用指令

1、檢視叢集資訊

使用指令

redis-cli -c -h ip -p port

連接配接到叢集,并使用

cluster info

檢視叢集資訊,**注意:**此處的參數多了

-c

表示連接配接到 cluster。

[[email protected] redis-6379]# ./redis-cli -c -h 192.168.56.11 -p 6379
192.168.56.11:6379> 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_ping_sent:3868
cluster_stats_messages_pong_sent:3916
cluster_stats_messages_sent:7784
cluster_stats_messages_ping_received:3911
cluster_stats_messages_pong_received:3868
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:7784
           

可以看到

cluster_state:ok

叢集狀态正常,成功配置設定了 16384 個槽位

cluster_slots_ok:16384

,叢集大小為 3

cluster_size:3

[[email protected] redis-6379]# ./redis-cli -c -h 192.168.56.11 -p 6379
192.168.56.11:6379> cluster nodes
b686b70f648f0f3c7b6a5f52f6047aef51160943 192.168.56.13:[email protected] master - 0 1571815929000 5 connected 10923-16383
006eab9f0d62de4370ff30f5abc3345af0f2829a 192.168.56.13:[email protected] slave 039436617b5cf1b342bb6f81ee52d8dbf41130a6 0 1571815928599 6 connected
32dd53593ffe47bec3399a6e7f3933c233bed40f 192.168.56.12:[email protected] slave 3ada712db1d5487e6ed8e468a73c225ec7024609 0 1571815930219 4 connected
039436617b5cf1b342bb6f81ee52d8dbf41130a6 192.168.56.12:[email protected] master - 0 1571815930510 3 connected 5461-10922
6d97248d7624b9380b34156dc864eaa8203438a6 192.168.56.11:[email protected] slave b686b70f648f0f3c7b6a5f52f6047aef51160943 0 1571815929202 5 connected
3ada712db1d5487e6ed8e468a73c225ec7024609 192.168.56.11:[email protected] myself,master - 0 1571815930000 1 connected 0-5460
           

可以看到 3 個 master,3 個 slave 節點以及相應的槽位配置設定 。

2、重新配置設定槽位

如果執行

redis-cli --cluster create ip:port --cluster-replicas 1

成功建立cluster,但輸出如下錯誤資訊,意思是不是所有的 slot 都被節點覆寫到,官方的建議是使用fix修複。

redis-cli --cluster fix
           

3、檢視槽位配置設定情況

可以使用如下指令檢查叢集狀态 slots 詳細配置設定 。

redis-cli --cluster check host:port
           

例如:檢查 192.168.56.11:6379 的槽位配置設定情況

[[email protected] redis-6379]# ./redis-cli --cluster check 192.168.56.11:6379
192.168.56.11:6379 (3ada712d...) -> 0 keys | 5461 slots | 1 slaves.
192.168.56.13:6379 (b686b70f...) -> 0 keys | 5461 slots | 1 slaves.
192.168.56.12:6379 (03943661...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.56.11:6379)
M: 3ada712db1d5487e6ed8e468a73c225ec7024609 192.168.56.11:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: b686b70f648f0f3c7b6a5f52f6047aef51160943 192.168.56.13:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 006eab9f0d62de4370ff30f5abc3345af0f2829a 192.168.56.13:6380
   slots: (0 slots) slave
   replicates 039436617b5cf1b342bb6f81ee52d8dbf41130a6
S: 32dd53593ffe47bec3399a6e7f3933c233bed40f 192.168.56.12:6380
   slots: (0 slots) slave
   replicates 3ada712db1d5487e6ed8e468a73c225ec7024609
M: 039436617b5cf1b342bb6f81ee52d8dbf41130a6 192.168.56.12:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 6d97248d7624b9380b34156dc864eaa8203438a6 192.168.56.11:6380
   slots: (0 slots) slave
   replicates b686b70f648f0f3c7b6a5f52f6047aef51160943
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
           

4、檢視叢集狀态

執行

redis-cli --cluster info ip:port

檢查叢集狀态。

[[email protected] redis-6379]# ./redis-cli --cluster info 192.168.56.11:6379
192.168.56.11:6379 (3ada712d...) -> 0 keys | 5461 slots | 1 slaves.
192.168.56.13:6379 (b686b70f...) -> 0 keys | 5461 slots | 1 slaves.
192.168.56.12:6379 (03943661...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
           

5、其它指令

Cluster Manager Commands:
  create         host1:port1 ... hostN:portN
                 --cluster-replicas <arg>
  check          host:port
  info           host:port
  fix            host:port
  reshard        host:port
                 --cluster-from <arg>
                 --cluster-to <arg>
                 --cluster-slots <arg>
                 --cluster-yes
                 --cluster-timeout <arg>
                 --cluster-pipeline <arg>
  rebalance      host:port
                 --cluster-weight <node1=w1...nodeN=wN>
                 --cluster-use-empty-masters
                 --cluster-timeout <arg>
                 --cluster-simulate
                 --cluster-pipeline <arg>
                 --cluster-threshold <arg>
  add-node       new_host:new_port existing_host:existing_port
                 --cluster-slave
                 --cluster-master-id <arg>
  del-node       host:port node_id
  call           host:port command arg arg .. arg
  set-timeout    host:port milliseconds
  import         host:port
                 --cluster-from <arg>
                 --cluster-copy
                 --cluster-replace
  help           
           

add-node 方法可以添加節點,還可以指定是主節點還是從節點。del-node 是删除指定節點。還有其它的 fix 修複指令,reshard 重新配置設定slot等等。

繼續閱讀