Redis哨兵机制

bVboOAF?w=1772&h=591

概述

上篇文章主要说了Redis 复制的内容,但 Redis 复制有一个缺点,当主机 Master 宕机之后,咱们须要人工解决切换,好比使用slaveof no one 。实际上主从复制并无实现,高可用, 高可用侧重备份机器, 利用集群中系统的冗余,当系统中某台机器发生损坏的时候,其余后备的机器能够迅速的接替它来启动服务。redis

主从复制的问题

图片描述

一旦主节点宕机,写服务没法使用,就须要手动去切换,从新选取主节点,手动设置主从关系。docker

那么如何解决呢?若是咱们有一个监控程序可以监控各个机器的状态及时做出调整,将手动的操做变成自动的。Sentinel的出现就是为了解决这个问题。segmentfault

哨兵机制的原理及实现

Redis Sentinel

Redis Sentinel 是一个分布式架构,其中包含若干个 Sentinel 节点和 Redis 数据节点,每一个 Sentinel 节点会对数据节点和其他 Sentinel 节点进行监控,当它发现节点不可达时,会对节点作下线标识。若是被标识的是主节点,它还会和其余 Sentinel 节点进行“协商”,当大多数 Sentinel 节点都认为主节点不可达时,它们会选举出一个 Sentinel 节点来完成自动故障转移的工做,同时会将这个变化实时通知给 Redis 应用方。整个过程彻底是自动的,不须要人工来介入,因此这套方案颇有效地解决了 Redis 的高可用问题。架构

如图所示:
图片描述并发

基本的故障转移流程

1)主节点出现故障,此时两个从节点与主节点失去链接,主从复制失败。分布式

图片描述

2)每一个 Sentinel 节点经过按期监控发现主节点出现了故障学习

图片描述

3)多个 Sentinel 节点对主节点的故障达成一致会选举出其中一个节点做为领导者负责故障转移。spa

图片描述

4)Sentinel 领导者节点执行了故障转移,整个过程基本是跟咱们手动调整一致的,只不过是自动化完成的。
图片描述3d

5)故障转移后整个 Redis Sentinel 的结构,从新选举了新的主节点。code

图片描述

实例

使用docker建立以下redis容器,这里能够参考 [进阶篇]docker编排PHP开发坏境Linux docker-compose 实战学习下容器技术
redis-sentinel1    172.10.0.9    22530 -> 22530    sentinel
redis-sentinel2    172.10.0.10    22531 -> 6379    sentinel
redis-sentinel3    172.10.0.11    22532 -> 6379    sentinel
redis-master2    172.10.0.5    6383  -> 6379    Master
redis-slave2    172.10.0.6    6384  -> 6379    Slave
redis-slave3    172.10.0.7    6385  -> 6379    Slave

配置

Sentinel 的核心配置

sentinel monitor mymaster 127.0.0.1 7000 2

监控的主节点的名字、IP 和端口,最后一个2的意思是有几台 Sentinel 发现有问题,就会发生故障转移,例如 配置为2,表明至少有2个 Sentinel 节点认为主节点不可达,那么这个不可达的断定才是客观的。对于设置的越小,那么达到下线的条件越宽松,反之越严格。通常建议将其设置为 Sentinel 节点的一半加1。

sentinel down-after-millseconds mymaster 30000

这个是超时的时间(单位为毫秒)。打个比方,当你去 ping 一个机器的时候,多长时间后仍 ping 不通,那么就认为它是有问题。

sentinel parallel-syncs mymaster 1

当 Sentinel 节点集合对主节点故障断定达成一致时,Sentinel 领导者节点会作故障转移操做,选出新的主节点,原来的从节点会向新的主节点发起复制操做,parallel-syncs 就是用来限制在一次故障转移以后,每次向新的主节点发起复制操做的从节点个数,指出 Sentinel 属于并发仍是串行。1表明每次只能复制一个,能够减轻 Master 的压力。

图片描述

sentinel auth-pass <master-name> <password>

若是 Sentinel 监控的主节点配置了密码,sentinel auth-pass 配置经过添加主节点的密码,防止 Sentinel 节点对主节点没法监控。

sentinel failover-timeout mymaster 180000

表示故障转移的时间。

技巧

1)Sentinel 节点不该该部署在一台物理“机器”上。

这里特地强调物理机是由于一台物理机作成了若干虚拟机或者现今比较流行的容器,它们虽然有不一样的 IP 地址,但实际上它们都是同一台物理机,同一台物理机意味着若是这台机器有什么硬件故障,全部的虚拟机都会受到影响,为了实现 Sentinel 节点集合真正的高可用,请勿将 Sentinel 节点部署在同一台物理机器上。

2)部署至少三个且奇数个的 Sentinel 节点。

3个以上是经过增长 Sentinel 节点的个数提升对于故障断定的准确性,由于领导者选举须要至少一半加1个节点,奇数个节点能够在知足该条件的基础上节省一个节点。

相关文章
相关标签/搜索