一、什么是Redis主从复制?
主从复制:是指将一台Redis服务的数据,复制到其他Redis服务器上。前者称为主节点(master),后者称为从节点(slave)。数据的复制是单向的,只能从主节点到从节点。
默认情况下,每一台Redis服务都是主节点,一个主节点可以有多个从节点(也可以没有),但一个从节点只能有一个主节点。
二、为什么使用Redis主从复制?
假设只有一台Redis服务,这就是单机模式。
第一个问题是当服务器宕机,数据丢失,如果数据很重要,那会造成很大的损失。
第二个问题是内存问题,一台服务器的内存是会达到峰值的,一台服务器也不可能无限升级。
针对上述问题,我们需要准备多台服务器,配置主从复制。将数据保存在多台服务器上,并且保证每台服务器的数据是同步的。即使有一台服务器宕机,也不影响用户的使用。redis可以继续实现高可用,同时实现数据的冗余备份。
三、使用Redis主从复制的作用是?
1,数据冗余,实现数据的热备份,这也是持久化实现的另一种方式。
2,针对单机故障问题,一个节点故障,其他节点可以提供服务,不影响用户使用。实现了快速恢复故障,这也是服务冗余。
3,读写分离,master服务主要用来写,slave服务主要用来读数据。可以提高服务器的负载能力,可以根据需求的变化,添加从节点的数量。
4,负载均衡,同时配合读写分离,由主节点提供写服务,从节点提供读服务,分担服务器的负载。在写少读多的情况下,通过多个从节点分担读负载,能够大大提高Redis服务的并发量和负载。
5,高可用的基石,主从复制是哨兵和集群模式能够实施的基础。
四、配置Redis主从复制
具体配置过程可以网上借鉴。
五、主从复制的工作原理
1,主从复制的三个阶段
Redis主从复制的完整工作流程有以下三个阶段。
- 建立连接过程:这个是slave跟master建立连接的过程。
- 数据同步的过程:是maser同步数据给slave的过程。
- 命令传播过程:是反复同步数据的过程。
2,第一阶段,建立连接过程
上图是完整介绍了主从复制建立建立工作流程。通过简短的话语来描述上述的工作流程。
1,设置master的地址和端口,保存master的信息。
2,建立socket连接。
3,持续发送ping命令。
4,身份验证。
5,发送slave端口信息。
在建立连接的工作中,从节点保存主节点master的地址和端口,主节点master保存从节点的端口信息。
3,第三阶段:数据同步阶段
这张图详细的描述了从节点第一次连接到主节点的数据同步过程。
当slave从节点第一次连接到master主节点时,先会执行一次全量复制,这一次全量复制是无法避免的。
全量复制完成后,主节点会发送复制缓存区的数据给从节点。然后从节点就会执行bgrewriteaof恢复数据,这就是部分复制。
这一阶段,提到了三个知识点,全量复制,部分复制,复制缓存区。
4,第三阶段:命令传播阶段
当master服务的数据发生修改后,主从服务数据就会不一致,此时就会让主从服务的数据同步到一致,这个过程叫命令传播。
master会将接收到的数据变更命令发送给slave,slave接收到命令后会去执行,从而让主从数据达到一致。
命令传播阶段的部分复制
- 在出现断网的情况下,或者网络抖动会导致连接断开
- 这种情况下主节点master还是会往复制缓冲挤压区写数据
- 从节点会继续尝试连接主节点
- 当从节点把自己的runid和复制偏移量发送给主节点,并开始执行pysnc命令同步
- 如果主节点判断复制偏移量在复制缓冲区范围内,就会发送continue命令,将复制缓冲区的数据发送给从节点
- 从节点接收到数据执行bgrewriteaof命令,同步数据
六、图解主从复制的原理
1-4是全量复制,5-8是部分复制
七、主从复制的常见问题
1,从节点网络中断偏移量越界导致全量复制
由于网络的不佳,从节点中断连接。复制缓冲区内存太小导致数据溢出,随着从节点偏移量越界,导致全量复制,有可能反复的全量复制。
解决方案:修改复制缓冲区内存大小,repl-backlog-size
2,频繁的网络中断
由于主节点cpu占用过高,或者从节点频繁连接。出现这种情况的结果是,主节点各种资源被严重占用,包括但不限于缓冲区,宽带,连接等。
解决方案:
设置从节点超时释放,
设置参数:repl-timeout
这个参数默认为60秒,超过60秒,释放slave。
3,数据不一致问题
由于网络因素,多个节点存在数据不一致问题,这个问题是不可避免的。
这里提供两个可供参考的解决方案:
第一个,如果数据需要高度一致,那么配置一台Redis服务器,读写都是在一台服务器上。这种方式仅限于少量数据,并且数据高度一致。
第二个,监控主从节点的偏移量,如果从节点的延迟过大,暂时屏蔽客户端对此从节点的访问。
设置参数 slave-serve-stale-data yes|no,这个参数一旦设置,就只能响应info slaveof等少数命令。
4,从节点故障
这个问题直接在客户端维护一个可用节点列表,当从节点故障,切换到另一个可用从节点来进行工作。
学习记录回顾总结。
参考资料:https://www.cnblogs.com/fkaka/p/13029853.html
感谢。