深度理解Redis——主从复制

1.Redis复制原理:

  • 从节点执行slaveof命令之后,保存主节点的信息直接返回,此时复制流程还未开始建立;
  • 从节点内部通过每秒运行的定时任务维护复制相关逻辑, 当定时任务发现存在新的主节点后,会建立了一个端口为 24555的套接字,专门用于接受主节点发送的复制命令;
  • 如果从节点无法建立连接,定时任务会无限重试直到连接成功或者执行 slaveof no one取消复制;
  • 连接建立成功后从节点发送ping请求进行首次通信,检测主从之间网络套接字是否可用以及检测主节点当前是否可接受处理命令。
  • 如果发送ping命令后,从节点没有收到主节点的pong回复或者超时,比如网络超时或者主节点正在阻塞无法响应命令,从节点会断开复制连接,下次定时任务会继续发起重连;
  • 当主从复制连接正常通信后,主节点会把持有的数据全部发送给从节点,这部分操作是耗时最长的同步,当主节点把当前的数据同步给从节点后,便完成了复制的建立流程。接下来主节点会持续地把写命令发送给从节点,以保证主从数据一致性。

2.Redis主从复制,分为全量复制与增量复制:

2.1 全量复制:一般用于初次复制场景,Redis早期支持的复制功能只有全量复制,它会把主节点全部数据一次性发送给从节点,当数据量较大时,会对主从节点和网络造成很大的开销。

全量复制的时间开销:

  • 主节点bgsave时间
  • RDB文件网络传输时间
  • 从节点清空数据时间 
  • 从节点加载RDB的时间
  • 可能的AOF重写时间

全量复制时,Redis主进程会继续响应客户端的写请求,此时Redis会把这些写命令放到的复制缓冲区,等待RDB文件传输完成后,再发送给从节点去执行这些命令。

2.2 增量复制:用于处理在主从复制中因网络闪断等原因造成的数据丢失场景,当从节点再次连上主节点后,如果条件允许,主节点会补发丢失数据给从节点。因为补发的数据远远小于全量数据,可以有效避免全量复制的过高开销。

增量同步通过psync命令运行,需要以下组件支持: 

  • 主从节点各自复制偏移量 (offset)
  • 主节点复制积压缓冲区 (replication_backlog)
  • 主节点运行id(replication id):个数根据从节点的数量而定。

增量同步时,Redis主进程会把收到的写命令放到复制积压缓冲区,如果从节点和主节点间发生了网络断连,等从节点再次连接后,可以从复制积压缓冲区中同步尚未复制的命令操作。

3.主从复制时需要注意的点:

3.1 保证从节点只读:

默认情况下,从节点使用slave-read-only=yes配置为只读模式。由于复 制只能从主节点到从节点,对于从节点的任何修改主节点都无法感知,修改 从节点会造成主从数据不一致。因此建议线上不要修改从节点的只读模式。

3.2 传输延迟:

主从节点一般部署在不同机器上,复制时的网络延迟就成为需要考虑的问题,Redis为我们提供了repl-disable-tcp-nodelay 参数用于控制是否关闭 TCP_NODELAY,默认关闭,说明如下:

  • 当关闭时,主节点产生的命令数据无论大小都会及时地发送给从节 点,这样主从之间延迟会变小,但增加了网络带宽的消耗。适用于主从之间的网络环境良好的场景,如同机架或同机房部署。
  • 当开启时,主节点会合并较小的TCP数据包从而节省带宽。默认发送时间间隔取决于Linux的内核,一般默认为40毫秒。这种配置节省了带宽但增大主从之间的延迟。适用于主从网络环境复杂或带宽紧张的场景,如跨机房部署。

运维建议:

部署主从节点时需要考虑网络延迟、带宽使用率、防灾级别等因素,如 要求低延迟时,建议同机架或同机房部署并关闭repl-disable-tcp-nodelay;如 果考虑高容灾性,可以同城跨机房部署并开启repl-disable-tcp-nodelay。

3.3 主从间的心跳检测:

  • 主从节点在建立复制后,主节点会根据 repl-ping-slave-period 配置定时向从节点发送ping命令,判断从节点的存活性和连接状态,默认为10s。
  • 从节点在主线程中每隔1秒发送replconf ack{offset}命令,实时监测主从节点网络状态,给主节点上报自身当前的复制偏移量,检查复制数据是否丢失。通过min-slaves-to-write、minslaves-max-lag参数配置,实现保证从节点的数量和延迟性功能。
  • 设置合理的复制超时时间 repl-timeout:默认为60秒;

repl-timeout判断标准:

1)批量传输I/O在同步,从节点的观点。

2)从slave的角度来看主超时(数据,ping)。

3)从主服务器的角度来看从服务器超时(REPLCONF ACK ping)。

所以要确保repl-timeout > repl-ping-slave-period 的时间。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis主从复制是一种基于异步的,单向的复制机制,可以将一个Redis实例的数据复制到多个其他实例上,从而实现数据的备份、负载均衡等功能。下面是Redis主从复制深度剖析: 1. 主从复制的原理 Redis主从复制的原理是,从Redis主节点(Master)向从节点(Slave)发送RDB快照文件和增量命令流,从而实现数据的复制。主节点将自己的状态信息发送给从节点,从节点按照主节点的状态进行复制。 2. 主从复制的过程 主从复制的过程可以分为三个阶段:同步、复制和命令传播。 (1)同步阶段 主从复制的同步阶段是指从节点和主节点建立连接,进行身份验证,并将主节点的状态信息发送给从节点。在这个阶段,从节点向主节点发送SYNC命令,主节点接收到SYNC命令后,会生成RDB快照文件,并将RDB快照文件发送给从节点。当从节点接收到RDB快照文件后,会将其加载到内存中,然后向主节点发送PSYNC命令,主节点接收到PSYNC命令后,将增量命令流发送给从节点。 (2)复制阶段 主从复制复制阶段是指从节点从主节点接收增量命令流,并将其应用到自己的数据库中。在这个阶段,从节点会将接收到的增量命令流写入自己的缓冲区中,然后按序应用到自己的数据库中。从节点记录自己已经复制的命令的偏移量和主节点的偏移量,用于在命令传播阶段进行判断。 (3)命令传播阶段 主从复制的命令传播阶段是指从节点向主节点发送命令确认信息,以及主节点向从节点发送新的增量命令流。在这个阶段,从节点会周期性地向主节点发送命令确认信息,主节点接收到命令确认信息后,会将新的增量命令流发送给从节点。从节点接收到新的增量命令流后,会将其应用到自己的数据库中。如果从节点和主节点之间的网络连接断开,从节点会向主节点重新发送SYNC命令,主节点会重新发送RDB快照文件和增量命令流。 3. 主从复制的优缺点 主从复制的优点是: (1)实现数据的备份和恢复功能,可以在主节点出现故障时,通过从节点快速恢复数据。 (2)实现负载均衡功能,可以通过将读请求分配到不同的从节点上,实现读写分离。 (3)提高服务的可用性,可以通过从节点提供服务,当主节点发生故障时,可以快速切换到从节点提供服务。 主从复制的缺点是: (1)从节点只能读取数据,不能写入数据,如果需要写入数据,必须通过主节点进行写操作。 (2)从节点的数据可能存在延迟,如果主节点的数据更新频繁,从节点的数据可能会落后于主节点。 (3)如果主节点出现故障,从节点需要重新选举出新的主节点,可能会导致服务中断。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值