主备模式,可以实现Redis数据的跨主机备份。

程序端连接到高可用负载的VIP,然后连接到负载服务器设置的Redis后端real server,此模式不需要在程序里面配置Redis服务器的真实IP地址,当后期Redis服务器IP地址发生变更只需要更改redis 相应的后端real server即可,可避免更改程序中的IP地址设置。

拓扑:
在这里插入图片描述
配置环境:master IP 10.0.0.31 slave IP 10.0.0.32

一、配置Redis主从注意事项

1、Redis Slave 也需要开启RDB持久化
2、配置与Master同样的连接密码    #因为后期slave会有提升为master的可能,Slave端切换master同步后会丢失之前的所有数据
3、配置主从前,redis只有配置文件以及命令执行文件,删除其他所有文件
4、slave服务器一般为read-only

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

二、配置主从(命令方式或修改配置文件 二选一)

只需要在slave服务器上配置即可,master不需要配置。

2.1 命令方式配置主从

#版本4(包括版本4)之前命令为slaveof,版本4之后为REPLICAOF
10.0.0.32:6379> SLAVEOF 10.0.0.31 6379
OK
10.0.0.32:6379> CONFIG SET masterauth 123456
OK

2.2 修改配置文件方式配置主从

root@ubuntu1804:~# vim /apps/redis/etc/redis.conf
########### REPLICATION ###########
slaveof 10.0.0.31 6379
masterauth 123456

三、查看matser和slave的info信息

10.0.0.31:6379> INFO
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.32,port=6379,state=online,offset=616,lag=0
10.0.0.32:6379> INFO
# Replication
role:slave
master_host:10.0.0.31
master_port:6379
master_link_status:up

四、同步日志

slave的redis日志文件
在这里插入图片描述

五、主从复制详细过程

Redis支持主从复制分为全量同步和增量同步,首次同步是全量同步。
redis 的主从同步是非阻塞的,master收到从服务器的sync(2.8版本之前是PSYNC)命令会fork一个子进程在后台执行bgsave命令,并将新写入的数据写入到一个缓冲区里面,bgsave执行完成之后并生成的将RDB文件发送给客户端,客户端将收到后的RDB文件载入自己的内存,然后redis master再将缓冲区的内容在全部发送给redis slave。
之后的同步slave服务器会发送一个offset的位置(等同于MySQL的binlog的位置)给主服务器,主服务器检查后位置没有错误将此位置之后的数据包括写在缓冲区的积压数据发送给redis从服务器,从服务器将主服务器发送的导入数据写入内存,这样一次完整的数据同步,再之后再同步的时候从服务器只要发送当前的offset位 置给主服务器,然后主服务器根据相应的位置将之后的数据发送给从服务器保存到其内存即可。

Redis全量复制一般发生在Slave首次初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体主从同
步骤如下:
1)从服务器连接主服务器,发送SYNC命令; 
2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB快照文件并使用缓冲区记录此后执行的所有写命令; 
3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令; 
4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照; 
5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令; 
6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令; 
7)后期同步会先发送自己slave_repl_offset位置,只同步新增加的数据,不再全量同步。

在这里插入图片描述

六、主从同步配置参数优化

repl-diskless-sync no #是否使用无盘同步RDB文件,默认为no,no为不使用无盘,将rdb保存到磁盘再发给slave
repl-diskless-sync-delay 5 #Master准备好RDB文件后等等待传输时间
repl-ping-slave-period 10 #slave端向server端发送ping的时间区间设置,默认为10秒 
repl-timeout 60 #设置超时时间
repl-disable-tcp-nodelay no #是否启用TCP_NODELAY,如设置成yes,则redis会合并小的TCP包从而节省带宽,但会增加同步延迟(40ms),造成master与slave数据不一致,假如设置成no,则redis master会立即发送同步数据,没有延迟,前者关注性能,后者关注redis服务中的数据一致性。
repl-backlog-size 3072mb #master的写入数据缓冲区,用于记录自上一次同步后到下一次同步过程中间的写入命令。
repl-backlog-ttl 3600 #如果一段时间后没有slave连接到master,则backlog size的内存将会被释放。如果值为0则表示永远不释放这部份内存。
slave-priority 100 #slave端的优先级设置,值是一个整数,数字越小表示优先级越高。当master故障时将会按照优先级来选择slave端进行恢复,如果值设置为0,则表示该slave永远不会被选择。

min-slaves-to-write 1 #设置一个master端的可用slave少于多少个 
min-slaves-max-lag 20 #设置所有slave延迟时间都大于多少秒时,master不接收写操作(拒绝写入)。

七、主从切换

关掉master的redis

10.0.0.31:6379> SHUTDOWN

slave的redis目前为只读,没办法写入数据

10.0.0.32:6379> set a b
(error) READONLY You can't write against a read only slave.

需要将slave角色提升为master

10.0.0.32:6379> SLAVEOF no one
OK
10.0.0.32:6379> set a b
OK
10.0.0.32:6379> INFO
# Replication
role:master
connected_slaves:0

八、常见问题汇总

8.1 master密码不对

配置的master密码不对,导致验证不通过而无法建立主从同步关系
在这里插入图片描述

8.2 Redis版本不一致

不同的redis 版本之间存在兼容性问题,因此各master和slave之间必须保持版本一致。
RDB文件互相识别不了,无法加载RDB文件
在这里插入图片描述

8.3 无法远程连接

在开启了安全模式情况下,没有设置bind地址或者密码。

[root@redis-s1 ~]# redis-cli -h 192.168.7.104 192.168.7.104:6379> KEYS * 
(error) DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 3) If you started the server manually just for testing, restart it with the '--protected- mode no' option. 4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.

九、汇总

缺点:需要手动去将slave提升到master,一般使用哨兵模式

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐