乐趣区

关于redis:redis哨兵机制主库挂了如何不间断服务

以下均在单机环境下测试:
实例 A(主 127.0.0.1:16379 master)
实例 B(主 127.0.0.1:16380 slave1)
实例 C(主 127.0.0.1:16381 slave2)

失常主从 redis 服务图:

master 异样图:

由图可知,当 master 异样时,客户端不能写数据,从库不能从主库同步数据,这时候,咱们就须要运行一个新的主库,这里就波及到三个问题。

  1. 主库是否真的挂了?
  2. 主库挂了的话,选哪个从库来充当主库?
  3. 如何把新主库通知从库和客户端?

哨兵机制,帮你解决所有问题。

哨兵机制次要性能:监控,选举,告诉

监控:判断主库是否挂了,判断分为两种:主观下线,主观下线。

 主观下线:每个 sentinel 节点(哨兵节点)对 redis 节点的偏见
 主观下线:所有 sentinel 节点(哨兵节点)对 redis 节点达成统

选举:选出新的主库
告诉:告诉客户端和其余从库

监控:哨兵 ping 从库,咦,ping 超时了,间接标记为主观下线(此实例就不可用于服务)。哨兵 ping 主库,咦,也是 ping 不通,然而不能间接标记为主观下线,因为 可能存在误判,误判会导致主从切换,带来不必要的切换开销,如从新选举,通信开销。

误判:主库没下线,哨兵认为主库下线了,可能呈现起因:集群网络压力较大、网络拥塞,或者是主库自身压力较大。

那怎么缩小监控时的误判呢?

采纳哨兵集群判断,由多个哨兵判断主库主观下线了,主库才会标记为主观下线。
判断后果为下线:

判断后果为上线:

主观下线的规范就是,当有 N 个哨兵实例时,最好要有 N/2 + 1 个实例判断主库为“主观下线”,能力最终断定主库为“主观下线”

如何选举新主库?

筛选 + 打分

咱们选新主库,必定是要新主库稳固,防止切换后再次发生主从切换。

先对新主库进行筛选:次要是判断新从库在线状态和网络连接状况。网络连接判断:能够判断 sentinel 配置 down-after-milliseconds * 10,超过最大连贯超时工夫 10 次,则从库网络不稳固,不适合做新主库。

打分:分为三轮规定。从库优先级、从库复制进度以及从库 ID 号

从库优先级:
如果从库的机器实例 B(在此为 16380 端口)绝对比拟高配,能够通过 redis.conf 设置分高一点,比方设置为 100 分。

实例 C(在此为 16381 端口)绝对比拟低配,能够设置为 70 分。

此时 master 宕机,选举就会产生了,在此,咱们先来试验一下。
启动哨兵,哨兵 1 为例子:port 23680

此时,让 master(实例 A,16379)下线。

察看哨兵反馈。

再次查看主从状态

再次启动实例 A(16379),发现实例 A 变成了从库,成为实例 B 的主库。

如果从库优先级优先级统一,则 旧主库同步水平最靠近的从库得分高,该从库成为新主库(起码缩小数据失落)

如果从库的 slave_repl_offset 都统一,则须要进行第三次打分。
每个实例都会有一个 ID,这个 ID 就相似于这里的从库的编号。目前,Redis 在选主库时,有一个默认的规定:在优先级和复制进度都雷同的状况下,**ID 号最小的从库得分最高,会被选为新主库
**

到此,主库切换就实现了。

总结:哨兵会依照在线状态、网络状态,筛选过滤掉一部分不符合要求的从库,而后,顺次依照优先级、复制进度、ID 号大小再对残余的从库进行打分,只有有得分最高的从库呈现,就把它选为新主库。

退出移动版