Redis主从复制
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
- 一个master可以有多个slave
- 一个slave只能有一个master
- 数据流向是单向的,master到slave
主从复制的作用
单机存在的问题
单机如果硬件发生故障,redis发生宕机且无法重启,那么会造成巨大的问题。
计算机的内存是有效的,不断扩大内存的方式显然是不现实的。
单机的情况下,在高读写情况下,读的性能会收到限制。为了高可用,可以做读写分离。
总结
- 作为数据副本
- 扩展读性能
主从复制的配置
由于资源限制,演示使用单机多部署的方式。
演示的准备工作
- 在redis安装目录,新建
data
文件夹,以及config
文件夹
- 复制redis.conf到config文件夹。
cp redis.conf config/redis-6379.conf
, cp redis.conf config/redis-6380.conf
- 以配置文件的方式启动redis。
redis-server redis-6379.conf
,redis-server redis-6380.conf
,并修改端口号保存 - 打开redis客户端。
redis-cli -p 6379
,redis-cli -p 6380
- 我们默认6379为主机。6380为从机。
slaveof命令
# 在6380的客户端
slaveof 127.0.0.1 6379
使用info replication
命令查看主从关系
配置conf文件
redis.conf中关于主从复制的部分配置:
# replicaof <masterip> <masterport> 配置主节点的ip以及端口号
# masterauth <master-password> 填写主节点的密码
replica-read-only yes 默认从节点为只读
我们可以修改redis-6380.conf文件,并重新启动redis。效果如上图不做展示。
当对从节点进行写操作时:
如何结束主从关系
我们可以通过slaveof no one
来解除主从关系,此时从机将变为默认(master)。
复制内部做了什么事
在解释复制原理之前,我们需要了解一下几个概念:
- psync
- runid
- offset复制偏移量
- 复制积压缓冲区(repl_back_buffer)
详细解析可查看博客:psync原理
psync
Redis在2.8版本提供了PSYNC命令来带代替SYNC命令,为Redis主从复制提供了部分复制的能力。
PSYNC <runid> <offset>
runid:主服务器ID
offset:从服务器最后接收命令的偏移量
runid
每个Redis服务器都会有一个表明自己身份的ID。在PSYNC中发送的这个ID是指之前连接的Master的ID,如果没保存这个ID,PSYNC的命令会使用”PSYNC ? -1” 这种形式发送给Master,表示需要全量复制。
offset复制偏移量
在主从复制的Master和Slave双方都会各自维持一个offset。Master成功发送N个字节的命令后会将Master的offset加上N,Slave在接收到N个字节命令后同样会将Slave的offset增加N。Master和Slave如果状态是一致的那么它的的offset也应该是一致的。
复制积压缓冲区(repl_back_buffer)
复制缓冲区,又名复制积压缓冲区,是一个先进先出(FIFO)的队列,用于存储服务器执行过的命令,每次传播命令,master都会将传播的命令记录下来,并存储在复制缓冲区
全量复制以及部分复制
大家先看完大佬分享的psync的原理,再看下面的解析会更透彻一点。
全量复制
- 当从服务器与主服务器第一次连接,从节点会根据是否保存有主节点runid来判断是否第一次复制。
- 查无runid,此时向主节点发生
psync?-1
。 - master收到命令,并返回一个全量复制的命令,并带上自己的runid以及偏移量。
- slave会保存master发送的信息
- master调用
bgsave
生成RDB文件,并把届时收到的写请求写入到复制积压缓冲区
。 - 快照生成完毕后,master会将RDB以及buffer发送到slave。
- slave接收到数据后,会清除缓存
flush all
,加载RDB文件以及buffer。
全量复制是一个开销较大的操作
- bgsave的时间
- RDB网络传输时间
- 从节点数据清除时间
- 从节点加载RDB时间
- 可能的AOF重写时间(保持数据最新的状态,如果开启AOF的话)
部分复制
部分复制一般发生在:
- 从服务器断线后重新和之前连接的主服务器恢复连接,即断线后重复制
- 网络抖动,数据不同步
- slave于master断开连接后,master接收到的命令依然会写入到
复制积压缓冲区
。 - slave重连后,向master发送
psync offset runid
,带上偏移量以及runid。 - master先对runid进行对比,判断是否和本节点的runid一致。
- 然后master会对偏移量进行一个对比,如果偏移量在缓冲区的区间(缓冲区是一个FIFO的队列)内,master向slave发送CONTINUE,此时Slave只需要等待master传回失去连接期间丢失的命令。
如果runid不一致或者偏移量差距过大。
master会返回FULLRESYNC runid offset
,进行一个全量复制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)