日常学习小结,不计格式、不计内容,只做笔记之用,若有不对请留言赐教!!!
主从复制
redis将主节点上数据拷贝到从节点上。只能从主节点复制到从节点。
作用
实现数据冗余、服务冗余、负载均衡,即高可用、读写分离。
复制过程
-
连接准备
a. 从节点保存主节点ip、port,异步发送slaveof命令,主动与主节点尝试连接,连接不上不停止,除非slaveof no one命令停止。
b. 主从建立连接,从节点发送ping命令到主节点,判断socket是否可以正常请求,主节点会返回pong,超时、非pong。
c. 身份验证。
d. 以上步骤都成功,将自己的ip、port发给主节点。 -
同步数据
全量复制:
a. 命令:psync ? -1 ?:主节点的runid -1:偏移量,代表全量复制。
b. 适用场景:当新节点加入集群、或节点宕机一段时间,部分复制不可用时。
c. 原理:
c1. 从节点向主节点发送psync命令。
c2. 主节点收到从节点发过来的全量复制命令,执行BGSAVE命令,在子进程中生成 RDB文件,主进程继续接收写请求,将接收到的写请求写进复制缓冲区。
c3. 主节点将RDB文件传给从节点,从节点接收到文件,先清空自己的旧数据,在加载RDB文件,达到与主节点bgsave时数据一致。
c4. 主节点将复制缓冲区的写命令传给从节点,从节点执行这些命令,达到数据一致。部分复制:
a. 命令:psync runid offset, offset:偏移量
b. 使用场景: 由于脑裂问题,从节点短暂下线后又上线。
c. 组成:偏移量、复制积压缓冲区、服务器运行id
d. 原理:
d1. 从节点向主节点发送部分复制命令,并将自己的偏移量发送给主节点。
d2. 主节点根据从节点的偏移量与自己偏移量的差,到复制积压缓冲区中查找数据,如果能全部找到。将积压缓冲区中的命令传给从节点,如果不能全部找到,则进行全量复制。 -
命令传播
a. 每隔指点时间,默认10s,主节点向从节点发送ping命令,让从节点进行超时验证。
b. 每隔1秒,从节点向主节点发送REPLCONF ACK {offset}命令,该命令会被主节点判断从节点超时判断,同时,通过发送自身偏移量,主节点会与自身的偏移量进行比较,若不一致,主节点通过积压复制缓冲区推送缺失数据。