在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等要求。复制功能是高可用Redis的基础
配置
建立复制:从节点slaveof
- 复制的基础
1.Redis实例划分为主节点(master)和从节点(slave)
2.默认情况下Redis都是主节点
3.每个从节点只能有一个主节点,每个主节点可以有多个从节点
4.复制的数据流是单向的,只能由主节点复制到从节点
配置复制的方式
slaveof配置都是在从节点发起
- 配置文件中加入slaveof
- 启动redis时 redis-server --slaveof
- 直接在cli中使用slaveof
,所以可以在运行期间动态配置
操作流程
slaveof为异步命令,执行slaveof时,节点只保存主节点信息后返回,后续复制流程在节点内部异步执行
- 复制操作流程
1.redis-server --port 6380
2.redis-cli -p 6380 执行slaveof localhost 6379 将6379作为主节点,开始复制
3.主节点info replication复制状态信息
4.从节点info replication复制状态信息
断开复制、切换节点
段开复制流程:从节点slaveof on one
- 主要流程:
1.断开与主节点复制关系
2.从节点晋升为主节点
切换节点:slaveof
- 主要流程:
1.断开与主节点复制关系
2.与新主节点建立复制关系
3.删除从节点当前所有数据
4.对新主节点进行复制操作
特别注意:切主节点后从节点会清空之前所有数据
安全性配置
- 主节点通过设置requirepass参数进行密码验证,所有客户端必须使用auth命令实行校验
- 节点复制是通过一个特殊标识的客户端来完成的,因此从节点的masterauth参数与主节点密码保持一致
只读
slave-read-only yes配置为只读模式,建议不要修改节点的只读模式,会破坏造成数据不一致
传输延迟
主从节点部署在不同机器上需要考虑网络延迟问题
repl-disable-tcp-nodelay no 参数用于是否关闭TCP延迟
- 关闭时,无论数据大小都会及时地发送给从节点,延迟变小,带宽增大。适用于同机架或同机房部署
- 开启时,合并较小的TCP数据包节省带宽,发送时间间隔一般为40ms,取决于Linux内核。适用于跨机房部署,带宽紧张
如果考虑高荣在可以同城跨机房部署开启该选项
拓扑
Redis的拓扑复杂性可以分为三种:一主一从、一主多从、树状主从结构
一主一从结构
用于主节点出现宕机时从节点提供故障转移支持,从节点开启AOF,主节点不开启,且主节点要避免重启操作(因为重启后数据清空,从节点也会清空),保证数据安全性也避免持久化对主节点的干扰
一主多从结构
用于读写分离,主节点写,从节点读,用于分担主节点压力。但对于并发量较高的场景,多个从节点会导致主节点写命令的多次发送过多消耗网络带宽
树状主从结构
从节点不但可以复制主节点数据,同时还可以作为其他从节点的主节点继续向下复制。有效降低主节点负载和需要传送给从节点的数据量,降低主节点压力
原理
复制原理
分为6个过程
保存主节点(master)信息
执行slaveof后从节点只保存主节点的地址信息后直接返回,此时复制流程还没有开始
建立连接
从节点(slave)内部通过运行定时任务复制维护相关逻辑,与主节点建立网络连接,如果不成功则会无限重试,或者slaveof no noe取消复制
发送ping命令
验证网络套接字是否可用,检测主节点是否可以接受处理命令
权限验证
验证requirepass参数密码验证
同步数据集
首次建立复制场景会把所有数据全部发送给从节点,这部分操作时耗时最长的步骤
(新版本可以全量同步和部分同步)
命令持续复制
主节点会持续把写命令发送给从节点,保证数据一致性
心跳
主从节点在建立复制后,会维护长连接并彼此发送心跳命令
心跳机制
- 主从节点都有心跳机制,各自模拟成对方的客户端进行通信
- 主节点默认每10S对从节点发送ping命令,判断从节点的村或许和连接状态
- 从节点每个1S发送replconf ack 命令,给主节点上报自身当前的复制偏移量
Comments | 0 条评论