- 复制功能是高可用Redis的基础。
- 主从节点之间维护心跳(长连接)和偏移量检查机制,保证主从通信正常和数据一致
- Redis复制过程是异步的,主节点完成后直接返回客户端,不等待从节点复制完成,可能存在从节点延时。
- 当使用从节点用户读写分离时会存在数据延迟、过期数据、从节点可用性问题
- 主机节点存在多个从节点或者一台机器上部署多个主节点时可能存在复制风暴的风险。
配置
建立复制
默认情况加每个Redis节点都是主节点。每个从节点只能有一个主节点,每个 主节点可以有多个从节点,从节点还可以有从节点。
配置复制的方式有三种:
1)在配置文件中加入: slaveiof {masterHost} {masterPort}
2)redis-server 启动命令后加参数 --slaveiof {masterHost} {masterPort}
3)在从节点发送命令slaveiof {masterHost} {masterPort}
可以通过info replication
查看复制相关状态
断开复制
- 从节点执行
slaveof no one
断开与主节点复制关系
从节点流程:
1)断开与主节点复制关系。
2)从节点晋升为主节点 - 从节点可以通过
slaveiof {newMasterHost} {newMasterPort}
切换主节点
从节点流程:
1)断开与旧主节点复制关系。
2)与主节点建立复制关系。
3)删除从节点当前数据。
4)对新节点进行复制操作。
安全性
主节点设置requirespass
参数进行密码校验
拓扑
- 一主一从
- 一主多从:高并发场景可能使主节点负载过高
- 树状主从
原理
复制过程
1)从节点保存主节点信息
2)从节点内存每秒定时任务维护与主机点复制的相关逻辑,如果有新主节点则与新主节点建立连接
3)连接成功后从节点发送ping
请求进行首次通信。如果没有收到准点的pong
回复或者超时则从节点断开,等待下次定时任务重接。
4)权限校验,如果主节点设置了requirespass
5)同步数据集。
6)命令持续复制
数据同步
- 复制偏移量:
参与复制的主从节点都会维护自身的复制偏移量。从节点每秒钟上报自身的复制偏移量给主机节点,因此主节点也保存从节点的复制偏移量。 - 复制积压缓冲区
复制积压缓冲区是保存在主节点上的定长队列(默认1M),保存最近已复制数据的功能,用于部分复制和复制命令丢失的数据补救。 - 主节点运行ID
每个Redis节点启动时会动态分配一个40为的十六进制字符串作为运行ID。从节点会保存自己复制的主节点ID。 - psync命令
从节点通过psync
命令完成全量复制和部分复制: psync {主节点runId} {当前从节点的复制偏移量offset}
全量复制
主要时间开销:
- 主节点bgsave
- RDB文件网络传输
- 从节点清空数据
- 从节点加载RDB文件
- 可能的AOF时间
全量同步发生的场景:
- 主从第一建立复制时
- 节点运行ID不匹配时(主节点重启了)
- 复制积压缓冲区不足(从节点请求的偏移量不在复制积压缓冲区内时)
注意事项:
- 如果全量复制总时间超过repl-timeout(默认60秒)则从节点将放弃接受RDB文件并清空已下载的临时文件,造成全量复制失败。
- 如果RDB传输时间过长,在高并发写入的时候导致主节点复制客户端缓冲区溢出(默认60M),那么主节点将关闭复制客户端链接,造成全量复制失败。
无盘复制:主节点不生成RDB文件而是直接通过网络发送给从节点(默认关闭)。
部分复制
如果 复制偏移量在复制积压缓冲区 内则直接从复制积压缓冲区中获取数据发送从节点。
如果 复制偏移量不在复制积压缓冲 区内发生全量复制