天天看点

Redis主从复制集群的实现1、redis主从复制架构2、主从复制的实现3、主从复制故障恢复

1、redis主从复制架构

Redis主从复制集群的实现1、redis主从复制架构2、主从复制的实现3、主从复制故障恢复

2、主从复制的实现

Redis Slave 也要开启持久化并设置和master同样的连接密码,因为后期slave会有提升为master的可能,Slave端切换master同步后会丢失之前的所有数据,而通过持久化可以恢复数据

一旦某个Slave成为一个master的slave,Redis Slave服务会清空当前redis服务器上的所有数据并将master的数据导入到自己的内存,但是如果只是断开同步关系后,则不会删除当前已经同步过的数据。

当配置Redis复制功能时,强烈建议打开主服务器的持久化功能。否则的话,由于延迟等问题,部署的主节点Redis服务应该要避免自动启动。

2.1、启用主从同步

默认redis状态是master,需要转换成slave角色并指向master服务器的IP+PROT+Password。

在从节点执行REPLICAOF MASTER_IP PORT指令可以启用主从同步复制功能,早期版本使用SLAVEOF指令。

127.0.0.1:6379> REPLICAOF MASTER_IP PORT
127.0.0.1:6379> CONFIG SET masterauth <masterpass>
           
10.0.0.100  Redis-6.2.7  master.stars.org
10.0.0.101  Redis-6.2.7  slave1.stars.org
10.0.0.102  Redis-6.2.7  slave2.stars.org
           

2.2、master节点

#在master上添加key1
root@master:~# redis-cli 
127.0.0.1:6379> AUTH wm521314
OK
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:6345b46390bc8d2997c78652429800b3d19d1772
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

127.0.0.1:6379> SET key1 v1-master
OK
127.0.0.1:6379> KEYS *
1) "key1"
127.0.0.1:6379> GET key1
"v1-master"

#以下内容是先要配置slave节点才能看到slave的信息
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.0.0.101,port=6379,state=online,offset=2296,lag=1
slave1:ip=10.0.0.102,port=6379,state=online,offset=2296,lag=0
master_failover_state:no-failover
master_replid:b5c339c72d9aaf501654f4514f16b2fdbe226dd8
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2296
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2296

#可以查看连接状态
root@master:~# ss -tn | grep 6379
ESTAB   0         0                 127.0.0.1:23801          127.0.0.1:6379     
ESTAB   0         0                10.0.0.100:6379          10.0.0.101:13792    
ESTAB   0         0                10.0.0.100:6379          10.0.0.102:35376    
ESTAB   0         0                 127.0.0.1:6379           127.0.0.1:23801
#查看master上面的日志
root@master:~# tail -f /apps/redis/log/redis-6379.log
929:M 19 May 2022 20:03:18.575 * Full resync requested by replica 10.0.0.102:6379
929:M 19 May 2022 20:03:18.575 * Starting BGSAVE for SYNC with target: disk
929:M 19 May 2022 20:03:18.576 * Background saving started by pid 3815
3815:C 19 May 2022 20:03:18.582 * DB saved on disk
3815:C 19 May 2022 20:03:18.582 * RDB: 0 MB of memory used by copy-on-write
929:M 19 May 2022 20:03:18.666 * Background saving terminated with success
929:M 19 May 2022 20:03:18.667 * Synchronization with replica 10.0.0.102:6379 succeeded
929:M 19 May 2022 20:07:32.083 # Connection with replica 10.0.0.102:6379 lost.
929:M 19 May 2022 20:07:32.102 * Replica 10.0.0.102:6379 asks for synchronization
929:M 19 May 2022 20:07:32.102 * Partial resynchronization request from 10.0.0.102:6379 accepted. Sending 350 bytes of backlog starting from offset 1779.

           

2.3、slave1节点

root@slave1:~# redis-cli
127.0.0.1:6379> AUTH wm521314
OK
127.0.0.1:6379> INFO replication	#默认查看当前角色是master
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:98efad4633429d97805b9144cbfb2963b0d27bbb
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

#在slave1上设置master的IP和端口
127.0.0.1:6379> REPLICAOF 10.0.0.100 6379
OK
#还需要设置master的密码,这样才可以同步
127.0.0.1:6379> CONFIG SET masterauth wm521314
OK
127.0.0.1:6379> INFO replication    #设置完查看后角色就变slave了,也指向了master节点10.0.0.100
# Replication
role:slave
master_host:10.0.0.100
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_read_repl_offset:0
slave_repl_offset:0
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:b5c339c72d9aaf501654f4514f16b2fdbe226dd8
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:0
#查看是否已经同步成功,显示下面结果就成功了
127.0.0.1:6379> KEYS *
1) "key1"
127.0.0.1:6379> GET key1
"v1-master"

#上面操作是只是在机器没重启有效,当机器一重启就无效了,想要永久生效需要写到配置文件中
root@slave1:~# vim /apps/redis/etc/redis.conf
#在文件最后面加上这两行
replicaof 10.0.0.100 6379	#指定master的IP和端口号
masterauth wm521314	#指定master的密码

#编辑完后,重启一下服务
root@slave1:~# systemctl restart redis
#再次登陆查看连接的转态
root@slave1:~# redis-cli
127.0.0.1:6379> AUTH wm521314
OK
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.0.0.100
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:980
slave_repl_offset:980
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:b5c339c72d9aaf501654f4514f16b2fdbe226dd8
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:980
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:980

#查看slave上的redis日志
root@slave1:~# tail -f /apps/redis/log/redis-6379.log
3894:S 19 May 2022 11:50:03.265 * DB loaded from disk: 0.000 seconds
3894:S 19 May 2022 11:50:03.265 * 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.
3894:S 19 May 2022 11:50:03.265 * Ready to accept connections
3894:S 19 May 2022 11:50:03.266 * Connecting to MASTER 10.0.0.100:6379
3894:S 19 May 2022 11:50:03.266 * MASTER <-> REPLICA sync started
3894:S 19 May 2022 11:50:03.267 * Non blocking connect for SYNC fired the event.
3894:S 19 May 2022 11:50:03.268 * Master replied to PING, replication can continue...
3894:S 19 May 2022 11:50:03.269 * Trying a partial resynchronization (request b5c339c72d9aaf501654f4514f16b2fdbe226dd8:1).
3894:S 19 May 2022 11:50:03.269 * Successful partial resynchronization with master.
3894:S 19 May 2022 11:50:03.269 * MASTER <-> REPLICA sync: Master accepted a Partial Resynchronization.

#在slave上面是没办法写入数据的,因为是只读的状态
root@slave1:~# redis-cli
127.0.0.1:6379> AUTH wm521314
OK
127.0.0.1:6379> set key2 v2-slave
(error) READONLY You can't write against a read only replica.

#想要取消主从复制的话,在slave上执行REPLIATOF NO ONE指令就可以取消主从复制了
#取消主从复制后,会断开和master的连接不再主从复制, 但不会清除slave上已有的数据
127.0.0.1:6379> REPLICAOF NO ONE
OK
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:1b50e6356d58238a21ddec371b8125f83af29bad
master_replid2:b5c339c72d9aaf501654f4514f16b2fdbe226dd8
master_repl_offset:1498
second_repl_offset:1499
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1498
127.0.0.1:6379> KEYS *
1) "key1"
127.0.0.1:6379> GET key1
"v1-master"
           

2.4、slave2节点

root@slave2:~# redis-cli -a wm521314
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:eedcf62d38211ab499bb822f334a46d4fc4a26a6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

#设置master节点的IP和端口
127.0.0.1:6379> REPLICAOF 10.0.0.100 6379
OK
127.0.0.1:6379> CONFIG SET masterauth wm521314
OK
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.0.0.100
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_read_repl_offset:1806
slave_repl_offset:1806
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:b5c339c72d9aaf501654f4514f16b2fdbe226dd8
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1806
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1779
repl_backlog_histlen:28

#查看master上数据是否同步过来了
127.0.0.1:6379> KEYS *
1) "key1"
127.0.0.1:6379> GEt key1
"v1-master"

#修改配置文件让其永久生效
root@slave2:~# vim /apps/redis/etc/redis.conf
#在文件最后行加上下面两行
replicaof 10.0.0.100 6379
masterauth wm521314

#编辑保存完后,记得要重启一下服务
root@slave2:~# systemctl restart redis

#重启后再次登陆查看连接状态
root@slave2:~# redis-cli -a wm521314
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.0.0.100
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_read_repl_offset:2268
slave_repl_offset:2268
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:b5c339c72d9aaf501654f4514f16b2fdbe226dd8
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2268
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1779
repl_backlog_histlen:490
           

3、主从复制故障恢复

3.1、slave节点故障和恢复

3.2、master节点故障和恢复

3.2、主从复制故障恢复实现

#当master节点挂了
root@master:~# systemctl stop redis


#在登陆slave1节点查看是否连接断开
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.0.0.100
master_port:6379
master_link_status:down	#这里会显示down,表示无法连接到master
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:3654
slave_repl_offset:3654
master_link_down_since_seconds:47
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:b5c339c72d9aaf501654f4514f16b2fdbe226dd8
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3654
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3654
#发现master挂了后就停止slave的同步,并提升一个slave节点为新的master
127.0.0.1:6379> REPLICAOF NO ONE
OK
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:5ce855701c79fbd6b5026c60f0891281460683db
master_replid2:b5c339c72d9aaf501654f4514f16b2fdbe226dd8
master_repl_offset:3654
second_repl_offset:3655
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3654
#现在是可以写数据的,因为把slave节点提升为master节点了
127.0.0.1:6379> keys *
1) "key1"
127.0.0.1:6379> set key2 new-master
OK
127.0.0.1:6379> GET key2
"new-master"
127.0.0.1:6379> DBSIZE
(integer) 2


#在slave2上修改成新的master节点
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.0.0.100
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:3654
slave_repl_offset:3654
master_link_down_since_seconds:444
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:b5c339c72d9aaf501654f4514f16b2fdbe226dd8
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3654
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1779
repl_backlog_histlen:1876
#修改slave2节点指向刚刚提升的新master节点10.0.0.101
127.0.0.1:6379> REPLICAOF 10.0.0.101 6379
OK
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.0.0.101
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_read_repl_offset:3731
slave_repl_offset:3731
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:5ce855701c79fbd6b5026c60f0891281460683db
master_replid2:b5c339c72d9aaf501654f4514f16b2fdbe226dd8
master_repl_offset:3731
second_repl_offset:3655
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1779
repl_backlog_histlen:1953
#验证刚刚提升的master节点数据是否有同步过来
127.0.0.1:6379> KEYS *
1) "key2"
2) "key1"
127.0.0.1:6379> GET key2
"new-master"
           

继续阅读