Redis 主从复制与哨兵
# 一、主从复制
# 1,简单介绍
- 主从复制用于将主节点的数据备份到从节点,能够实现读写分离,主写从读,减轻主节点的负载;
- 主节点宕机时,从节点能够快速升级为主节点对外提供服务,实现了容灾与备份;
# 2,主从复制的建立与断开
- 通过配置文件建立:在从节点的配置文件中加上
slaveof {masterHost} {masterPort}
后启动 Redis 即可生效; - 通过命令行配置:在从节点
redis-server
启动命令后加入--slaveof{masterHost}{masterPort}
即可生效; - 在从节点启动后,通过客户端连接到从节点后,执行
slaveof {masterHost} {masterPort}
命令后也可生效,节点重启后失效; - 在从节点执行
slaveof no one
即可与主节点断开,或是在配置文件中删除该配置重启后生效;
# 二、复制流程
# 1,全量复制
- 主节点一次性把所有数据全部发送给从节点,一般用于初次复制的场景,性能开销和网络开销较大;
- 从节点发送psync命令进行数据同步,由于是第一次进行复制,没有复制偏移量和主节点的运行ID,所以发送psync-1;
- 主节点根据psync-1解析出当前为全量复制,回复+FULLRESYNC响应;
- 从节点接收主节点的响应数据保存运行ID和偏移量offset;
- 主节点执行bgsave保存RDB文件到本地;
- 主节点发送RDB文件给从节点,从节点把接收的RDB文件保存在本地并直接作为从节点的数据文件;
- 如果算出RDB文件从创建到传输完毕消耗的总时间超过所配置的值(默认60秒),从节点将放弃接受RDB文件并清理已经下载的临时文件,全量复制失败;
- 从节点接收RDB快照期间,主节点会把这期间写命令数据保存在复制积压缓冲区内,在从节点加载完RDB文件后再发送给从节点,保证主从之间数据一致性;
- 从节点接收完主节点传送来的全部数据后会清空自身旧数据;
- 从节点清空数据后开始加载RDB文件,对于较大的RDB文件,这一步操作依然比较耗时;
# 2,部分复制
- 针对全量复制开销过大的一种优化,主要用于网络闪断或命令丢失等情况,主节点补发部丢失的命令数据;
- 主从连接中断期间,主节点依旧响应命令,并将写命令保存在复制积压缓冲区;
- 主从连接恢复后,从节点会将断开前保存的主节点ID和复制偏移量发送给主节点,进行部分复制;
- 主节点接收到从节点psync命令后先
# 三、哨兵模式
# 1,简单介绍
- 在主从复制模式中,当主节点出现故障时,哨兵模式能自动完成故障发现和故障转移,并通知应用方,从而实现真正的高可用;
- 哨兵模式包含若干个哨兵节点和数据节点,每个哨兵节点会对其他哨兵节点和数据节点监控,一旦发现不可用时会做下线标志;
- 当被标志的是主节点时,会和其他哨兵节点协商,当多数哨兵节点认为主节点不可用时,会选出一个哨兵节点完成自动故障转移,并实时通知给应用方;
- 故障转移时,哨兵节点会选举出一个从节点晋升为主节点,并节点之间的主从关系;
# 2,实现原理
# 2.1 三个定时任务:
- 每隔 10 秒,哨兵节点向主节点和从节点发送 info 信息,获取最新的拓扑结构,这个过程能够感知到新节点的加入、节点的不可用或是故障转移后的新拓扑结构;
- 每隔 2 秒,每个哨兵节点会通过发布订阅的方式交换自己的信息以及对主节点的判断,这个过程能够发现新的哨兵节点,以及对主节点状态的判断可以作为后面客观下线以及领导者选举的依据;
- 每隔 1 秒,每个哨兵节点会向主节点、从节点、其余哨兵节点发送一条ping命令做一次心跳检测,来确认这些节点当前是否可达,作为节点失败判断的重要依据;
# 2.2 主客观下线
- 在心跳检测时,如果超过一定时间某个节点还没有回应,则该哨兵节点认为这个节点不可达,即主观下线;
- 当主观下线的节点是主节点时,哨兵节点会询问其他节点对主节点的判断,如果超过一定数量的哨兵节点认为主节点有问题时,则哨兵节点会做出主节点下线的认定,即客观下线;
# 2.3 主哨兵节点选举
- 当主节点客观下线后,需要选举出一个哨兵节点作为领导者完成故障转移;
- 每个在线的哨兵节点都有资格成为领导者,在做出客观下线的决定后,哨兵节点会向其他哨兵节点发送消息要求设置自己为领导者,如果收到消息的哨兵节点没有同意其他节点,则会同意该请求;
- 当哨兵节点的选票数量超过哨兵节点数量的一半时,将会成为领导者;
- 如果一轮选举未选出领导者则进入下一轮选举,选举的过程非常快,基本上是谁先完成客观下线谁就是领导者;
# 3,故障转移
- 从在线的从节点中选择优先级最高的(如果有)、运行id最小的作为主节点;
- 哨兵节点领导者将取消该节点与原主节点的主从复制关系,并向剩余节点发送新主节点的信息,并更新他们的主从复制关系;
- 将原主节点改为从节点,等其恢复后让其与新的主节点建立主从复制关系;
编辑 (opens new window)
上次更新: 2024/09/24, 14:39:25