您的位置:首页 > 数据库 > Redis

redis高可用之sentinel哨兵集群详解与搭建

2017-10-15 11:06 1431 查看
对于redis主从架构,slave可以对应多个本身可以保障高可用,但是对于一个master节点,如果宕机,整个缓存系统就无法进行写的操作,显然整个系统会无法做到高可用

sentinel哨兵可以监测master节点是否正常运行(会自动识别出所有的slave信息),如果出现宕机,则会在对应的slave节点中通过投票的方式来选取一个slave节点作为新的master节点,旧的master节点恢复之后会被接管成为新的master节点的slave节点。同时sentinel哨兵节点本身也是集群的方式部署来保障自身的高可用,并且一个sentinel是可以同时监听多个master节点

对于sentinel哨兵节点的一些核心概念:

sdown和odown两种失败状态

sdown是主观宕机,就是如果一个哨兵自己觉得一个master宕机了,那么就是主观宕机。odown是客观宕机,如果quorum数量的哨兵都觉得一个master宕机了,那么就是客观宕机。

sdown达成的条件很简单,如果一个哨兵ping一个master,超过了is-master-down-after-milliseconds指定的毫秒数之后,就主观认为master宕机。

sdown到odown转换的条件很简单,如果一个哨兵在指定时间内,收到了quorum指定数量的其他哨兵也认为那个master是sdown了,那么就认为是odown了,客观认为master宕机

哨兵集群的自动发现机制

哨兵互相之间的发现,是通过redis的pub/sub系统实现的,每个哨兵都会往sentinel:hello这个channel里发送一个消息,这时候所有其他哨兵都可以消费到这个消息,并感知到其他的哨兵的存在。

每隔两秒钟,每个哨兵都会往自己监控的某个master+slaves对应的sentinel:hello channel里发送一个消息,内容是自己的host、ip和runid还有对这个master的监控配置。每个哨兵也会去监听自己监控的每个master+slaves对应的sentinel:hello channel,然后去感知到同样在监听这个master+slaves的其他哨兵的存在。每个哨兵还会跟其他哨兵交换对master的监控配置,互相进行监控配置的同步

slave配置的自动纠正

哨兵会负责自动纠正slave的一些配置,比如slave如果要成为潜在的master候选人,哨兵会确保slave会复制现有master的数据; 如果slave连接到了一个错误的master上,比如故障转移之后,那么哨兵会确保它们连接到正确新的master上

slave->master选举算法

如果一个master被认为odown了,而且majority哨兵都允许了主备切换,那么某个哨兵就会执行主备切换操作,首先需要选举一个slave来作为新的master节点,需要考虑slave一些相关的信息:

(1)跟master断开连接的时长

(2)slave优先级

(3)复制offset

(4)run id

如果一个slave跟master断开连接已经超过了down-after-milliseconds的10倍,外加master宕机的时长,那么slave就被认为不适合选举为master

(down-after-milliseconds * 10) + milliseconds_since_master_is_in_SDOWN_state

接下来会对slave进行排序

(1)按照slave优先级进行排序,slave priority越低,优先级就越高

(2)如果slave priority相同,那么看replica offset,哪个slave复制了越多的数据,offset越靠后,优先级就越高

(3)如果上面两个条件都相同,那么选择一个run id比较小的那个slave

quorum和majority

每当一个哨兵要做主备切换,首先需要quorum数量的哨兵认为odown,然后选举出一个哨兵来做切换,这个哨兵还需要得到majority哨兵的授权,才能正式执行切换,分为两种情况:

如果quorum < majority,比如5个哨兵,majority就是3,quorum设置为2,那么就3个(majority)哨兵授权就可以执行切换

但是如果quorum >= majority,那么必须quorum数量的哨兵都授权,比如5个哨兵,quorum是5,那么必须5个哨兵都同意授权,才能执行切换

configuration epoch

哨兵会对一套redis master+slave进行监控,有相应的监控的配置。需要执行切换的哨兵节点首先会从slave获取一个configuration epoch然后再进行切换到master,configuration epoch是一个version号,每次切换的version号都必须是唯一的

如果第一个选举出的哨兵切换失败了,那么其他哨兵会等待failover-timeout时间,然后接替继续执行切换,此时会重新获取一个新的configuration epoch,作为新的version号

configuraiton传播

哨兵完成切换之后,会在自己本地更新生成最新的master配置,然后同步给其他的哨兵,就是通过上述所说的pub/sub消息机制。在这里之前的version号就很重要了,因为各种消息都是通过一个channel去发布和监听的,所以一个哨兵完成一次新的切换之后,新的master配置是跟着新的version号的,其他的哨兵都是根据版本号的大小来更新自己的master配置的

对于sentinel.comf配置文件:

mkdir /etc/sentinal
mkdir -p /var/sentinal/5000

/etc/sentinel/5000.conf

port 5000
bind 192.168.1.107
dir /var/sentinal/5000
sentinel monitor mymaster 192.168.1.107 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1


对于mymaster是用来区分一套master-slave节点的,也就是之前所说的可以监测多套m-s架构。

sentinel monitor master-group-name hostname port quorum


quorum的解释如下:

(1)至少要有多少个哨兵一致同意,master进程挂掉了,或者slave进程挂掉了,或者要启动一个故障转移操作

(2)quorum是用来识别故障的,真正执行故障转移的时候,还是要在哨兵集群执行选举,选举一个哨兵进程出来执行故障转移操作

(3)假设有5个哨兵,quorum设置了2,那么如果5个哨兵中的2个都认为master挂掉了; 2个哨兵中的一个就会做一个选举,选举一个哨兵出来,执行故障转移; 如果5个哨兵中有3个哨兵都是运行的,那么故障转移就会被允许执行

down-after-milliseconds,超过多少毫秒跟一个redis实例断了连接,哨兵就可能认为这个redis实例挂了

parallel-syncs,当新的master节点切换完成之后,同时允许并行地有多少个slave被切换到去连接新master来重新做数据同步,参数越低,需要的同步时间也就越多,默认不需要去修改即可

failover-timeout,执行故障转移的timeout超时时长,如果一个哨兵执行master切换的时候超时来,就会投票选举另一个节点来执行故障转移

多节点间的配置:

port 5000
bind 192.168.31.187
dir /var/sentinal/5000
sentinel monitor mymaster 192.168.31.187 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

port 5000
bind 192.168.31.19
dir /var/sentinal/5000
sentinel monitor mymaster 192.168.31.187 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

port 5000
bind 192.168.31.227
dir /var/sentinal/5000
sentinel monitor mymaster 192.168.31.187 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 60000
c1e5

sentinel parallel-syncs mymaster 1


需要注意的是,默认的端口号可能无法被其他节点访问,所以推荐修改端口号。同时在生产环境需要配置后台启动和日志输出:

daemonize yes
logfile /var/log/sentinal/5000


进行启动:

redis-sentinel /etc/sentinal/5000.conf
redis-server /etc/sentinal/5000.conf --sentinel


启动之后可以看到日志信息,每个哨兵都能去监控到对应的redis master,并能够自动发现对应的slave,哨兵之间,互相会自动进行发现,用的就是之前说的pub/sub,消息发布和订阅channel消息系统和机制

检查哨兵状态

redis-cli -h 192.168.31.187 -p 5000

sentinel master mymaster
SENTINEL slaves mymaster
SENTINEL sentinels mymaster

SENTINEL get-master-addr-by-name mymaster


哨兵节点相关配置

哨兵节点的增加和删除

增加sentinal,会自动发现

删除sentinal的步骤

(1)停止sentinal进程

(2)SENTINEL RESET *,在所有sentinal上执行,清理所有的master状态

(3)SENTINEL MASTER mastername,在所有sentinal上执行,查看所有sentinal对数量是否达成了一致

slave的永久下线

让master摘除某个已经下线的slave:SENTINEL RESET mastername,在所有的哨兵上面执行

slave切换为Master的优先级

slave->master选举优先级:slave-priority,值越小优先级越高

基于哨兵集群架构下的安全认证

每个slave都有可能切换成master,所以每个实例都要配置两个指令

master上启用安全认证,requirepass

master连接口令,masterauth

sentinal,sentinel auth-pass <master-group-name> <pass>


容灾演练

首先通过哨兵看一下当前的master:SENTINEL get-master-addr-by-name mymaster,然后把master节点kill -9杀掉进程,对应的pid文件也删除掉

查看sentinal的日志,是否出现+sdown字样,识别出了master的宕机问题; 然后出现+odown字样,就是指定的quorum哨兵数量,都认为master宕机了,分析日志:

(1)三个哨兵进程都认为master是sdown了

(2)超过quorum指定的哨兵进程都认为sdown之后,就变为odown

(3)哨兵1是被选举为要执行后续的主备切换的那个哨兵

(4)哨兵1去新的master(slave)获取了一个新的config version

(5)尝试执行failover

(6)投票选举出一个slave去切换成master,每个哨兵都会执行一次投票

(7)哨兵会让salve节点配置为slaveof none,不让它去做任何节点的slave; 然后把该slave提拔成master; 旧的master认为不再是master了

(8)哨兵就自动认为之前的master变成slave,将投票出的slave变成master

(9)哨兵去探查了一下之前的master(变成来salve)的状态,认为它sdown了

所有哨兵选举出了一个哨兵节点来执行主备切换操作,此时如果哨兵的majority都存活着,那么就会真正地执行主备切换操作。再通过哨兵看一下master:SENTINEL get-master-addr-by-name mymaster查看是否已经切换完成。

故障恢复,将旧的master重新启动,查看是否被哨兵自动切换成slave节点
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis 集群 sentinel