天天看点

浅谈Redis Sentinel

什么是Sentinel

Redis Sentinel是一个用来监控redis集群中节点的状态,不用来存储数据。当集群中的某个节点有故障时,可以自动的进行故障转移的操作。通常为了保证sentinel的高可用,sentinel也会部署多个。sentinel的结构图如下所示:

浅谈Redis Sentinel

定时任务

在redis sentinel中,一共有3个定时任务,通过这些任务,来发现新增节点和节点的状态。

  1. 每10秒每个sentinel节点对master节点和slave节点执行info操作。
    浅谈Redis Sentinel
  2. 每2秒每个sentinel节点通过master节点的channel(sentinel:hello)交换信息。
    浅谈Redis Sentinel
  3. 每1秒每个sentintel节点对master节点和slave节点以及其余的sentinel节点执行ping操作。
    浅谈Redis Sentinel

主观下线和客观下线

  • 主观下线:当前sentintel节点认为某个redis节点不可用。
  • 客观下线:所有sentinel节点认为某个redis节点不可用。

故障转移过程

当多个sentinel认为master节点不可用,会进行故障转移操作,如下图所示。

浅谈Redis Sentinel

1. 领导者选举

作用:选举出一个sentenel节点作为领导者去进行故障转移操作。

过程:

1). 每个做主观下线的sentinel节点向其他sentinel节点发送上面那条命令,要求将它设置为领导者。

2). 收到命令的sentinel节点如果还没有同意过其他的sentinel发送的命令(还未投过票),那么就会同意,否则拒绝。

3). 如果该sentinel节点发现自己的票数已经过半且达到了quorum的值,就会成为领导者。

4). 如果这个过程出现多个sentinel成为领导者,则会等待一段时间重新选举。

2. 选出新的master节点

redis sentinel会选一个合适的slave来升级为master,那么,如何选择一个合适的slave呢?顺序如下:

1). 选择slave-priority最高的slave节点(默认是相同)。

2). 选择复制偏移量最大的节点。

3). 如果以上两个条件都不满足,选runId最小的(启动最早的)。

3. 更改slave节点的master节点

当选举出新的master节点后,会将其余的节点变更为新的master节点的slave节点,如果原有的master节点重新上线,成为新的master节点的slave节点。

4. 通知客户端

当所有节点配置结束后,sentinel会通知客户端节点变更信息。

5. 客户端连接新的master节点

客户端收到节点信息后,会连接新的master节点。

故障转移操作

  1. 启动1个master节点,2个slave节点。master节点端口号6379,slave节点端口号为6380和6381,如下图所示。
    浅谈Redis Sentinel
  2. 启动3个sentienl节点,端口号为26379、26380和26381,如下图所示。
    浅谈Redis Sentinel
  3. 先看下主从关系,执行命令

    redis-cli info replication

    ,可以看到端口号为6379的master节点有2个slave节点,端口号为6380和6381。
    浅谈Redis Sentinel
  4. 将master进程杀死,因为master的端口是6379,所以我们来看6380的信息,等一段时间后执行命令

    redis-cli -p 6380 info replication

    ,可以看到6380的slave升级到master了,有一个slave节点,端口号是6381。
    浅谈Redis Sentinel
  5. 将6379的redis节点启动(原来的master),执行命令

    redis-cli -p 6380 info replication

    查看主从信息,可以看到原来的master成为了新master的slave。
    浅谈Redis Sentinel

继续阅读