zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Redis 主从复制 心跳和异步复制

Redis异步 复制 主从复制 心跳
2023-09-14 09:01:47 时间

 主从复制:心跳机制


主从节点在建立复制后, 它们之间维护着长连接并彼此发送心跳命令,如图所示: 

主从心跳判断机制:
1) 主从节点彼此都有心跳检测机制, 各自模拟成对方的客户端进行通信, 通过client list命令查看复制相关客户端信息, 主节点的连接状态为flags=M, 从节点连接状态为flags=S。
2) 主节点默认每隔10秒对从节点发送ping命令, 判断从节点的存活性和连接状态。 可通过参数repl-ping-slave-period控制发送频率。
3) 从节点在主线程中每隔1秒发送replconf ack{offset}命令, 给主节点上报自身当前的复制偏移量。 replconf命令主要作用如下:

 ·实时监测主从节点网络状态。
·上报自身复制偏移量, 检查复制数据是否丢失, 如果从节点数据丢失, 再从主节点的复制缓冲区中拉取丢失数据
·实现保证从节点的数量和延迟性功能, 通过min-slaves-to-write、 minslaves-max-lag参数配置定义。

主节点根据replconf命令判断从节点超时时间, 体现在info replication统计中的lag信息中, lag表示与从节点最后一次通信延迟的秒数, 正常延迟应该在0和1之间。 如果超过repl-timeout配置的值(默认60秒) , 则判定从节点下线并断开复制客户端连接。 即使主节点判定从节点下线后, 如果从节点重新恢复, 心跳检测会继续进行。

[root@localhost ~]# /usr/local/redis/bin/redis-cli info | grep lag
slave0:ip=192.168.179.103,port=6379,state=online,offset=5502,lag=0
slave1:ip=192.168.179.104,port=6379,state=online,offset=5502,lag=1

运维提示:
为了降低主从延迟, 一般把Redis主从节点部署在相同的机房/同城机房, 避免网络延迟和网络分区造成的心跳中断等情况。

 

异步复制


主节点不但负责数据读写, 还负责把写命令同步给从节点。 写命令的发送过程是异步完成, 也就是说主节点自身处理完写命令后直接返回给客户端, 并不等待从节点复制完成, 如图所示。

 主节点复制流程:
1) 主节点6379接收处理命令。
2) 命令处理完之后返回响应结果。
3) 对于修改命令异步发送给6380从节点, 从节点在主线程中执行复制的命令。由于主从复制过程是异步的, 就会造成从节点的数据相对主节点存在延迟。 具体延迟多少字节, 我们可以在主节点执行info replication命令查看相关指标获得。 如下:

slave0:ip=127.0.0.1,port=6380,state=online,offset=841,lag=1
master_repl_offset:841

在统计信息中可以看到从节点slave0信息, 分别记录了从节点的ip和port, 从节点的状态, offset表示当前从节点的复制偏移量,master_repl_offset表示当前主节点的复制偏移量, 两者的差值就是当前从节点复制延迟量。 Redis的复制速度取决于主从之间网络环境, repl-disabletcp-nodelay, 命令处理速度等。 正常情况下, 延迟在1秒以内。