Redis持久化、主从复制、哨兵、集群配置,一步一步走向高可用

1. Redis数据持久化

TODO

2. Redis主从复制:从单机到多节点

TODO

3. Redis Sentinel主从切换:走向高可用

3.1. 配置主从

参考步骤2. 配置一主一从两个Redis节点,主节点为127.0.0.1:6379,从节点为127.0.0.1:6380。

3.2. 配置sentinel的配置文件

sentinel0.conf

sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 10000

3.3. 启动一个sentinel节点

使用以下命令启动一个sentinel

redis-sentinel ./conf/sentinel0.conf

启动之后控制台输出如下内容

5643:X 13 Mar 2021 21:40:56.054 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
5643:X 13 Mar 2021 21:40:56.054 # Redis version=6.0.9, bits=64, commit=00000000, modified=0, pid=5643, just started
5643:X 13 Mar 2021 21:40:56.054 # Configuration loaded
5643:X 13 Mar 2021 21:40:56.055 * Increased maximum number of open files to 10032 (it was originally set to 256).
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 6.0.9 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 5643
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

5643:X 13 Mar 2021 21:40:56.058 # Sentinel ID is d66c226c4532b8e5d5927e0a9cd441d6c4c8f805
5643:X 13 Mar 2021 21:40:56.058 # +monitor master mymaster 127.0.0.1 6379 quorum 2
5643:X 13 Mar 2021 21:40:56.058 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379

再次查看配置文件sentinel0.conf,会发现redis会自动将sentinel0.conf文件修改为如下内容

sentinel myid d66c226c4532b8e5d5927e0a9cd441d6c4c8f805
sentinel deny-scripts-reconfig yes
# Generated by CONFIG REWRITE
protected-mode no
port 26379
user default on nopass ~* +@all
dir "/Users/chenxi/tools/redis-6.0.9"
# 以下2行是原配置文件中的
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 10000
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 127.0.0.1 6380
sentinel current-epoch 0

3.4. 启动另一个sentinel节点

复制sentinel0.conf为sentinel1.conf,并修改文件内容

# 修改myid
sentinel myid d66c226c4532b8e5d5927e0a9cd441d6c4c8f806
sentinel deny-scripts-reconfig yes
# Generated by CONFIG REWRITE
protected-mode no
# 修改端口
port 26380
user default on nopass ~* +@all
dir "/Users/chenxi/tools/redis-6.0.9"
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 10000
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 127.0.0.1 6380
sentinel current-epoch 0

启动另一个sentinel

redis-sentinel ./conf/sentinel1.conf

控制台输出如下内容

5733:X 13 Mar 2021 21:43:04.770 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
5733:X 13 Mar 2021 21:43:04.770 # Redis version=6.0.9, bits=64, commit=00000000, modified=0, pid=5733, just started
5733:X 13 Mar 2021 21:43:04.770 # Configuration loaded
5733:X 13 Mar 2021 21:43:04.771 * Increased maximum number of open files to 10032 (it was originally set to 256).
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 6.0.9 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26380
 |    `-._   `._    /     _.-'    |     PID: 5733
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

5733:X 13 Mar 2021 21:43:04.773 # Sentinel ID is d66c226c4532b8e5d5927e0a9cd441d6c4c8f806
5733:X 13 Mar 2021 21:43:04.773 # +monitor master mymaster 127.0.0.1 6379 quorum 2
5733:X 13 Mar 2021 21:43:06.400 * +sentinel sentinel d66c226c4532b8e5d5927e0a9cd441d6c4c8f805 127.0.0.1 26379 @ mymaster 127.0.0.1 6379

sentinel0的console中新增一行

5643:X 13 Mar 2021 21:43:06.811 * +sentinel sentinel d66c226c4532b8e5d5927e0a9cd441d6c4c8f806 127.0.0.1 26380 @ mymaster 127.0.0.1 6379

3.5. 测试

强制将主shutdown

127.0.0.1:6379> SHUTDOWN
not connected>

sentinel0和sentinel1进行选主,选择sentinel1为主,sentinel0的控制台输出

5643:X 13 Mar 2021 21:48:00.672 # +sdown master mymaster 127.0.0.1 6379
5643:X 13 Mar 2021 21:48:01.746 # +new-epoch 1
5643:X 13 Mar 2021 21:48:01.748 # +vote-for-leader d66c226c4532b8e5d5927e0a9cd441d6c4c8f806 1
5643:X 13 Mar 2021 21:48:01.781 # +odown master mymaster 127.0.0.1 6379 #quorum 2/2
5643:X 13 Mar 2021 21:48:01.781 # Next failover delay: I will not start a failover before Sat Mar 13 21:54:02 2021
5643:X 13 Mar 2021 21:48:02.132 # +config-update-from sentinel d66c226c4532b8e5d5927e0a9cd441d6c4c8f806 127.0.0.1 26380 @ mymaster 127.0.0.1 6379
5643:X 13 Mar 2021 21:48:02.132 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380
5643:X 13 Mar 2021 21:48:02.132 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
5643:X 13 Mar 2021 21:48:12.143 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380

sentinel1的控制台输出

5733:X 13 Mar 2021 21:48:01.684 # +sdown master mymaster 127.0.0.1 6379
5733:X 13 Mar 2021 21:48:01.741 # +odown master mymaster 127.0.0.1 6379 #quorum 2/2
5733:X 13 Mar 2021 21:48:01.741 # +new-epoch 1
5733:X 13 Mar 2021 21:48:01.741 # +try-failover master mymaster 127.0.0.1 6379
5733:X 13 Mar 2021 21:48:01.744 # +vote-for-leader d66c226c4532b8e5d5927e0a9cd441d6c4c8f806 1
5733:X 13 Mar 2021 21:48:01.748 # d66c226c4532b8e5d5927e0a9cd441d6c4c8f805 voted for d66c226c4532b8e5d5927e0a9cd441d6c4c8f806 1
5733:X 13 Mar 2021 21:48:01.803 # +elected-leader master mymaster 127.0.0.1 6379
5733:X 13 Mar 2021 21:48:01.803 # +failover-state-select-slave master mymaster 127.0.0.1 6379
5733:X 13 Mar 2021 21:48:01.907 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
5733:X 13 Mar 2021 21:48:01.908 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
5733:X 13 Mar 2021 21:48:01.983 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
5733:X 13 Mar 2021 21:48:02.073 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
5733:X 13 Mar 2021 21:48:02.073 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6379
5733:X 13 Mar 2021 21:48:02.128 # +failover-end master mymaster 127.0.0.1 6379
# master切换为 127.0.0.1 6380 
5733:X 13 Mar 2021 21:48:02.128 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380
5733:X 13 Mar 2021 21:48:02.128 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
5733:X 13 Mar 2021 21:48:12.178 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380

将原先的Redis从库设置为主库,查看127.0.0.1:6380的info信息

127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_replid:5f46a97eeca090af014d9bad88ca6728154b0d61
master_replid2:e607b647b0f032121a00d490c992658ec1f0cf13
master_repl_offset:402908
second_repl_offset:355671
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:297583
repl_backlog_histlen:105326

尝试启动127.0.0.1:6379,并查看它的info信息

127.0.0.1:6379> info replication
# Replication
# 已经变成127.0.0.1:6380的从库
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:415888
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:5f46a97eeca090af014d9bad88ca6728154b0d61
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:415888
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:410490
repl_backlog_histlen:5399

sentinel1

5733:X 13 Mar 2021 21:54:52.667 # -sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
5733:X 13 Mar 2021 21:55:02.589 * +convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380

sentinel0

5643:X 13 Mar 2021 21:54:52.888 # -sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380

4. Redis Cluster:走向分片

解决容量问题

4.1. 准备配置文件

以redis.conf为例,修改以下内容

port 6379
cluster-enabled yes
cluster-config-file "node-6379.conf"
logfile "redis-server-6379.log"
dbfilename "dump-6379.rdb"
daemonize yes

准备6份Redis配置文件

4.2. 启动Redis

➜  ~ redis-server ./tools/redis-conf/cluster/6379/redis6379.conf
➜  ~ redis-server ./tools/redis-conf/cluster/6380/redis6380.conf
➜  ~ redis-server ./tools/redis-conf/cluster/6381/redis6381.conf
➜  ~ redis-server ./tools/redis-conf/cluster/6479/redis6479.conf
➜  ~ redis-server ./tools/redis-conf/cluster/6480/redis6480.conf
➜  ~ redis-server ./tools/redis-conf/cluster/6481/redis6481.conf

查看启动好的Redis

➜  ~ ps -ax|grep redis
92406 ??         0:00.66 redis-server 127.0.0.1:6379 [cluster]
92510 ??         0:00.29 redis-server 127.0.0.1:6380 [cluster]
92520 ??         0:00.25 redis-server 127.0.0.1:6381 [cluster]
92529 ??         0:00.21 redis-server 127.0.0.1:6479 [cluster]
92537 ??         0:00.19 redis-server 127.0.0.1:6480 [cluster]
92545 ??         0:00.18 redis-server 127.0.0.1:6481 [cluster]

4.3. 将节点相互连接

➜  ~ redis-cli
127.0.0.1:6379> CLUSTER NODES
9fa624c3cf1bef0b7dd58347889505ff5982eed4 :6379@16379 myself,master - 0 0 0 connected

# 节点相连
127.0.0.1:6379> CLUSTER meet 127.0.0.1 6380
OK
127.0.0.1:6379> CLUSTER meet 127.0.0.1 6381
OK
127.0.0.1:6379> CLUSTER meet 127.0.0.1 6479
OK
127.0.0.1:6379> CLUSTER meet 127.0.0.1 6480
OK
127.0.0.1:6379> CLUSTER meet 127.0.0.1 6481
OK

# 查看集群中的节点
127.0.0.1:6379> CLUSTER NODES
139b6dc42bb27103b7ecc8f988dd5f67a418c8fe 127.0.0.1:6481@16481 master - 0 1616425114000 5 connected
9fa624c3cf1bef0b7dd58347889505ff5982eed4 127.0.0.1:6379@16379 myself,master - 0 1616425113000 1 connected
efd49f7d7bc30d0e1246601898566a32db2ad919 127.0.0.1:6380@16380 master - 0 1616425114600 0 connected
512f4d306b5452efa5a48c4ff93e05ca7124f30c 127.0.0.1:6480@16480 master - 0 1616425115610 4 connected
c330c64e8c87828a81c86b74a3d4156a3342442d 127.0.0.1:6381@16381 master - 0 1616425112000 2 connected
b089bc4800fde9558d2f3b4402296a2bdb97c4e9 127.0.0.1:6479@16479 master - 0 1616425113000 3 connected

4.4. 槽位分派

➜  ~ redis-cli -h 127.0.0.1 -p 6379 cluster addslots {0..5000}
OK
➜  ~ redis-cli -h 127.0.0.1 -p 6380 cluster addslots {5001..10000}
OK
➜  ~ redis-cli -h 127.0.0.1 -p 6381 cluster addslots {10001..16383}
OK

槽位分派后的节点情况

➜  ~ redis-cli
127.0.0.1:6379> CLUSTER NODES
139b6dc42bb27103b7ecc8f988dd5f67a418c8fe 127.0.0.1:6481@16481 master - 0 1616425590836 5 connected
9fa624c3cf1bef0b7dd58347889505ff5982eed4 127.0.0.1:6379@16379 myself,master - 0 1616425590000 1 connected 0-5000
efd49f7d7bc30d0e1246601898566a32db2ad919 127.0.0.1:6380@16380 master - 0 1616425588810 0 connected 5001-10000
512f4d306b5452efa5a48c4ff93e05ca7124f30c 127.0.0.1:6480@16480 master - 0 1616425589821 4 connected
c330c64e8c87828a81c86b74a3d4156a3342442d 127.0.0.1:6381@16381 master - 0 1616425591846 2 connected 10001-16383
b089bc4800fde9558d2f3b4402296a2bdb97c4e9 127.0.0.1:6479@16479 master - 0 1616425590000 3 connected

4.5. 主从复制

➜  ~ redis-cli -h 127.0.0.1 -p 6479 cluster replicate 9fa624c3cf1bef0b7dd58347889505ff5982eed4
OK
➜  ~ redis-cli -h 127.0.0.1 -p 6480 cluster replicate efd49f7d7bc30d0e1246601898566a32db2ad919
OK
➜  ~ redis-cli -h 127.0.0.1 -p 6481 cluster replicate c330c64e8c87828a81c86b74a3d4156a3342442d
OK

4.6. 测试集群

127.0.0.1:6379> CLUSTER KEYSLOT name
(integer) 5798
# 未按预期重定向
127.0.0.1:6379> set name huey
(error) MOVED 5798 127.0.0.1:6380
# 按集群模式启动客户端 指定-c参数
➜  ~ redis-cli -c
127.0.0.1:6379> CLUSTER KEYSLOT name
(integer) 5798
127.0.0.1:6379> set name huey
-> Redirected to slot [5798] located at 127.0.0.1:6380
OK
# 继续测试
127.0.0.1:6380> set k1 v1
-> Redirected to slot [12706] located at 127.0.0.1:6381
OK
127.0.0.1:6381> keys *
1) "k1"
127.0.0.1:6381> get name
-> Redirected to slot [5798] located at 127.0.0.1:6380
"huey"
127.0.0.1:6380> get k1
-> Redirected to slot [12706] located at 127.0.0.1:6381
"v1"
127.0.0.1:6381>

4.7. 故障转移

➜  ~ redis-cli
127.0.0.1:6379> cluster nodes
86530a225520347b3b268c6d16b1a1766cdf14d3 127.0.0.1:6381@16381 master - 0 1616509839957 2 connected 10001-16383
6c787a3b61616914ad35dec54652c050fad2778c 127.0.0.1:6479@16479 slave d463742c293d0f3f688014b1dfd08e40fa416a64 0 1616509838944 0 connected
9c55b2973261b0acb96601818c7693eb1a4cb0a4 127.0.0.1:6380@16380 master - 0 1616509838000 1 connected 5001-10000
5b29a600982955557bcfa8368a226e688c17e7b6 127.0.0.1:6480@16480 slave 9c55b2973261b0acb96601818c7693eb1a4cb0a4 0 1616509839000 1 connected
0e6ea0a2cec7d05a0cd73cf45a5dfa49254cba12 127.0.0.1:6481@16481 slave 86530a225520347b3b268c6d16b1a1766cdf14d3 0 1616509838000 2 connected
d463742c293d0f3f688014b1dfd08e40fa416a64 127.0.0.1:6379@16379 myself,master - 0 1616509838000 0 connected 0-5000
# 将6379-6479这对主从中的主shutdown
127.0.0.1:6379> shutdown
not connected> exit

➜  ~ redis-cli -p 6479
127.0.0.1:6479> CLUSTER NODES
5b29a600982955557bcfa8368a226e688c17e7b6 127.0.0.1:6480@16480 slave 9c55b2973261b0acb96601818c7693eb1a4cb0a4 0 1616509869717 1 connected
# 登录到647可以观察到6479变成主
6c787a3b61616914ad35dec54652c050fad2778c 127.0.0.1:6479@16479 myself,master - 0 1616509867000 6 connected 0-5000
9c55b2973261b0acb96601818c7693eb1a4cb0a4 127.0.0.1:6380@16380 master - 0 1616509868000 1 connected 5001-10000
86530a225520347b3b268c6d16b1a1766cdf14d3 127.0.0.1:6381@16381 master - 0 1616509870729 2 connected 10001-16383
0e6ea0a2cec7d05a0cd73cf45a5dfa49254cba12 127.0.0.1:6481@16481 slave 86530a225520347b3b268c6d16b1a1766cdf14d3 0 1616509870000 2 connected
# 6379 失败
d463742c293d0f3f688014b1dfd08e40fa416a64 127.0.0.1:6379@16379 master,fail - 1616509853512 1616509848457 0 disconnected
127.0.0.1:6479> exit

# 重新启动6379
➜  ~ redis-server ./tools/redis-conf/cluster/6379/redis6379.conf
➜  ~ redis-cli
127.0.0.1:6379> CLUSTER NODES
86530a225520347b3b268c6d16b1a1766cdf14d3 127.0.0.1:6381@16381 master - 0 1616509916509 2 connected 10001-16383
# 6379变成从
d463742c293d0f3f688014b1dfd08e40fa416a64 127.0.0.1:6379@16379 myself,slave 6c787a3b61616914ad35dec54652c050fad2778c 0 1616509917000 6 connected
6c787a3b61616914ad35dec54652c050fad2778c 127.0.0.1:6479@16479 master - 0 1616509917000 6 connected 0-5000
0e6ea0a2cec7d05a0cd73cf45a5dfa49254cba12 127.0.0.1:6481@16481 slave 86530a225520347b3b268c6d16b1a1766cdf14d3 0 1616509915000 2 connected
9c55b2973261b0acb96601818c7693eb1a4cb0a4 127.0.0.1:6380@16380 master - 0 1616509918533 1 connected 5001-10000
5b29a600982955557bcfa8368a226e688c17e7b6 127.0.0.1:6480@16480 slave 9c55b2973261b0acb96601818c7693eb1a4cb0a4 0 1616509917522 1 connected

6379从shutdown 到变成slave的日志:

18479:M 23 Mar 2021 22:30:51.788 # User requested shutdown...
18479:M 23 Mar 2021 22:30:51.788 * Saving the final RDB snapshot before exiting.
18479:M 23 Mar 2021 22:30:51.790 * DB saved on disk
18479:M 23 Mar 2021 22:30:51.790 * Removing the pid file.
18479:M 23 Mar 2021 22:30:51.791 # Redis is now ready to exit, bye bye...
19707:C 23 Mar 2021 22:31:47.491 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
19707:C 23 Mar 2021 22:31:47.492 # Redis version=6.0.8, bits=64, commit=00000000, modified=0, pid=19707, just started
19707:C 23 Mar 2021 22:31:47.492 # Configuration loaded
19707:M 23 Mar 2021 22:31:47.494 * Increased maximum number of open files to 10032 (it was originally set to 256).
19707:M 23 Mar 2021 22:31:47.496 * Node configuration loaded, I'm d463742c293d0f3f688014b1dfd08e40fa416a64
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 6.0.8 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in cluster mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 19707
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

19707:M 23 Mar 2021 22:31:47.497 # Server initialized
19707:M 23 Mar 2021 22:31:47.498 * Loading RDB produced by version 6.0.8
19707:M 23 Mar 2021 22:31:47.498 * RDB age 56 seconds
19707:M 23 Mar 2021 22:31:47.499 * RDB memory usage when created 2.60 Mb
19707:M 23 Mar 2021 22:31:47.499 * DB loaded from disk: 0.001 seconds
19707:M 23 Mar 2021 22:31:47.499 * Ready to accept connections
19707:M 23 Mar 2021 22:31:47.500 # Configuration change detected. Reconfiguring myself as a replica of 6c787a3b61616914ad35dec54652c050fad2778c
19707:S 23 Mar 2021 22:31:47.501 * Before turning into a replica, using my own master parameters to synthesize a cached master: I may be able to synchronize with the new master with just a partial transfer.
19707:S 23 Mar 2021 22:31:47.501 # Cluster state changed: ok
19707:S 23 Mar 2021 22:31:48.510 * Connecting to MASTER 127.0.0.1:6479
19707:S 23 Mar 2021 22:31:48.511 * MASTER <-> REPLICA sync started
19707:S 23 Mar 2021 22:31:48.512 * Non blocking connect for SYNC fired the event.
19707:S 23 Mar 2021 22:31:48.513 * Master replied to PING, replication can continue...
19707:S 23 Mar 2021 22:31:48.514 * Trying a partial resynchronization (request 8c4017406519ae80370ec1890172973ba6c638b3:1).
19707:S 23 Mar 2021 22:31:48.516 * Full resync from master: bc0cc811f22b399f4c4df301324f68370816b1f5:1400
19707:S 23 Mar 2021 22:31:48.517 * Discarding previously cached master state.
19707:S 23 Mar 2021 22:31:48.599 * MASTER <-> REPLICA sync: receiving 176 bytes from master to disk
19707:S 23 Mar 2021 22:31:48.599 * MASTER <-> REPLICA sync: Flushing old data
19707:S 23 Mar 2021 22:31:48.600 * MASTER <-> REPLICA sync: Loading DB in memory
19707:S 23 Mar 2021 22:31:48.601 * Loading RDB produced by version 6.0.8
19707:S 23 Mar 2021 22:31:48.601 * RDB age 0 seconds
19707:S 23 Mar 2021 22:31:48.601 * RDB memory usage when created 2.59 Mb
19707:S 23 Mar 2021 22:31:48.602 * MASTER <-> REPLICA sync: Finished with success

6479从主停止开始的日志

18572:S 23 Mar 2021 22:30:51.793 # Connection with master lost.
18572:S 23 Mar 2021 22:30:51.794 * Caching the disconnected master state.
18572:S 23 Mar 2021 22:30:52.600 * Connecting to MASTER 127.0.0.1:6379
18572:S 23 Mar 2021 22:30:52.601 * MASTER <-> REPLICA sync started
18572:S 23 Mar 2021 22:30:52.602 # Error condition on socket for SYNC: Operation now in progress
18572:S 23 Mar 2021 22:30:53.614 * Connecting to MASTER 127.0.0.1:6379
18572:S 23 Mar 2021 22:30:53.614 * MASTER <-> REPLICA sync started
18572:S 23 Mar 2021 22:30:53.615 # Error condition on socket for SYNC: Operation now in progress
18572:S 23 Mar 2021 22:30:54.623 * Connecting to MASTER 127.0.0.1:6379
18572:S 23 Mar 2021 22:30:54.624 * MASTER <-> REPLICA sync started
18572:S 23 Mar 2021 22:30:54.625 # Error condition on socket for SYNC: Operation now in progress
18572:S 23 Mar 2021 22:30:55.637 * Connecting to MASTER 127.0.0.1:6379
18572:S 23 Mar 2021 22:30:55.638 * MASTER <-> REPLICA sync started
18572:S 23 Mar 2021 22:30:55.639 # Error condition on socket for SYNC: Operation now in progress
18572:S 23 Mar 2021 22:30:56.647 * Connecting to MASTER 127.0.0.1:6379
18572:S 23 Mar 2021 22:30:56.647 * MASTER <-> REPLICA sync started
18572:S 23 Mar 2021 22:30:56.648 # Error condition on socket for SYNC: Operation now in progress
18572:S 23 Mar 2021 22:30:57.658 * Connecting to MASTER 127.0.0.1:6379
18572:S 23 Mar 2021 22:30:57.659 * MASTER <-> REPLICA sync started
18572:S 23 Mar 2021 22:30:57.660 # Error condition on socket for SYNC: Operation now in progress
18572:S 23 Mar 2021 22:30:58.672 * Connecting to MASTER 127.0.0.1:6379
18572:S 23 Mar 2021 22:30:58.673 * MASTER <-> REPLICA sync started
18572:S 23 Mar 2021 22:30:58.674 # Error condition on socket for SYNC: Operation now in progress
18572:S 23 Mar 2021 22:30:59.683 * Connecting to MASTER 127.0.0.1:6379
18572:S 23 Mar 2021 22:30:59.685 * MASTER <-> REPLICA sync started
18572:S 23 Mar 2021 22:30:59.687 # Error condition on socket for SYNC: Operation now in progress
18572:S 23 Mar 2021 22:31:00.698 * Connecting to MASTER 127.0.0.1:6379
18572:S 23 Mar 2021 22:31:00.698 * MASTER <-> REPLICA sync started
18572:S 23 Mar 2021 22:31:00.699 # Error condition on socket for SYNC: Operation now in progress
18572:S 23 Mar 2021 22:31:01.710 * Connecting to MASTER 127.0.0.1:6379
18572:S 23 Mar 2021 22:31:01.711 * MASTER <-> REPLICA sync started
18572:S 23 Mar 2021 22:31:01.712 # Error condition on socket for SYNC: Operation now in progress
18572:S 23 Mar 2021 22:31:02.723 * Connecting to MASTER 127.0.0.1:6379
18572:S 23 Mar 2021 22:31:02.724 * MASTER <-> REPLICA sync started
18572:S 23 Mar 2021 22:31:02.725 # Error condition on socket for SYNC: Operation now in progress
18572:S 23 Mar 2021 22:31:03.739 * Connecting to MASTER 127.0.0.1:6379
18572:S 23 Mar 2021 22:31:03.739 * MASTER <-> REPLICA sync started
18572:S 23 Mar 2021 22:31:03.740 # Error condition on socket for SYNC: Operation now in progress
18572:S 23 Mar 2021 22:31:04.750 * Connecting to MASTER 127.0.0.1:6379
18572:S 23 Mar 2021 22:31:04.750 * MASTER <-> REPLICA sync started
18572:S 23 Mar 2021 22:31:04.751 # Error condition on socket for SYNC: Operation now in progress
18572:S 23 Mar 2021 22:31:05.764 * Connecting to MASTER 127.0.0.1:6379
18572:S 23 Mar 2021 22:31:05.764 * MASTER <-> REPLICA sync started
18572:S 23 Mar 2021 22:31:05.765 # Error condition on socket for SYNC: Operation now in progress
18572:S 23 Mar 2021 22:31:06.777 * Connecting to MASTER 127.0.0.1:6379
18572:S 23 Mar 2021 22:31:06.778 * MASTER <-> REPLICA sync started
18572:S 23 Mar 2021 22:31:06.779 # Error condition on socket for SYNC: Operation now in progress
18572:S 23 Mar 2021 22:31:07.789 * Connecting to MASTER 127.0.0.1:6379
18572:S 23 Mar 2021 22:31:07.790 * MASTER <-> REPLICA sync started
18572:S 23 Mar 2021 22:31:07.791 # Error condition on socket for SYNC: Operation now in progress
18572:S 23 Mar 2021 22:31:08.695 * FAIL message received from 9c55b2973261b0acb96601818c7693eb1a4cb0a4 about d463742c293d0f3f688014b1dfd08e40fa416a64
18572:S 23 Mar 2021 22:31:08.696 # Cluster state changed: fail
18572:S 23 Mar 2021 22:31:08.703 # Start of election delayed for 819 milliseconds (rank #0, offset 1400).
18572:S 23 Mar 2021 22:31:08.805 * Connecting to MASTER 127.0.0.1:6379
18572:S 23 Mar 2021 22:31:08.805 * MASTER <-> REPLICA sync started
18572:S 23 Mar 2021 22:31:08.806 # Error condition on socket for SYNC: Operation now in progress
18572:S 23 Mar 2021 22:31:09.617 # Starting a failover election for epoch 6.
# 故障转移,成为新的主
18572:S 23 Mar 2021 22:31:09.620 # Failover election won: I'm the new master.
18572:S 23 Mar 2021 22:31:09.620 # configEpoch set to 6 after successful failover
18572:M 23 Mar 2021 22:31:09.621 * Discarding previously cached master state.
18572:M 23 Mar 2021 22:31:09.621 # Setting secondary replication ID to 8d22f8655effb852aa9c3620725ede7a8573e3d8, valid up to offset: 1401. New replication ID is bc0cc811f22b399f4c4df301324f68370816b1f5
18572:M 23 Mar 2021 22:31:09.622 # Cluster state changed: ok
18572:M 23 Mar 2021 22:31:47.589 * Clear FAIL state for node d463742c293d0f3f688014b1dfd08e40fa416a64: master without slots is reachable again.
18572:M 23 Mar 2021 22:31:48.514 * Replica 127.0.0.1:6379 asks for synchronization
18572:M 23 Mar 2021 22:31:48.515 * Partial resynchronization not accepted: Replication ID mismatch (Replica asked for '8c4017406519ae80370ec1890172973ba6c638b3', my replication IDs are 'bc0cc811f22b399f4c4df301324f68370816b1f5' and '8d22f8655effb852aa9c3620725ede7a8573e3d8')
18572:M 23 Mar 2021 22:31:48.515 * Starting BGSAVE for SYNC with target: disk
18572:M 23 Mar 2021 22:31:48.516 * Background saving started by pid 19712
19712:C 23 Mar 2021 22:31:48.517 * DB saved on disk
18572:M 23 Mar 2021 22:31:48.598 * Background saving terminated with success
18572:M 23 Mar 2021 22:31:48.599 * Synchronization with replica 127.0.0.1:6379 succeeded

4.8. 集群伸缩

增加新的Redis节点 6382和6482

➜  ~ redis-server ./tools/redis-conf/cluster/6382/redis6382.conf
➜  ~ redis-server ./tools/redis-conf/cluster/6482/redis6482.conf

将新节点通过命令添加到新的集群中

➜  ~ redis-cli --cluster add-node 127.0.0.1:6382 127.0.0.1:6379
>>> Adding node 127.0.0.1:6382 to cluster 127.0.0.1:6379
>>> Performing Cluster Check (using node 127.0.0.1:6379)
M: d463742c293d0f3f688014b1dfd08e40fa416a64 127.0.0.1:6379
   slots:[0-5000] (5001 slots) master
   1 additional replica(s)
M: 86530a225520347b3b268c6d16b1a1766cdf14d3 127.0.0.1:6381
   slots:[10001-16383] (6383 slots) master
   1 additional replica(s)
S: 6c787a3b61616914ad35dec54652c050fad2778c 127.0.0.1:6479
   slots: (0 slots) slave
   replicates d463742c293d0f3f688014b1dfd08e40fa416a64
S: 0e6ea0a2cec7d05a0cd73cf45a5dfa49254cba12 127.0.0.1:6481
   slots: (0 slots) slave
   replicates 86530a225520347b3b268c6d16b1a1766cdf14d3
M: 9c55b2973261b0acb96601818c7693eb1a4cb0a4 127.0.0.1:6380
   slots:[5001-10000] (5000 slots) master
   1 additional replica(s)
S: 5b29a600982955557bcfa8368a226e688c17e7b6 127.0.0.1:6480
   slots: (0 slots) slave
   replicates 9c55b2973261b0acb96601818c7693eb1a4cb0a4
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 127.0.0.1:6382 to make it join the cluster.
[OK] New node added correctly.
➜  ~ redis-cli --cluster add-node 127.0.0.1:6482 127.0.0.1:6379
>>> Adding node 127.0.0.1:6482 to cluster 127.0.0.1:6379
>>> Performing Cluster Check (using node 127.0.0.1:6379)
M: d463742c293d0f3f688014b1dfd08e40fa416a64 127.0.0.1:6379
   slots:[0-5000] (5001 slots) master
   1 additional replica(s)
M: 86530a225520347b3b268c6d16b1a1766cdf14d3 127.0.0.1:6381
   slots:[10001-16383] (6383 slots) master
   1 additional replica(s)
S: 6c787a3b61616914ad35dec54652c050fad2778c 127.0.0.1:6479
   slots: (0 slots) slave
   replicates d463742c293d0f3f688014b1dfd08e40fa416a64
S: 0e6ea0a2cec7d05a0cd73cf45a5dfa49254cba12 127.0.0.1:6481
   slots: (0 slots) slave
   replicates 86530a225520347b3b268c6d16b1a1766cdf14d3
M: 9c55b2973261b0acb96601818c7693eb1a4cb0a4 127.0.0.1:6380
   slots:[5001-10000] (5000 slots) master
   1 additional replica(s)
M: 964b0c1120266440de20e593f8ea5a53ba013fdb 127.0.0.1:6382
   slots: (0 slots) master
S: 5b29a600982955557bcfa8368a226e688c17e7b6 127.0.0.1:6480
   slots: (0 slots) slave
   replicates 9c55b2973261b0acb96601818c7693eb1a4cb0a4
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 127.0.0.1:6482 to make it join the cluster.
[OK] New node added correctly.

reshard

➜  ~ redis-cli --cluster reshard 127.0.0.1:6379
>>> Performing Cluster Check (using node 127.0.0.1:6379)
M: d463742c293d0f3f688014b1dfd08e40fa416a64 127.0.0.1:6379
   slots:[0-6250],[10001-11596] (7847 slots) master
   1 additional replica(s)
M: 86530a225520347b3b268c6d16b1a1766cdf14d3 127.0.0.1:6381
   slots:[11597-16383] (4787 slots) master
   1 additional replica(s)
S: 6c787a3b61616914ad35dec54652c050fad2778c 127.0.0.1:6479
   slots: (0 slots) slave
   replicates d463742c293d0f3f688014b1dfd08e40fa416a64
S: 0e6ea0a2cec7d05a0cd73cf45a5dfa49254cba12 127.0.0.1:6481
   slots: (0 slots) slave
   replicates 86530a225520347b3b268c6d16b1a1766cdf14d3
M: 9c55b2973261b0acb96601818c7693eb1a4cb0a4 127.0.0.1:6380
   slots:[6251-10000] (3750 slots) master
   1 additional replica(s)
M: 964b0c1120266440de20e593f8ea5a53ba013fdb 127.0.0.1:6382
   slots: (0 slots) master
M: f4083681abc73bd5f55beaac0dfc1afb121db5b6 127.0.0.1:6482
   slots: (0 slots) master
S: 5b29a600982955557bcfa8368a226e688c17e7b6 127.0.0.1:6480
   slots: (0 slots) slave
   replicates 9c55b2973261b0acb96601818c7693eb1a4cb0a4
[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
What is the receiving node ID? 964b0c1120266440de20e593f8ea5a53ba013fdb
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.
Source node #1: d463742c293d0f3f688014b1dfd08e40fa416a64
Source node #2: 9c55b2973261b0acb96601818c7693eb1a4cb0a4
Source node #3: 86530a225520347b3b268c6d16b1a1766cdf14d3
Source node #4: done
...
Do you want to proceed with the proposed reshard plan (yes/no)? yes
...

设置主从关系

➜  ~ redis-cli -p 6482 cluster replicate 964b0c1120266440de20e593f8ea5a53ba013fdb
OK

测试集群

➜  ~ redis-cli -c
127.0.0.1:6379> CLUSTER KEYSLOT haha
(integer) 3662
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 127.0.0.1:6381
OK

删除节点

➜  ~ redis-cli --cluster reshard 127.0.0.1:6382
>>> Performing Cluster Check (using node 127.0.0.1:6382)
M: 964b0c1120266440de20e593f8ea5a53ba013fdb 127.0.0.1:6382
   slots:[0-1249],[5001-6250],[10001-11596] (4096 slots) master
   1 additional replica(s)
S: 6c787a3b61616914ad35dec54652c050fad2778c 127.0.0.1:6479
   slots: (0 slots) slave
   replicates d463742c293d0f3f688014b1dfd08e40fa416a64
M: 86530a225520347b3b268c6d16b1a1766cdf14d3 127.0.0.1:6381
   slots:[11597-16383] (4787 slots) master
   1 additional replica(s)
S: f4083681abc73bd5f55beaac0dfc1afb121db5b6 127.0.0.1:6482
   slots: (0 slots) slave
   replicates 964b0c1120266440de20e593f8ea5a53ba013fdb
S: 0e6ea0a2cec7d05a0cd73cf45a5dfa49254cba12 127.0.0.1:6481
   slots: (0 slots) slave
   replicates 86530a225520347b3b268c6d16b1a1766cdf14d3
S: 5b29a600982955557bcfa8368a226e688c17e7b6 127.0.0.1:6480
   slots: (0 slots) slave
   replicates 9c55b2973261b0acb96601818c7693eb1a4cb0a4
M: 9c55b2973261b0acb96601818c7693eb1a4cb0a4 127.0.0.1:6380
   slots:[6251-10000] (3750 slots) master
   1 additional replica(s)
M: d463742c293d0f3f688014b1dfd08e40fa416a64 127.0.0.1:6379
   slots:[1250-5000] (3751 slots) master
   1 additional replica(s)
[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
What is the receiving node ID? d463742c293d0f3f688014b1dfd08e40fa416a64
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.
Source node #1: 964b0c1120266440de20e593f8ea5a53ba013fdb
Source node #2: done

查看节点信息,显示已经6382节点已经没有槽位分配了

➜  ~ redis-cli
127.0.0.1:6379> CLUSTER NODES
86530a225520347b3b268c6d16b1a1766cdf14d3 127.0.0.1:6381@16381 master - 0 1616548392166 2 connected 11597-16383
d463742c293d0f3f688014b1dfd08e40fa416a64 127.0.0.1:6379@16379 myself,master - 0 1616548388000 9 connected 0-6250 10001-11596
6c787a3b61616914ad35dec54652c050fad2778c 127.0.0.1:6479@16479 slave d463742c293d0f3f688014b1dfd08e40fa416a64 0 1616548391154 9 connected
0e6ea0a2cec7d05a0cd73cf45a5dfa49254cba12 127.0.0.1:6481@16481 slave 86530a225520347b3b268c6d16b1a1766cdf14d3 0 1616548390000 2 connected
9c55b2973261b0acb96601818c7693eb1a4cb0a4 127.0.0.1:6380@16380 master - 0 1616548390000 1 connected 6251-10000
964b0c1120266440de20e593f8ea5a53ba013fdb 127.0.0.1:6382@16382 master - 0 1616548389000 8 connected
f4083681abc73bd5f55beaac0dfc1afb121db5b6 127.0.0.1:6482@16482 slave d463742c293d0f3f688014b1dfd08e40fa416a64 0 1616548391000 9 connected
5b29a600982955557bcfa8368a226e688c17e7b6 127.0.0.1:6480@16480 slave 9c55b2973261b0acb96601818c7693eb1a4cb0a4 0 1616548390143 1 connected

删除节点

➜  ~ redis-cli --cluster del-node 127.0.0.1:6382 964b0c1120266440de20e593f8ea5a53ba013fdb
>>> Removing node 964b0c1120266440de20e593f8ea5a53ba013fdb from cluster 127.0.0.1:6382
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.
➜  ~ redis-cli --cluster del-node 127.0.0.1:6482 f4083681abc73bd5f55beaac0dfc1afb121db5b6
>>> Removing node f4083681abc73bd5f55beaac0dfc1afb121db5b6 from cluster 127.0.0.1:6482
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.
➜  ~ redis-cli
127.0.0.1:6379> CLUSTER NODES
86530a225520347b3b268c6d16b1a1766cdf14d3 127.0.0.1:6381@16381 master - 0 1616548757000 2 connected 11597-16383
d463742c293d0f3f688014b1dfd08e40fa416a64 127.0.0.1:6379@16379 myself,master - 0 1616548760000 9 connected 0-6250 10001-11596
6c787a3b61616914ad35dec54652c050fad2778c 127.0.0.1:6479@16479 slave d463742c293d0f3f688014b1dfd08e40fa416a64 0 1616548760970 9 connected
0e6ea0a2cec7d05a0cd73cf45a5dfa49254cba12 127.0.0.1:6481@16481 slave 86530a225520347b3b268c6d16b1a1766cdf14d3 0 1616548759960 2 connected
9c55b2973261b0acb96601818c7693eb1a4cb0a4 127.0.0.1:6380@16380 master - 0 1616548758000 1 connected 6251-10000
5b29a600982955557bcfa8368a226e688c17e7b6 127.0.0.1:6480@16480 slave 9c55b2973261b0acb96601818c7693eb1a4cb0a4 0 1616548759000 1 connected

4.9. 命令总结

# Redis 命令
> CLUSTER meet 127.0.0.1 6380 # 将节点相连

# 槽位分配
redis-cli -h 127.0.0.1 -p 6379 cluster addslots {0..5000}

# 主从复制
redis-cli -h 127.0.0.1 -p 6479 cluster replicate 9fa624c3cf1bef0b7dd58347889505ff5982eed4

# 新增节点
redis-cli --cluster add-node 127.0.0.1:6382 127.0.0.1:6379

# reshard
redis-cli --cluster reshard 127.0.0.1:6379

# 删除节点
redis-cli --cluster del-node 127.0.0.1:6382 964b0c1120266440de20e593f8ea5a53ba013fdb

5. 参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值