当主从库断连后 , 主库会把断连期间收到的写操作命令 , 写入 replication buffer , 同时也会把这些操作命令写入 repl_backlog_buffer 这个缓冲区 。repl_backlog_buffer 是一个环形缓冲区 , 主库会记录自己写到的位置 , 从库则会记录自己已经读到的位置 。
在网络断连阶段 , 主库可能会收到新的写操作命令 , 所以 , 一般来说 , 主库写到的位置会大于从库读到的位置 。当网络恢复后 , 主库只用把主库写到的位置和从库读到的位置之间的命令操作同步给从库就行 。
![Redis高可用全景一览](http://img.jiangsulong.com/221212/1606213S7-3.png)
文章插图
repl_backlog_buffer示意图
【Redis高可用全景一览】Redis 通过主从库模式 , 既提高了系统处理请求的吞吐量 , 也保证了系统的可用性 。
如果从库发生故障了 , 客户端可以继续向主库或其他从库发送请求 , 进行相关的操作 。但是如果主库发生故障了怎么办?此时从库没有相应的主库可以进行数据复制操作了 , 且一旦有写操作请求 , 系统也将无法处理 。
二、哨兵机制所以 , 如果主库挂了 , 我们就需要运行一个新主库 , 比如说把一个从库切换为主库 , 把它当成主库 。在 Redis 主从集群中 , 哨兵机制是实现主从库自动切换的关键机制 。
![Redis高可用全景一览](http://img.jiangsulong.com/221212/1606216092-4.png)
文章插图
Redis哨兵机制
2.1 哨兵的职责哨兵其实就是一个运行在特殊模式下的 Redis 进程 , 主从库实例运行的同时 , 它也在运行 。哨兵主要负责的就是三个任务:监控、选主(选择主库)和通知 。
![Redis高可用全景一览](http://img.jiangsulong.com/221212/160621I28-5.png)
文章插图
哨兵的职责
监控是指哨兵进程在运行时 , 周期性地给所有的主从库发送 PING 命令 , 检测它们是否仍然在线运行 。如果从库没有在规定时间内响应哨兵的 PING 命令 , 哨兵就会把它标记为“下线状态”;同样 , 如果主库也没有在规定时间内响应哨兵的 PING 命令 , 哨兵就会判定主库下线 , 然后开始自动切换主库的流程 。
选主是指主库挂了以后 , 哨兵就需要从很多个从库里 , 按照一定的规则选择一个从库实例 , 把它作为新的主库 。这一步完成后 , 现在的集群里就有了新主库 。
然后 , 哨兵会执行最后一个任务:通知 。在执行通知任务时 , 哨兵会把新主库的连接信息发给其他从库 , 让它们执行 replicaof 命令 , 和新主库建立连接 , 并进行数据复制 。同时 , 哨兵会把新主库的连接信息通知给客户端 , 让它们把请求操作发到新主库上 。
但是你有没有想过 , 如果有哨兵实例在运行时发生了故障 , 主从库还能正常切换吗?
2.2 哨兵的高可用哨兵单点故障问题 , Redis 也是通过建立哨兵集群来解决的 。那我们再回头看哨兵的职责 , 在监控主从库是否下线时 , 如果出现了哨兵内部的意见不统一怎么办?比如说有 3 个哨兵 , 其中一个哨兵认为主库下线了 , 而另外 2 个却认为主库是正常的 , 这时该听谁的呢?
这就好比我们团队内部出现了意见分歧 , 那最好的解决办法就是民主投票了 , 采用“少数服从多数的原则” 。哨兵集群内部也一样 , 在网络拥塞的情况下 , 有个别哨兵与主库的 PING 命令失败 , 这时哨兵就认为该主库故障了 , 然而实际并没有 。这时就要采用“民主”的办法 , 大多数哨兵认为主库故障 , 才会进行下一步的选主 。
哨兵的实例数应该是 2N+1 的单数 , 这样才不致于出现观点对立的情况 , 通常我们至少会配置 3 个哨兵实例 。那选主同样需要考虑一个问题:哨兵这么多 , 该由哪个执行主从切换?
此时 , 这个哨兵就可以再给其他哨兵发送命令 , 表明希望由自己来执行主从切换 , 并让所有其他哨兵进行投票 。这个投票过程称为“Leader 选举” 。因为最终执行主从切换的哨兵称为 Leader , 投票过程就是确定 Leader 。
推荐阅读
- 多线程管理 一款功能强大、配置灵活、高性能异步编排框架
- 盘点12个Vue 3的高颜值UI组件库
- 王丽坤|曝王丽坤老公疑似被抓,高调为女方买豪车豪宅,涉及赃款或被追缴
- 周凯旋|周凯旋情商有多高?为了配上大30多岁的李嘉诚,故意打扮得更老成
- 高校|沈阳市教育局教师招聘标准惹争议,只有8所大学入选,门槛太高了
- |社区工作者职业身份获得认可,或将迎来待遇高速增长期!
- 钢铁之躯2|《钢铁之躯2》《蝙蝠侠》个人电影被砍!因为剧本糟糕,引起华纳高层不满
- 转氨酶升高就是得了肝炎吗? 转氨酶升高
- 赢驷和嬴政的关系(赢驷是嬴政的高祖?)
- 求职|职场随笔142:如何建设高绩效团队(六)开诚布公的沟通