目录
- 1. 高可用
- 2. redis 哨兵模式
- 3. 图文的方式让我们读懂这几个算法
- 3.1. Raft算法 - 图文
- 3.2. Paxos算法 - 图文
- 3.3. 区别:
1. 高可用
在 Redis 中,实现 高可用 的技术主要包括 持久化、复制、哨兵 和 集群,下面简单说明它们的作用,以及解决了什么样的问题:
持久化
:持久化是 最简单的 高可用方法。它的主要作用是 数据备份,即将数据存储在 硬盘,保证数据不会因进程退出而丢失。复制
:复制是高可用 Redis 的基础,哨兵 和 集群 都是在 复制基础 上实现高可用的。复制主要实现了数据的多机备份以及对于读操作的负载均衡和简单的故障恢复。缺陷是故障恢复无法自动化、写操作无法负载均衡、存储能力受到单机的限制。哨兵
:在复制的基础上,哨兵实现了 自动化 的 故障恢复。缺陷是 写操作 无法 负载均衡,存储能力 受到 单机 的限制。集群
:通过集群,Redis 解决了 写操作 无法 负载均衡 以及 存储能力 受到 单机限制 的问题,实现了较为 完善 的 高可用方案。
2. redis 哨兵模式
介绍:哨兵模式是为了解决服务器故障。
功能:Redis 哨兵模式是指在 Redis 集群中,有一组专门的进程(即哨兵进程)负责监控主节点和从节点的状态,并在发现故障时自动进行故障转移,以保证 Redis 集群的高可用性。
是否默认开启:Redis并没有默认开启哨兵模式,需要手动配置哨兵节点,并通过哨兵节点监控Redis主从节点的健康状态。
哨兵模式三大任务:监控、提醒、自动故障迁移
解决办法:raft算法(基于领导者的一致性算法)、Paxos算法(基于提案的一致性算法)
-
raft算法(基于领导者的一致性算法):角色分为:
领导者、候选者、跟随者
初始化
:什么时候变成候选者
- 集群启动时,所有的节点都是跟随者,没有领导者。每个节点都有一个选举超时时间,随机在150ms到300ms之间,如果在超时时间内没有收到领导者的心跳包
,就会转变为候选者,开始发起选举。
发起选举
:发送选举时,发送什么到其他候选者
- 候选者会增加自己的选举轮次(term),并向其他节点发送选举请求,包含自己的选举轮次和标识
。同时,候选者会给自己投一票,并重置自己的选举超时时间。
投票
:是否给这个候选者投票
- 跟随者收到选举请求后,会比较自己的选举轮次和候选者的选举轮次,如果自己的选举轮次更大
,或者已经给其他候选者投过票
,就会拒绝投票;否则,就会同意投票,并重置自己的选举超时时间。
统计票数
:统计有多少人给你投票
- 候选者收到投票回复后,会统计自己的票数,如果超过半数,就会成为领导者,并向其他节点发送心跳包,通知自己的领导地位;如果没有超过半数
,就会继续等待投票回复,直到超时或者收到心跳包。
维持领导者
:领导者诞生,并向其他发送心跳包
- 领导者会周期性地向所有跟随者发送心跳包,维持自己的领导地位,并检查跟随者的状态。如果领导者发现自己的选举轮次小于某个跟随者的选举轮次,就会认为自己的领导地位已经过期,转变为跟随者,重新开始选举超时计时。
处理冲突
:故障导致多个领导者出现
- 如果集群中出现网络分区或者节点故障,可能会导致多个候选者同时发起选举,造成选举冲突。Raft算法通过随机化选举超时时间,使得冲突的概率降低。同时,如果一个候选者收到了另一个候选者的选举请求,它会拒绝投票,并重置自己的选举超时时间,避免无效的选举。
最终,只有一个候选者能够获得多数的票数,成为领导者,结束选举。 -
Paxos算法(基于提案的一致性算法):角色分为:
提议者和接受者
准备阶段
:生成提案编号
- 提议者会生成一个唯一的提案编号(n),并向所有的接受者发送准备请求,包含提案编号(n)。
承诺阶段
:承诺不再接受任何编号小于n的提案
- 接受者收到准备请求后,会比较自己已经接受过的最大提案编号(n’)和当前提案编号(n)
,如果n’ >= n,就会拒绝准备请求;否则,就会承诺不再接受任何编号小于n的提案
,并回复提议者,包含自己已经接受过的最大提案编号(n’)和对应的从节点标识(v’)。
接受阶段
:接收到所有提案,然后统计,第一次确认
- 提议者收到半数以上的接受者的回复后,会从中选择最大的提案编号(n’)和对应的从节点标识(v’),如果n’为0,就说明没有接受者接受过任何提案,此时提议者可以自由选择一个从节点标识(v)。然后,提议者会向所有的接受者发送接受请求,包含提案编号(n)和从节点标识(v)。
确认阶段
:统计后,向其他接收者第二次确认,再也没有新的提案了(二阶段确认)
- 接受者收到接受请求后,会比较自己已经承诺过的最小提案编号(n’‘)和当前提案编号(n),如果n’’ > n,就会拒绝接受请求;否则,就会接受提案,并回复提议者,包含提案编号(n)和从节点标识(v)。
完成阶段
:提升为主节点
- 提议者收到半数以上的接受者的回复后,就会认为提案达成一致,即从节点标识(v)被选为新的主节点,并通知所有的接受者。
采用二阶段确认的方式来达成共识的
参考:Redis哨兵模式中的选举算法:Raft vs Paxos
参考:Paxos算法
参考:redis默认开启哨兵模式的吗
3. 图文的方式让我们读懂这几个算法
3.1. Raft算法 - 图文
3.2. Paxos算法 - 图文
3.3. 区别:
确认阶段不同:
- Raft算法:判断是否投过票
- Paxos算法:不接受任何小于该编号的提案,而且还有第二阶段确认
相同:
- 都是半数以上确认,都需要确认当前选举轮次/提案编号是最新的。