以下均在单机环境下测试:
实例A(主 127.0.0.1:16379 master)
实例B(主 127.0.0.1:16380 slave1)
实例C(主 127.0.0.1:16381 slave2)
失常主从redis服务图:
master异样图:
由图可知,当master异样时,客户端不能写数据,从库不能从主库同步数据,这时候,咱们就须要运行一个新的主库,这里就波及到三个问题。
- 主库是否真的挂了?
- 主库挂了的话,选哪个从库来充当主库?
- 如何把新主库通知从库和客户端?
哨兵机制,帮你解决所有问题。
哨兵机制次要性能:监控,选举,告诉
监控:判断主库是否挂了,判断分为两种:主观下线,主观下线。
主观下线:每个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 号大小再对残余的从库进行打分,只有有得分最高的从库呈现,就把它选为新主库。