哨兵的作用是监控Redis系统的运行状态,功能包括以下两个:
序号 | 功能 |
---|---|
1 | 监控主数据库和从数据库是否正常运行 |
2 | 主数据库出现故障时自动将从数据库转换为主数据库 |
在一主多从的Redis系统中,可以使用多个哨兵进行监控任务以保证系统的问题。
主服务器端口号6379,两个从服务器端口分别为:6380和6381.
主服务器 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=84,lag=0
slave1:ip=127.0.0.1,port=6380,state=online,offset=84,lag=1
从服务器 6380
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
从服务器 6381
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
修改和redis.conf同级目录下的sentinel.conf文件.
sentinel monitor mymaster 127.0.0.1 6380 1
# sentinel monitor master-name ip redis-port quorum
命令 | 用例 | 说明 |
---|---|---|
master-name | mymaster | 要监控的主数据库的名称,可以自定义, 组成大小写字母,数字和". - _"组成 |
ip | 127.0.0.1 | 主数据库(master)的地址 |
redis-port | 6379 | 主数据库的端口 |
quorum | 1 | 最低通过的票数 |
启动哨兵模式:
src/redis-sentinel sentinel.conf
哨兵模式只需要配置其监控的主数据库即可,哨兵会自动发现所有复制该数据库的从数据库。
关闭6379master测试
查看6379状态
关闭6379等待一会查看哨兵进程界面
当看到如上图的信息后,我们再查看6380的时候,发现该节点已经变成了master了。
再启动6379我们发现该实例依然是slave并不会改变
配置
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel monitor othermaster 192.168.88.60 6380 4
监控不同数据库使用不同的配置参数:
sentinel down-after-millisenconds mymaster 60000
sentinel down-after-millisenconds othermaster 10000
和主数据库连接建立完成后,哨兵会使用连接2发送如下命令:
首先,发送INFO命令会返回当前数据库的相关信息(运行id,从数据库信息等)从而实现新节点的自动发现,前面提到的配置哨兵时只需要监控Redis主数据库即可,因为哨兵可以借助INFO命令来获取所有的从数据库信息(slave),进而和这两个从数据库分别建立两个连接。在此之后哨兵会每个10秒钟向已知的主从数据库发送INFO命令来获取信息更新并进行相应的操作。
接下来哨兵向主从数据库的_sentinel_:hello 频道发送信息来与同样监控该数据库的哨兵分享自己的信息。发送信息内容为:
<哨兵的地址>,<哨兵的端口>,<哨兵的运行ID>,<哨兵的配置版本>,
<主数据库的名字>,<主数据库的地址>,<主数据库的端口>,<主数据库的配置版本>
哨兵通过监听的_sentinel_:hello频道接收到其他哨兵发送的消息后会判断哨兵是不是新发现的哨兵,如果是则将其加入已发现的哨兵列表中并创建一个到其的连接(哨兵与哨兵只会创建用来发送PING命令的连接,不会创建订阅频道的连接)。
实现了自定发现从数据库和其他哨兵节点后,哨兵要做的就是定时监控这些数据和节点运行情况,每隔一定时间向这些节点发送PING命令来监控。间隔时间和down-after-milliseconds选项有关,down-after-milliseconds的值小于1秒时,哨兵会每隔down-after-milliseconds指定的时间发送一次PING命令,当down-after-milliseconds的值大于1秒时,哨兵会每隔1秒发送一次PING命令。例如:
// 每隔1秒发送一次PING命令
sentinel down-after-milliseconds mymaster 60000
// 每隔600毫秒发送一次PING命令
sentinel down-after-milliseconds othermaster 600
当超过down-after-milliseconds指定时间后,如果被PING的数据库或节点仍然未回复,则哨兵认为其主观下线(subjectively down),主观下线表示从当前的哨兵进程看来,该节点已经下线。
在主观下线后,如果该节点是主数据库,则哨兵会进一步判断是否需要对其进行故障恢复,哨兵发送SENTINEL is-master-down-by-addr 命令询问其他哨兵节点以了解他们是否也认为该主数据库主观下线,如果达到指定数量时,哨兵会认为其客观下线(objectively down),并选举领头的哨兵节点对主从系统发起故障恢复。这个指定数量就是前面配置的 quorum参数。
sentinel monitor mymaster 127.0.0.1 6380 2
该配置表示只有当至少有两个Sentinel节点(包括当前节点)认为该主数据库主观下线时,当前哨兵节点才会认为该主数据库客观下线。接下来选举领头哨兵。
当前哨兵虽然发现了主数据客观下线,需要故障恢复,但故障恢复需要由领头哨兵来完成。这样来保证同一时间只有一个哨兵来执行故障恢复,选举领头哨兵的过程使用了Raft算法,具体过程如下:
选出领头哨兵后,领头哨兵将会开始对主数据库进行故障恢复。步骤如下
序号 | 挑选依据 |
---|---|
1 | 所有在线的从数据库中,选择优先级最高的从数据库。优先级通过replica-priority参数设置 |
2 | 优先级相同,则复制的命令偏移量越大(复制越完整)越优先 |
3 | 如果以上都一样,则选择运行ID较小的从数据库 |