Redis主从复制原理

Redis主从复制
1.背景
单机redis存在的问题:
机器故障:导致redis不可用,数据丢失
容量瓶颈:容量不能水平扩展
QPS瓶颈:一台机器的处理能能力、网络带宽终究是有限的,如果能够负载均衡到各个机器,能够有效的提高性能
2.主从复制的作用
数据冗余:主从复制实现了数据的热备份,是redis持久化之外的一直数据冗余的方式
故障恢复:当主节点出现故障时,从节点可以顶上,作为主节点提供服务
读写分离:提高了负载
3.配置信息
略。。。(网上有资料)
4.原理
Reids从服务重启时,会发送PSYNC命令给主服务去同步数据
大体可以分为3个阶段,建立连接,数据同步,命令传播
(1)建立连接
1.保存主节点信息
建立主从关系时会将主节点的信息保存再来
2.建立socket连接
通过保存下来的主节点信息,创建socket连接,如果连接成功,为该socket建立一个专门处理复制工作的文件事件处理器。
3.发送ping命令
当主从节点建立连接后,从节点会像主节点发送ping命令,目的是为了验证socket是否可用和判断主节点是否可以处理请求
可能得到的回复有3种:
PONG:说明当前的socket可用,且主节点可以处理该请求
超时:说明当前的socket不可用,重试
其他命令:说明主节点正在处理其他业务,重试
4.身份验证
如果主节点设置了requirepass参数,则从节点必须要像主节点进行认证。只有当两个节点的masterauth一致才可以继续。
(2)数据同步
主节点接受到了从节点的PSYNC同步命令,主线程会fork出一个子线程进行RDB数据复制,fork时redis是阻塞状态,服务不可用。短暂的fork之后,父线程便可继续提供服务。
数据的同步分为全量同步及部分同步,引入runid和偏移量来判断是否需要全量同步。因为全量同步的开销非常大,所有应该尽量避免全量同步。
1.部分同步的原理
主节点维护了一个复制积压缓冲区,该缓冲区有大小的限制,如果从节点传过来的runid相同,但是offset偏小。就会根据当前的offset结合从节点offset进行判断。如果相差的数据在缓冲区里,便可执行部分同步,将缓冲区的数据同步到从节点。如果超出缓冲区的范围就必须执行全量同步,所以要合理的评估缓冲区的大小。

2.旧版本部分同步的缺陷
如果引入哨兵机制,实现故障转移。原来维护的runid是主节点的信息,如果主节点挂了,经过选举,从节点成为了新的主节点。那么现在的runid势必也不一样。如果是一主多从的结构,其他的从节点向新的主节点同步数据时,都会因为runid的不同导致全部执行全量同步。
3.新版本解决缺陷原理
参考redis4.0 PSYNC2.0机制
在这里插入图片描述

新版本的redis通过引入repl-id和repl-offset解决。在建立主从关系时,master会将自己的repl-id传递给slave,这样就能保证所有slave的server.replid与master的replid相同。如果master节点挂了,slave1节点通过选举成为新的master节点,那么会将server.repid改成自己的,但是之前的值会保存下来。以master_replid2和second_repl_offset存储。
当slave2发送同步命令时,master会进行判断,master_replid会不匹配,但是master_replid2匹配,这样就走部分同步。
前提时offset不超过复制积压缓冲区的大小,超过了还是要走全量同步。
(3)命令传播
在主节点完成数据同步之后,主节点已将当前的数据同步给从节点了,但是主节点还是不断的接受新的命令。为了保证主从数据一致性,主节点需要不断的将写命令发送给从节点,这是个异步的过程。

5.线程模型
Redis在单线程模式下还能支持高并发的一个重要原因就是redis的线程模型是基于非阻塞的IO多路复用机制。
Redis基于reactor模式开发了网络事件处理器,这个处理器叫做文件事件处理器。由于这个事件处理器是单线程的,所以redis才叫做单线程的模型。
事件处理器采用IO多路复用机制同时监听多个Socket,每个socket绑定一个事件处理器。

模型如下:
在这里插入图片描述

由上图可知,文件事件处理器的结构包含了四个部分:
1.多个Socket
2.IO多路复用程序
3.文件事件分派器
4.事件处理器

多个socket产生多个不同的事件,IO多路复用程序就会给事件定义不同的状态,并放入队列中,通过这个队列,以有序、同步、每次一个事件的方式传送至文件事件分派器。
Redis中,socket会产生 AE_READABLE 和 AE_WRITABLE 事件:
当socket变得可读时或者有新的可以应答的socket出现时,socket就会产生一个AE_READABLE事件。
当socket变得可写时,会产生 AE_WRITABLE事件

事件处理器:
1.连接应答处理器
2.命令请求处理器
3.命令回复处理器

具体流程:
在这里插入图片描述

参考:
https://www.cmsblogs.com/article/1391390758589829120

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值