0
点赞
收藏
分享

微信扫一扫

第七章 哨兵机制:主库挂了,如何不间断服务


第七章 哨兵机制:主库挂了,如何不间断服务 ?

哨兵机制的基本流程

哨兵的主要职责:

  • 监控:通过 PING命令 来监控主从
  • 选主:主库挂了,在从库中按一定的机制选择一个作为新主库
  • 通知:通知其他从库和客户端新的主库信息
  • 让其他从库执行 replicaof 命令,和新主库建立连接,并进行数据复制

第七章 哨兵机制:主库挂了,如何不间断服务_客户端

监控:主观下线和客观下线

哨兵对主库的下线判断有“主观下线”和“客观下线”两种。

什么是主观下线 ?

  • 哨兵进程会使用 PING 命令检测它自己和主、从库的网络连接情况,用来判断实例的状态。
  • 如果哨兵发现主库或从库对 PING 命令的响应超时了,那么,哨兵就会先把它标记为“主观下线”。
  • 对于从库,可以简单标记为“主观下线”。
  • 对于主库,还需要考虑哨兵是否出现误判的情况。误判一般会发生在集群网络压力较大、网络拥塞,或者是主库本身压力较大的情况下。

哨兵机制怎么减少误判呢 ?

  • 为了防止单个哨兵误判,可以引入多个哨兵实例一起来判断,这样可以避免单个哨兵因为自身网络状况不好,而出现误判主库下线的情况
  • 只有大多数的哨兵实例,都判断主库已经“主观下线”了,主库才会被标记为“客观下线”

第七章 哨兵机制:主库挂了,如何不间断服务_客户端_02

什么是客观下线 ?

  • “客观下线”的标准就是,当有 N 个哨兵实例时,最好要有 N/2 + 1 个实例判断主库为“主观下线”,才能最终判定主库为“客观下线”。
  • 也可以由 Redis 管理员自行设定。

选主:如何选定新主库?

  • 在多个从库中,先按照一定的筛选条件,把不符合条件的从库去掉。
  • 从库是否在线
  • 从库的网络连接状态
  • 然后,再按照一定的规则,给剩下的从库逐个打分,将得分最高的从库选为新主库。
  • 分为三轮打分,前一轮平分才会进入下一轮打分,只要在某一轮有从库得分最高,就可以选择该从库作为主库:
  • 从库优先级
  • 从库复制进度
  • 从库 ID 号

第七章 哨兵机制:主库挂了,如何不间断服务_客户端_03

具体的打分情况是什么样的呢 ?

  • 第一轮:优先级最高的从库得分高。
  • 第一轮:优先级最高的从库得分高。
  • 通过上一章所讲的 slave_repl_offset,最接近旧主库 master_repl_offset 的得分最高。
  • 第三轮:ID 号小的从库得分高。
  • Redis 在选主库时,有一个默认的规定:在优先级和复制进度都相同的情况下,ID 号最小的从库得分最高,会被选为新主库。
  • 最小的说明最早连接上,数据也就最全,能活到现在也就最稳定,毕竟久经考验。

总结

Redis 的哨兵机制自动完成了以下三大功能:

  • 监控主库运行状态,并判断主库是否客观下线;
  • 在主库客观下线后,选取新主库;
  • 选出新主库后,通知从库和客户端。

问题

哨兵集群中有实例挂了,怎么办,会影响主库状态判断和选主吗 ?

  • 存在故障节点时,只要集群中大多数节点状态正常,集群依旧可以对外提供服务。

主从库切换是需要一定时间的。在这个切换过程中,客户端能否正常地进行请求操作呢 ?如果想要应用程序不感知服务的中断,还需要哨兵或需要客户端再做些什么吗?

  • 主库下线,可读不可写,写失败的时间 = 哨兵切换主从的时间 + 客户端感知新主库时间
  • 主库下线无感知,需要客户端与哨兵配合改造:
  • 哨兵主动通知:哨兵需要将最新的主库地址写入自己的​​pubsub​​ 中,客户端需要订阅这个 pubsub,当这个 pubsub 有数据时,客户端就能感知到
  • 客户端主动获取:客户端不将主从库写死,而是从哨兵集群中获取,从而始终获取最新的主从地址


举报

相关推荐

第七章

第七章:事务

第七章:集合

第七章 类

第七章 数组

第七章 集合

第七章总结

0 条评论