redis的主从复制(全量复制、部分复制)

redis的主从复制
        redis主从复制指将一台redis服务器的数据复制到其他redis服务器,前者称为主节点(master),后者称为从节点(salve),数据的复制是单向的,只能从主节点到从节点默认情况下,每台redis服务器都是主节点,添加从节点配置后才会变成从节点,一个主节点可以有多个从节点,一个从节点只能有一个主节点。
从节点配置:在redis.conf文件中,添加配置 slaveof 主节点IP 主节点port
        主从复制除了实现数据同步复制外,还实现了数据的读写分离,主节点负责写,从节点负责读(默认配置slave-read-only yes),在写少读多的时候,多个从节点可以减少服务器压力,提高并发量。
一主多从的情况下要先启动主节点,从节点启动时与主节点建立socket连接,启动日志如下:
从节点
在这里插入图片描述
主节点
在这里插入图片描述

主从服务器版本需一致,否则报如下错误:

在这里插入图片描述
复制流程:从节点执行slaveof ip port后(或事先在配置文件中已配置),变成真正意义的从节点,
1.从节点与主节点建立socket连接(TCP)
2.从节点发送ping,主节点返回pong,连接正常,可以处理请求及同步数据
3.复制数据(主节点判断是全量复制还是部分复制)
redis4.0之前和4.0之后的版本对于主节点进行全量复制和部分复制的标准不一样。
需要先理解几个名词:
1.run_id:redis的运行id,每次启动都会生成一个run_id,客户端使用info server可查看
2.复制偏移量:主节点每次向从节点同步写命令,该数据的大小会累加到复制偏移量上,比如 set a 5,数据大小为1个字节,则主节点和从节点的复制偏移量都会加1,主从节点在客户端执行info replication可以查看偏移量大小
3.复制积压缓冲区:主从关系建立后,主节点的复制积压缓冲区创建,它是一个先进先出的队列,大小可在配置文件中配置,主从节点同步数据,除了将数据大小累加到自身的复制偏移量上,主节点还会累加到自身的复制积压缓冲区,方便从节点断线重连后可进行部分复制
4.0之前版本的复制:run_id和复制偏移量来判断进行全量复制还是部分复制
        当从节点首次连接主节点,向主节点发送复制请求,此时从节点没有主节点的runid,只能进行全量复制(不可避免的全量复制),首次复制后,从节点保存了主节点的runid,之后断线重连再次请求数据同步时,会带上主节点的runid和自身的复制偏移量,主节点通过判断runid是否和自己相同,选择全量复制还是部分复制,run_id相同的话,再进一步判断复制偏移量的大小是否在复制积压缓冲区的大小内,比如断线重连后从节点的复制偏移量为100,此时主节点的复制积压缓冲区大小为95~200,主节点的复制偏移量为150,那么从节点缺失的数据就是101-150,刚好在复制积压缓冲区内,这样就可以进行部分复制;如果从节点的复制偏移量为90,那么缺失的数据就是91-150,不在复制积压缓冲区内,这样就要进行全量复制了。
4.0之前版本的redis在以下情况会全量复制:
(1)从节点首次连接主节点(无run_id)
(2)从节点重启后连接主节点(run_id丢失)
(3)从节点的复制偏移量不在复制积压缓冲区内(在实际项目中,把复制积压缓冲区设置为合适的大小是非常重要的)
4.0之后版本的复制:根据master_replid和复制偏移量来判断进行全量复制还是部分复制
        master_replid:主节点复制ID,redis启动后就会生成master_replid,当主从关系建立后,主节点master_replid发生变化,并且从节点的master_replid保存主节点的master_replid,请求复制原理与4.0之前的类似,只不过run_id更换为master_replid.如图:
在这里插入图片描述

客户端使用info replication查看节点信息,发现还有个master_replid2,这个又表示什么意思呢
按照一主两从的模式来举例(同时也配置了哨兵):
        当master挂机后,从节点切换成主节点后(配置了哨兵模式的前提下,投票生成主节点),新生成的主节点会将之前的master的master_replid存储在master_replid2里面,自己 生成一个新的复制id,作为自己master的标识,保存在master_replid中;另一个从节点的master_replid保存了新master的master_replid,master_replid2保存了旧master的master_replid;当之前的master重启后,会自动成为当前master节点的slave节点,并将当前master节点的master_replid存储在自己的master_replid中,master_replid2会是空值,因为是重启了,不会记录之前的值了
         简单来说:主从关系建立后master_replid,保存的是当前主节点的master_replid,master_replid2保存的是上一个主节点的master_replid。
下一篇博客讲redis的哨兵模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值