天天看點

redis(4) -- 叢集1. redis叢集搭建2. 測試:

本章主要講redis的叢集搭建.

redis叢集的可擴充性(scalability是線性的, 即增加節點會帶來實際的效果提示. 叢集節點間使用異步備援備份,是以安全些.

redis叢集主要提供一定程度的穩定性(單從性能講的話,并不如單機的,叢集都是這樣的,是以算不上是redis叢集的缺點), 當某部分節點宕掉時,叢集也是可用的.

因為資料是分開存儲的,即使丢了,也隻丢一部分. 互為主從的宕掉部分節點也不會丢資料,而且你還要做備份的嘛. 其實緩存資料庫,更應該關注的是性能.

1. redis叢集搭建

如果你沒得這麼多虛拟機的話, 就用僞叢集就是(所有節點都在一台伺服器上, 用不同的端口和工作目錄區分)

配置環境我就不講了,可以去看https://cloud.tencent.com/developer/article/1757503

環境說明:

節點 1 : 192.168.1.31

節點 2 : 192.168.1.32

節點 4 : 192.168.1.33

每個節點2個執行個體(端口分别為: 6379 6380), 互為主從.

1.1 編譯并安裝redis

隻需要編譯一次即可,然後把編譯好的軟體拷貝到其它伺服器上安裝(如果環境不同的話,才需要重新編譯的)

本次安裝我們就使用install 指令就行了(make install也可以.但是install可以定制我們要的檔案).

第一個節點操作如下:

wget https://download.redis.io/releases/redis-5.0.10.tar.gz  #下載下傳
tar -xvf redis-5.0.10.tar.gz  #解壓
cd redis-5.0.10  #切換目錄
make MALLOC=libc  #編譯
mkdir -p /usr/local/redis-cluster/bin  #建立redis叢集目錄
install ./src/{redis-benchmark,redis-check-aof,redis-check-rdb,redis-cli,redis-sentinel,redis-server} /usr/local/redis-cluster/bin/
cp -ra redis.conf /usr/local/redis-cluster/redis-cluster-6379.conf #拷貝配置檔案執行個體1
cp -ra redis.conf /usr/local/redis-cluster/redis-cluster-6380.conf #拷貝配置檔案執行個體2
cd /usr/local/redis-cluster/
mkdir -p /usr/local/redis-cluster/data 
mkdir -p /usr/local/redis-cluster/log           

複制

然後修改配置檔案/usr/local/redis-cluster/redis-cluster-6379.conf如下内容

另一個的執行個體配置也是一樣的,隻需改下端口和檔案名即可

#以守護程序方式運作(也就是放背景)
daemonize yes 

#快照路徑
dir /usr/local/redis-cluster/data  

#redis的密碼. 建立叢集的時候,就不要這個參數,建立完了,再設定就是(節點間密碼要一緻)
#requirepass 123456 

#主節點的密碼.
#masterauth 123456

#關閉保護模式
protected-mode no

#設定pid檔案,注意要有權限哦,不然起不來
pidfile /var/run/redis-cluster-6379.pid 
#日志路徑
logfile /usr/local/redis-cluster/log/redis-cluster-6379.log 

#監聽的位址, 最好是寫本機的具體IP, 我這裡偷懶,就全部監聽了
bind 0.0.0.0 
#redis的端口,6379是預設的,建議換掉
port 6379 

#開啟AOF持久化
appendonly yes
#AOF檔案名,相對路徑就是dir路徑下
appendfilename "appendonly-6379.aof" 

#rdb備份政策
save 900 1
save 300 10
save 60 10000

#rdb備份的檔案名
dbfilename dump-6379.rdb

#以下為叢集的配置
#啟用叢集,預設是注釋掉的
cluster-enabled yes
#叢集的配置檔案,記錄叢集資訊的檔案
cluster-config-file node-6379.conf
#節點逾時時間(機關: 毫秒)
cluster-node-timeout 15000           

複制

完成後,你會得到如下目錄結構

[root@ddcw31 redis-cluster]# tree 
.
├── bin
│   ├── redis-benchmark
│   ├── redis-check-aof
│   ├── redis-check-rdb
│   ├── redis-cli
│   ├── redis-sentinel
│   └── redis-server
├── data
├── log
├── redis-cluster-6379.conf
└── redis-cluster-6380.conf

3 directories, 8 files
[root@ddcw31 redis-cluster]#           

複制

1.2 拷貝叢集到其它節點并修改配置(我IP是寫的0.0.0 是以啥都不用改.)

在第一節點執行如下指令(沒配置密鑰的話,就得輸密碼哈)

cd /usr/local/
tar -cvf /tmp/redis-cluster-5.0.10.tar.gz redis-cluster
scp /tmp/redis-cluster-5.0.10.tar.gz 192.168.1.32:/tmp/
scp /tmp/redis-cluster-5.0.10.tar.gz 192.168.1.33:/tmp/
ssh 192.168.1.32 -C "tar -xvf /tmp/redis-cluster-5.0.10.tar.gz -C /usr/local"
ssh 192.168.1.33 -C "tar -xvf /tmp/redis-cluster-5.0.10.tar.gz -C /usr/local"           

複制

1.3 啟動所有節點執行個體并建立叢集

再第一節點執行如下指令啟動所有執行個體(就是啟動的時候指定配置檔案)

/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/redis-cluster-6379.conf  #啟動第一個執行個體
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/redis-cluster-6380.conf  #啟動第二個執行個體

#啟動第二個節點的2個執行個體
ssh 192.168.1.32 -C "/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/redis-cluster-6379.conf"
ssh 192.168.1.32 -C "/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/redis-cluster-6380.conf"

#啟動第三個節點的2個執行個體
ssh 192.168.1.33 -C "/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/redis-cluster-6379.conf"
ssh 192.168.1.33 -C "/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/redis-cluster-6380.conf"           

複制

檢視執行個體啟動成功後即可建立叢集

建立叢集:

官方給的例子是用ruby腳本./src/redis-trib.rb建立,但是太麻煩,還得安裝ruby環境.

redis在5.0之後支援redis-cli建立叢集, 本文就用redis-cli來建立叢集

檢視幫助,找到建立叢集的格式為 redis-cli --cluster create host1:port1 ... hostN:portN --cluster-replicas <arg>

--cluster-replicas 1 的意思是 每個主節點有1個從節點(要多個從節點的話,就得增加相應的執行個體/節點)

[root@ddcw31 redis-cluster]# /usr/local/redis-cluster/bin/redis-cli --cluster help
Cluster Manager Commands:
  create         host1:port1 ... hostN:portN
                 --cluster-replicas <arg>
  check          host:port
                 --cluster-search-multiple-owners
  info           host:port
  fix            host:port
                 --cluster-search-multiple-owners
  reshard        host:port
                 --cluster-from <arg>
                 --cluster-to <arg>
                 --cluster-slots <arg>
                 --cluster-yes
                 --cluster-timeout <arg>
                 --cluster-pipeline <arg>
                 --cluster-replace
  rebalance      host:port
                 --cluster-weight <node1=w1...nodeN=wN>
                 --cluster-use-empty-masters
                 --cluster-timeout <arg>
                 --cluster-simulate
                 --cluster-pipeline <arg>
                 --cluster-threshold <arg>
                 --cluster-replace
  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           

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

[root@ddcw31 redis-cluster]#           

複制

是以我們的環境執行如下指令即可建立叢集:

/usr/local/redis-cluster/bin/redis-cli --cluster create \
192.168.1.31:6379 192.168.1.31:6380 \
192.168.1.32:6379 192.168.1.32:6380 \
192.168.1.33:6379 192.168.1.33:6380 \
--cluster-replicas 1           

複制

過程如下,中間确定,輸入yes即可

[root@ddcw31 redis-cluster]# /usr/local/redis-cluster/bin/redis-cli --cluster create \
> 192.168.1.31:6379 192.168.1.31:6380 \
> 192.168.1.32:6379 192.168.1.32:6380 \
> 192.168.1.33:6379 192.168.1.33: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.1.32:6380 to 192.168.1.31:6379
Adding replica 192.168.1.33:6380 to 192.168.1.32:6379
Adding replica 192.168.1.31:6380 to 192.168.1.33:6379
M: 169b0df771d45f27383add0304df59d2fbae6c62 192.168.1.31:6379
   slots:[0-5460] (5461 slots) maste
S: 60bee426b74f78863ebde556ccdf3be318076e2a 192.168.1.31:6380
   replicates 61a3730c0bc4f8dd0adc6cb8361468b111ae107f
M: 4b277b33572bfdfdae734da9a006ff5d7ee05d46 192.168.1.32:6379
   slots:[5461-10922] (5462 slots) maste
S: 6c41bb62bc3857d2c9549873d79f00f4a34475d2 192.168.1.32:6380
   replicates 169b0df771d45f27383add0304df59d2fbae6c62
M: 61a3730c0bc4f8dd0adc6cb8361468b111ae107f 192.168.1.33:6379
   slots:[10923-16383] (5461 slots) maste
S: fc5978c802368c699e57405d3c1ba867bc5fe312 192.168.1.33:6380
   replicates 4b277b33572bfdfdae734da9a006ff5d7ee05d46
Can I set the above configuration? (type 'yes' to accept): yes   #這裡手動輸入yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluste
Waiting for the cluster to join
..
>>> Performing Cluster Check (using node 192.168.1.31:6379)
M: 169b0df771d45f27383add0304df59d2fbae6c62 192.168.1.31:6379
   slots:[0-5460] (5461 slots) maste
   1 additional replica(s)
M: 4b277b33572bfdfdae734da9a006ff5d7ee05d46 192.168.1.32:6379
   slots:[5461-10922] (5462 slots) maste
   1 additional replica(s)
S: fc5978c802368c699e57405d3c1ba867bc5fe312 192.168.1.33:6380
   slots: (0 slots) slave
   replicates 4b277b33572bfdfdae734da9a006ff5d7ee05d46
S: 6c41bb62bc3857d2c9549873d79f00f4a34475d2 192.168.1.32:6380
   slots: (0 slots) slave
   replicates 169b0df771d45f27383add0304df59d2fbae6c62
M: 61a3730c0bc4f8dd0adc6cb8361468b111ae107f 192.168.1.33:6379
   slots:[10923-16383] (5461 slots) maste
   1 additional replica(s)
S: 60bee426b74f78863ebde556ccdf3be318076e2a 192.168.1.31:6380
   slots: (0 slots) slave
   replicates 61a3730c0bc4f8dd0adc6cb8361468b111ae107f
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@ddcw31 redis-cluster]#            

複制

1.4 檢查叢集資訊并設定密碼

設定密碼: 設定完了, 還得修改配置檔案哈,不然重新開機就沒了(我這裡偷懶,就直接config rewrite了, 生産環境建議是要禁掉config的)

每個執行個體都要設定哈, 不然會出現某些節點沒得資料的. 叢集高可用性也會受到影響

[root@ddcw31 redis-cluster]# /usr/local/redis-cluster/bin/redis-cli -h 192.168.1.31 -p 6379 -c
192.168.1.31:6379> config set requirepass 123456
OK
192.168.1.31:6379> config set masterauth 123456
(error) NOAUTH Authentication required.
192.168.1.31:6379> auth 123456
OK
192.168.1.31:6379> config set requirepass 123456
OK
192.168.1.31:6379> config rewrite
OK
192.168.1.31:6379>           

複制

檢視叢集資訊如下

192.168.1.33:6379> cluster nodes
fc5978c802368c699e57405d3c1ba867bc5fe312 192.168.1.33:6380@16380 slave 4b277b33572bfdfdae734da9a006ff5d7ee05d46 0 1608532872000 6 connected
6c41bb62bc3857d2c9549873d79f00f4a34475d2 192.168.1.32:6380@16380 slave 169b0df771d45f27383add0304df59d2fbae6c62 0 1608532872000 4 connected
60bee426b74f78863ebde556ccdf3be318076e2a 192.168.1.31:6380@16380 slave 61a3730c0bc4f8dd0adc6cb8361468b111ae107f 0 1608532875050 5 connected
4b277b33572bfdfdae734da9a006ff5d7ee05d46 192.168.1.32:6379@16379 master - 0 1608532873000 3 connected 5461-10922
61a3730c0bc4f8dd0adc6cb8361468b111ae107f 192.168.1.33:6379@16379 myself,master - 0 1608532870000 5 connected 10923-16383
169b0df771d45f27383add0304df59d2fbae6c62 192.168.1.31:6379@16379 master - 0 1608532874034 1 connected 0-5460
192.168.1.33:6379>           

複制

各個字段意思是啥,可以看:http://www.redis.cn/commands/cluster-nodes.html

本環境:

fc5978c802368c699e57405d3c1ba867bc5fe312 這個是192.168.1.33:6380的node-id,其它的類似,叢集加減節點的時候會用到

主節點 備節點 hash槽(slot)

192.168.1.31:6379 192.168.1.32:6380 0-5460

192.168.1.32:6379 192.168.1.33:6380 5461-10922

192.168.1.33:6379 192.168.1.31:6380 10923-16383

1.5 redis叢集操作

啟動叢集/節點

啟動叢集隻需要啟動所有節點即可. 所有隻需要在每個節點執行如下指令即可

/usr/local/redis-cluster/bin/redis-server  /usr/local/redis-cluster/redis-cluster-6379.conf
/usr/local/redis-cluster/bin/redis-server  /usr/local/redis-cluster/redis-cluster-6380.conf           

複制

關閉叢集/節點

關閉所有節點即可

[root@ddcw31 redis-cluster]# /usr/local/redis-cluster/bin/redis-cli -h 192.168.1.31 -p 6379 -c
192.168.1.31:6379> auth 123456
OK
192.168.1.31:6379> shutdown
not connected> exit
[root@ddcw31 redis-cluster]#            

複制

檢視叢集資訊:

檢視cluster-config-file指定的檔案也行

登入後執行cluster nodes檢視也行

[root@ddcw31 redis-cluster]# tail /usr/local/redis-cluster/data/node-6379.conf 
169b0df771d45f27383add0304df59d2fbae6c62 192.168.1.31:6379@16379 myself,master - 0 1608532289000 1 connected 0-5460
4b277b33572bfdfdae734da9a006ff5d7ee05d46 192.168.1.32:6379@16379 master - 0 1608532289453 3 connected 5461-10922
fc5978c802368c699e57405d3c1ba867bc5fe312 192.168.1.33:6380@16380 slave 4b277b33572bfdfdae734da9a006ff5d7ee05d46 0 1608532290000 6 connected
6c41bb62bc3857d2c9549873d79f00f4a34475d2 192.168.1.32:6380@16380 slave 169b0df771d45f27383add0304df59d2fbae6c62 0 1608532290000 4 connected
61a3730c0bc4f8dd0adc6cb8361468b111ae107f 192.168.1.33:6379@16379 master - 0 1608532291000 5 connected 10923-16383
60bee426b74f78863ebde556ccdf3be318076e2a 192.168.1.31:6380@16380 slave 61a3730c0bc4f8dd0adc6cb8361468b111ae107f 0 1608532291485 5 connected
vars currentEpoch 6 lastVoteEpoch 0
[root@ddcw31 redis-cluster]# /usr/local/redis-cluster/bin/redis-cli -h 192.168.1.31 -p 6379 -c
192.168.1.31:6379> auth 123456
OK
192.168.1.31: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:1336
cluster_stats_messages_pong_sent:1483
cluster_stats_messages_sent:2819
cluster_stats_messages_ping_received:1478
cluster_stats_messages_pong_received:1336
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:2819
192.168.1.31:6379> cluster nodes
169b0df771d45f27383add0304df59d2fbae6c62 192.168.1.31:6379@16379 myself,master - 0 1608533632000 1 connected 0-5460
4b277b33572bfdfdae734da9a006ff5d7ee05d46 192.168.1.32:6379@16379 master - 0 1608533633000 3 connected 5461-10922
fc5978c802368c699e57405d3c1ba867bc5fe312 192.168.1.33:6380@16380 slave 4b277b33572bfdfdae734da9a006ff5d7ee05d46 0 1608533631000 6 connected
6c41bb62bc3857d2c9549873d79f00f4a34475d2 192.168.1.32:6380@16380 slave 169b0df771d45f27383add0304df59d2fbae6c62 0 1608533632330 4 connected
61a3730c0bc4f8dd0adc6cb8361468b111ae107f 192.168.1.33:6379@16379 master - 0 1608533634347 5 connected 10923-16383
60bee426b74f78863ebde556ccdf3be318076e2a 192.168.1.31:6380@16380 slave 61a3730c0bc4f8dd0adc6cb8361468b111ae107f 0 1608533633339 5 connected
192.168.1.31:6379>            

複制

2. 測試:

資料存儲測試

redis會根據key進行CRC16算出其槽(slot)所在節點

HASH_SLOT = CRC16(key) mod 16384

[root@ddcw31 redis-cluster]# /usr/local/redis-cluster/bin/redis-cli -h 192.168.1.31 -p 6379 -c
192.168.1.31:6379> auth 123456
OK
192.168.1.31:6379> set test "i am 31"
-> Redirected to slot [6918] located at 192.168.1.32:6379
(error) NOAUTH Authentication required.
192.168.1.32:6379> auth 123456
OK
192.168.1.32:6379> set test "i am 31"
OK
192.168.1.32:6379> get test
"i am 31"
192.168.1.32:6379>            

複制

我登入的31, 當我set test的時候, 對test做hash,算出其槽為6918,屬于第二個節點,于是就自動登入第二節點了

模拟節點宕掉

先登入31:6379 檢視叢集節點資訊 --> 設定test值(根據hash算出應存儲到32:6379) --> 人工kill掉32:6379後, 查詢剛才設定的test值在33:6380(slave-->master)上 --> 檢視日志為15秒失敗後,33:6380就變成master了

(當宕掉的執行個體重新啟動之後,會變成slave)

[root@ddcw31 redis-cluster]# /usr/local/redis-cluster/bin/redis-cli -h 192.168.1.31 -p 6379 -c
192.168.1.31:6379> auth 123456
OK
192.168.1.31:6379> cluster nodes
61a3730c0bc4f8dd0adc6cb8361468b111ae107f 192.168.1.33:6379@16379 slave 60bee426b74f78863ebde556ccdf3be318076e2a 0 1608540875000 8 connected
6c41bb62bc3857d2c9549873d79f00f4a34475d2 192.168.1.32:6380@16380 master - 0 1608540875491 7 connected 0-5460
169b0df771d45f27383add0304df59d2fbae6c62 192.168.1.31:6379@16379 myself,slave 6c41bb62bc3857d2c9549873d79f00f4a34475d2 0 1608540876000 1 connected
4b277b33572bfdfdae734da9a006ff5d7ee05d46 192.168.1.32:6379@16379 master - 0 1608540877517 3 connected 5461-10922
fc5978c802368c699e57405d3c1ba867bc5fe312 192.168.1.33:6380@16380 slave 4b277b33572bfdfdae734da9a006ff5d7ee05d46 0 1608540872449 6 connected
60bee426b74f78863ebde556ccdf3be318076e2a 192.168.1.31:6380@16380 master - 0 1608540877000 8 connected 10923-16383
192.168.1.31:6379> set test "awsl20201221"
-> Redirected to slot [6918] located at 192.168.1.32:6379
(error) NOAUTH Authentication required.
192.168.1.32:6379> auth 123456
OK
192.168.1.32:6379> get test
"i am 31"
192.168.1.32:6379> set test "awsl20201221"
OK
192.168.1.32:6379> get test
"awsl20201221"
192.168.1.32:6379> exit
[root@ddcw31 redis-cluster]# ssh 192.168.1.32
[email protected]'s password: 
Last login: Mon Dec 21 12:14:28 2020 from pc-202004152311
[root@ddcw32 ~]# ps -ef | grep redis
root       2226      1  0 16:54 ?        00:00:00 /usr/local/redis-cluster/bin/redis-server 0.0.0.0:6379 [cluster]
root       2231      1  0 16:54 ?        00:00:00 /usr/local/redis-cluster/bin/redis-server 0.0.0.0:6380 [cluster]
root       2256   2240  0 16:56 pts/1    00:00:00 grep --color=auto redis
[root@ddcw32 ~]# kill -9 2226
[root@ddcw32 ~]#  /usr/local/redis-cluster/bin/redis-cli -h 192.168.1.31 -p 6379 -c
192.168.1.31:6379> auth 123456
OK
192.168.1.31:6379> get test
-> Redirected to slot [6918] located at 192.168.1.33:6380
(error) NOAUTH Authentication required.
192.168.1.33:6380> auth 123456
OK
192.168.1.33:6380> get test
"awsl20201221"
192.168.1.33:6380> exit
[root@ddcw32 ~]# ssh 192.168.1.33
The authenticity of host '192.168.1.33 (192.168.1.33)' can't be established.
ECDSA key fingerprint is SHA256:Nt3xEe5pKXcjs46teMTKGFZ5E55B+IF9rSVdIw2fYTc.
ECDSA key fingerprint is MD5:84:6d:67:d9:eb:c2:67:b9:27:bd:27:e3:3b:68:c1:11.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.33' (ECDSA) to the list of known hosts.
[email protected]'s password: 
Last login: Mon Dec 21 12:14:44 2020 from pc-202004152311
[root@ddcw33 ~]# tail /usr/local/redis-cluster/log/redis-cluster-6380.log 
1887:S 21 Dec 2020 16:57:07.107 # Error condition on socket for SYNC: Connection refused
1887:S 21 Dec 2020 16:57:07.171 * FAIL message received from 6c41bb62bc3857d2c9549873d79f00f4a34475d2 about 4b277b33572bfdfdae734da9a006ff5d7ee05d46
1887:S 21 Dec 2020 16:57:07.171 # Cluster state changed: fail
1887:S 21 Dec 2020 16:57:07.207 # Start of election delayed for 515 milliseconds (rank #0, offset 261).
1887:S 21 Dec 2020 16:57:07.815 # Starting a failover election for epoch 9.
1887:S 21 Dec 2020 16:57:07.821 # Failover election won: I'm the new master.
1887:S 21 Dec 2020 16:57:07.822 # configEpoch set to 9 after successful failove
1887:M 21 Dec 2020 16:57:07.822 # Setting secondary replication ID to fb19496140888dd50683a812b6f4dc4c6475a003, valid up to offset: 262. New replication ID is 64e8015d75d3e07350c8edcc16abf9b4b820534e
1887:M 21 Dec 2020 16:57:07.822 * Discarding previously cached master state.
1887:M 21 Dec 2020 16:57:07.822 # Cluster state changed: ok
[root@ddcw33 ~]# /usr/local/redis-cluster/bin/redis-cli -h 192.168.1.31 -p 6379 -c
192.168.1.31:6379> auth 123456
OK
192.168.1.31:6379> cluster nodes
61a3730c0bc4f8dd0adc6cb8361468b111ae107f 192.168.1.33:6379@16379 slave 60bee426b74f78863ebde556ccdf3be318076e2a 0 1608541383634 8 connected
6c41bb62bc3857d2c9549873d79f00f4a34475d2 192.168.1.32:6380@16380 master - 0 1608541379586 7 connected 0-5460
169b0df771d45f27383add0304df59d2fbae6c62 192.168.1.31:6379@16379 myself,slave 6c41bb62bc3857d2c9549873d79f00f4a34475d2 0 1608541382000 1 connected
4b277b33572bfdfdae734da9a006ff5d7ee05d46 192.168.1.32:6379@16379 master,fail - 1608541011887 1608541009000 3 disconnected
fc5978c802368c699e57405d3c1ba867bc5fe312 192.168.1.33:6380@16380 master - 0 1608541382000 9 connected 5461-10922
60bee426b74f78863ebde556ccdf3be318076e2a 192.168.1.31:6380@16380 master - 0 1608541382618 8 connected 10923-16383
192.168.1.31:6379>            

複制

也就是說當我有三個節點互為主從的時候, 可以宕掉任一節點(一主和另一從)

測試如下:

你如果測試失敗了的話,多半是密碼問題, 每個主從都要設定密碼且一樣

[root@ddcw31 redis-cluster]# /usr/local/redis-cluster/bin/redis-cli -h 192.168.1.31 -p 6379 -c
192.168.1.31:6379> auth 123456
OK
192.168.1.31:6379> cluster nodes
61a3730c0bc4f8dd0adc6cb8361468b111ae107f 192.168.1.33:6379@16379 slave 60bee426b74f78863ebde556ccdf3be318076e2a 0 1608541557000 8 connected
6c41bb62bc3857d2c9549873d79f00f4a34475d2 192.168.1.32:6380@16380 master - 0 1608541559021 7 connected 0-5460
169b0df771d45f27383add0304df59d2fbae6c62 192.168.1.31:6379@16379 myself,slave 6c41bb62bc3857d2c9549873d79f00f4a34475d2 0 1608541555000 1 connected
4b277b33572bfdfdae734da9a006ff5d7ee05d46 192.168.1.32:6379@16379 slave fc5978c802368c699e57405d3c1ba867bc5fe312 0 1608541560031 9 connected
fc5978c802368c699e57405d3c1ba867bc5fe312 192.168.1.33:6380@16380 master - 0 1608541557000 9 connected 5461-10922
60bee426b74f78863ebde556ccdf3be318076e2a 192.168.1.31:6380@16380 master - 0 1608541558009 8 connected 10923-16383
192.168.1.31:6379> exit
[root@ddcw31 redis-cluster]#  ps -ef | grep redis | grep cluster |  awk '{print $2}' | xargs -t -i kill -9 {}
kill -9 3367 
kill -9 3372 
[root@ddcw31 redis-cluster]# /usr/local/redis-cluster/bin/redis-cli -h 192.168.1.32 -p 6379 -c
192.168.1.32:6379> auth 123456
OK
192.168.1.32:6379> cluster nodes
6c41bb62bc3857d2c9549873d79f00f4a34475d2 192.168.1.32:6380@16380 master - 0 1608541641823 7 connected 0-5460
4b277b33572bfdfdae734da9a006ff5d7ee05d46 192.168.1.32:6379@16379 myself,slave fc5978c802368c699e57405d3c1ba867bc5fe312 0 1608541636000 3 connected
61a3730c0bc4f8dd0adc6cb8361468b111ae107f 192.168.1.33:6379@16379 master - 0 1608541643852 10 connected 10923-16383
fc5978c802368c699e57405d3c1ba867bc5fe312 192.168.1.33:6380@16380 master - 0 1608541642837 9 connected 5461-10922
169b0df771d45f27383add0304df59d2fbae6c62 192.168.1.31:6379@16379 slave,fail 6c41bb62bc3857d2c9549873d79f00f4a34475d2 1608541618211 1608541616000 7 disconnected
60bee426b74f78863ebde556ccdf3be318076e2a 192.168.1.31:6380@16380 master,fail - 1608541618211 1608541617299 8 disconnected
192.168.1.32:6379>            

複制

這個測試最好是在應用上測試,效果更佳,對于應用來講幾乎是透明的

其它的特性我就不去測了.

本環境是設定了密碼的,所有還得加 -a password參數

叢集的添加節點和删除節點我也不講了.涉及到hash槽的重新配置設定.給個提示

#添加從節點:
#existing_host:existing_port 是指叢集的某個節點,比較要登入上去才能加啊,是以也會涉及到密碼問題
#new_host:new_port指新添加的節點IP:端口
/usr/local/redis-cluster/bin/redis-cli --cluster add-node --cluster-slave --cluster-master-id NODE-ID new_host:new_port existing_host:existing_port 

#添加主節點:
/usr/local/redis-cluster/bin/redis-cli --cluster add-node  new_host:new_port existing_host:existing_port 

#移除一個節點,移除節點是不區分主從的. 移除前得先確定該節點沒得hash槽
/usr/local/redis-cluster/bin/redis-cli --cluster del-node  host:port node_id
           

複制

新添加的主節點是沒得hash槽的,

得重新配置設定hash槽,提示

redis-cli --cluster reshard host:port -a 123456           

複制

下一章講使用redis,