哨兵的介绍
redis的设计者为了让redis能够在主从模式下实现故障恢复的自动化,为此提供了redis的哨兵功能。哨兵是一个独立于数据服务器的进程,用于监控redis数据服务器的状态,当主从模式下最关键的主服务器出现故障时,能够被哨兵自动的察觉。同时哨兵会在剩余的从服务器中"选举"出新的主服务器,达到自动化恢复系统服务的目的。
哨兵的作用
注意:哨兵也是一台redis服务器,只是不提供数据相关服务,通常哨兵的数量配置为单数。
哨兵的使用
redis提供了redis-sentinel脚本用于部署哨兵,启动时通过指定的哨兵配置文件来对哨兵的行为进行灵活的控制。哨兵的配置文件中至少需要包含被哨兵监控的主服务器IP、端口、投票决定数目,当然也可以配置诸如down-after-milliseconds(发送ping命令的时间间隔,用于监听)等选项。
配置哨兵
设置哨兵监听的主服务器信息, sentinel_number表示参与投票的哨兵数量
sentinel monitor master_name master_host master_port sentinel_number
设置判定服务器宕机时长,该设置控制是否进行主从切换
sentinel down-after-milliseconds master_name million_seconds
设置故障切换的最大超时时长
sentinel failover-timeout master_name million_seconds
设置主从切换后,同时进行数据同步的slave数量,数值越大,要求网络资源越高,数值越小,同步时间越长
sentinel parallel-syncs master_name sync_slave_number
哨兵在进行主从切换过程中经历三个阶段:监控、通知、故障转移。
阶段一:监控阶段【同步信息】
阶段二:通知阶段【保持联通】
阶段三:故障转移阶段
发现问题,主观下线与客观下线
竞选负责人,优选新的master。选出master后,其他slave切换master,原master故障恢复后作为slave连接。
哨兵启动时会与主服务器建立连接,并且间接的获得所属从服务器信息,完成哨兵的初始化。哨兵初始化完成之后,会周期性的和主从服务器、其它哨兵节点(通过消息频道的订阅/发布)进行通信。
哨兵每10秒会向所有服务器发送一次INFO命令,获得相关redis服务器的当前状态以便决定是否需要故障恢复。
当一个哨兵在down-after-milliseconds规定时间内未收到主服务器的响应,则当前哨兵"主观"认为主服务器下线,同时和监视当前系统的其它哨兵进行投票决定,当超过当前哨兵配置中投票决定的数目时,则当前哨兵"客观"认为主服务器下线,哨兵集群会选举出领导哨兵来进行主从服务器集群主从状态的切换(使用Raft算法)。
简单操作
多个哨兵,不仅同时监控主从数据库,而且哨兵之间互为监控。在保证Redis主从架构集群可用的前提下,复制三份配置文件
分别配置哨兵
修改sentinel配置文件
vim /usr/local/redis/6379/26379.conf
修改内容:
# 添加守护进程模式
daemonize yes
# 添加指明日志文件名
logfile "/usr/local/redis/6379/sentinel26379.log"
# 修改工作目录
dir "/usr/local/redis/6379"
# 修改启动端口
port 26379
# 关闭保护模式
protected-mode no
# 修改sentinel monitor
sentinel monitor mymaster 192.168.16.88 6379 2
依次修改26380,26381配置
说明:
redis-test-master:监控主数据的名称,自定义即可,可以使用大小写字母和“.-_”符号
192.168.29.128:监控的主数据库的IP
6379:监控的主数据库的端口
2:最低通过票数
哨兵启动命令
redis-sentinel /usr/local/redis/6379/26379.conf 或者 redis-server /usr/local/redis/6379/26379.conf --sentinel
redis-sentinel /usr/local/redis/6380/26380.conf 或者 redis-server /usr/local/redis/6380/26380.conf --sentinel
redis-sentinel /usr/local/redis/6381/26381.conf 或者 redis-server /usr/local/redis/6381/26381.conf --sentinel
哨兵模式常用命令
1.查看sentinel的基本状态信息
127.0.0.1:26379> INFO
2.列出所有被监视的主服务器,以及这些主服务器的当前状态
127.0.0.1:26379> SENTINEL MASTERS redis-test-master
3.列出给定主服务器的所有从服务器,以及这些从服务器的当前状态
127.0.0.1:26379> SENTINEL SLAVES redis-test-master
4.返回给定名字的主服务器的IP地址和端口号
127.0.0.1:26379> SENTINEL GET-MASTER-ADDR-BY-NAME redis-test-master
5.重置所有名字和给定模式pattern相匹配的主服务器,重置操作清除主服务器目前的所有状态,包括正在执行中的故障转移,并移除目
前已经发现和关联的,主服务器的所有从服务器和Sentinel
127.0.0.1:26379> SENTINEL RESET redis-test-master
6.当主服务器失效时,在不询问其他Sentinel意见的情况下,强制开始一次自动故障迁移,但是它会给其他Sentinel发送一个最新的配
置,其他sentinel会根据这个配置进行更新
127.0.0.1:26379> SENTINEL FAILOVER redis-test-master
7.查看其它哨兵信息
127.0.0.1:26379> SENTINEL sentinels redis-test-master
查看某个哨兵的信息
查看log文件,可以看到如下信息
查看redis的进程
关闭端口为6379的redis,进行查看
查看26381的日志文件
Sentinel原理介绍
首先解释2个名词:SDOWN和ODOWN。
SDOWN:
subjectively down,直接翻译的为”主观”失效,即当前sentinel实例认为某个redis服务为”不可用”状态.
ODOWN:
objectively down,直接翻译为”客观”失效,即多个sentinel实例都认为master处于”SDOWN”状态,那么此时master将处于ODOWN,ODOWN可以简单理解为master已经被集群确定为”不可用”,将会开启failover
SDOWN与ODOWN转换过程:
1. 每个sentinel实例在启动后,都会和已知的slaves/master以及其他sentinels建立TCP连接,并周期性发送PING(默认为1秒),在交互中,如果redis-server无法在”down-after-milliseconds”时间内响应或者响应错误信息,都会被认为此redis-server处于SDOWN状态。
2.SDOWN的server为master,那么此时sentinel实例将会向其他sentinel间歇性(一秒)发送”is-master-down-by-addr <ip> <port>”指令并获取响应信息,如果足够多的sentinel实例检测到master处于SDOWN,那么此时当前sentinel实例标记master为ODOWN…其他sentinel实例做同样的交互操作.配置项”sentinel monitor <mastername><masterip> <masterport> <quorum>”,如果检测到master处于SDOWN状态的slave个数达到<quorum>,那么此时此sentinel实例将会认为master处于ODOWN。
每个sentinel实例将会间歇性(10秒)向master和slaves发送”INFO”指令,如果master失效且没有新master选出时,每1秒发送一次”INFO”;”INFO”的主要目的就是获取并确认当前集群环境中slaves和master的存活情况.
经过上述过程后,所有的sentinel对master失效达成一致后,开始failover.
Sentinel与slaves”自动发现”机制:
在sentinel的配置文件中,都指定了port,此port就是sentinel实例侦听其他sentinel实例建立链接的端口.在集群稳定后,最终会每个sentinel实例之间都会建立一个tcp链接,此链接中发送”PING”以及类似于”is-master-down-by-addr”指令集,可用用来检测其他sentinel实例的有效性以及”ODOWN”和”failover”过程中信息的交互.在sentinel之间建立连接之前,sentinel将会尽力和配置文件中指定的master建立连接.sentinel与master的连接中的通信主要是基于pub/sub来发布和接收信息,发布的信息内容包括当前sentinel实例的侦听端口.
以上是对redis哨兵机制的简介,如有不足欢迎留言指正。。。