复制
- 建立复制: 默认redis 都是主节点。每个从节点只能复制到从节点,而每个主节点可以同时具有多个从节点。复制的数据是单向的,只能有主节点到从节点。配置复制:
- 配置文件中加入 slaveof {masterHost}{masterPort},重启redis
- 启动redis命令后加入 --slaveof {masterHost}{masterPort}
- redis直接使用命令 slaveof {masterHost}{masterPort}
- 断开复制: 从节点执行slaveof no one 来断开与主节点的复制关系
- 断开复制流程:
1) 断开与主节点复制关系
2) 从节点晋升为主节点 - 切主操作流程:
1) 断开与旧主节点复制关系
2) 与新主节点建立复制关系
3) 删除从节点当前所有数据
4) 对新主节点进行复制操作 - 只读:从节点使用 slave-read-only=yes 配置为只读模式。
- 传输延迟 参数 repl-disable-tcp-nodelay 控制是否关闭TCP_NODELAY, 默认no 及开 tcp-nodelay 功能,主节点会合并较小的TCP数据包从而节省带宽。默认发送实际取决于Liunx的内核,这种配置会增大主从之间的延迟。当关闭时,主节点产生的命令数据都会及时的发送给从节点,这样主从延迟会变小,但增加网络带宽消耗
- 拓扑:
1. 一主一从结构
2. 一主多从结构
3. 树形主从结构 - 复制过程:
1. 保存主节点信息
2. 从节点内部通过每秒运行的定时任务维护复制相关逻辑,当定时任务发现存在新的主节点后,会尝试与该节点建立网络连接,如果无法建立连接,定时任务会无限重试直到连接或者执行slaveof no one取消复制
3. 发送ping命令: ping命令没有响应会断开连接等待下次定时任务发起重连
4. 权限验证:主节点通过设置requirepass 参数进行密码验证,从节点的复制连接通过一个特殊标识的客户端来完成,因此需要配置从节点的masterauth 参数与主节点密码保持一致
5. 同步数据集:主节点会把持有的数据全部发送给从节点
6. 命令持续复制:主节点会持续地把命令发送个从节点,保证主从数据一致 - 数据同步
- 复制偏移量:参与复制的主节点会维护自身复制偏移量。主节点处理完写入命令后,会把命令的字节长度做累加记录,统计信息在 info replication 中的 master_repl_offset中,从节点每秒钟会上报自身复制偏移量,主节点会报存从节点偏移量。从节点接受到命令后也会累加自身偏移量。
- 复制积压缓存区:当主节点发送命令给从节点时,还会写入复制积压缓冲区,缓冲区先进先出,能保存最近已复制数据,用于部分复制命令丢失补救
- 主节点运行ID:每个redis节点启动都会有一个动态分配的40位十六进制字符串作为运行ID,用来唯一标示redis 节点。当运行ID变化后从节点将做全量复制。
- psync 命令:从节点使用psync 命令完成部分复制和全量复制功能
- 心跳:
- 主节点默认每隔10s对从节点发送ping命令,判读从节点的存活性和连接状态。
- 从节点在主线程中每隔1秒给主节点上报自身复制偏移量
- 异步复制:主节点自身处理完写命令直接返回给客户端,并不等待从节点复制完成。主从复制过程是异步的,会造成主从延迟,正常情况下延迟在1s左右
- 读写分离遇到问题:
- 数据延迟 监控偏移量,及时下线延迟大的节点
- 读到过期数据 当采样速度跟不上过期速度,redis 3.2 后解决了这个问题:从节点读取数据后会检查键的过期时间来决定是否返回。
- 从节点故障 监控延迟,及时下线
- 惰性删除 主节点每次处理读取命令是检查键是否超时,如果超时则执行del命令删除对象,之后同步给从库。
- 定时删除 redis 主节点内部定时任务会循环采样一定数量的键,当发现采样的键过期时,执行del命令,之后同步给从库。
- 复制风暴 :大量从节点对同一主节点或同一台机器的多个主节点短时间内发起全量复制,规避方式对应单节点复制风暴采用树状复制结构,对应单机器复制风暴,部署时打散主节点到多台机器上,主节点所在机器故障后提供故障转移机制。