php使⽤redis哨兵机制,redis哨兵模式⼯作原理
简介
sentinel是redis⾼可⽤的解决⽅案,sentinel系统(N个sentinel实例,N >= 1)可以监视⼀个或者多个redis master服务,以及这些master 服务的所有从服务;当某个master服务下线时,⾃动将该master下的某个从服务升级为master服务替代已下线的master服务继续处理请求。
1. sentinel初始化
可以使⽤命令
redis-sentinel /path/f
或者
redis-server /path/f --sentinel
来启动sentinel
redis支持的数据结构sentinel启动时,需要经过⼀下⼏个步骤
a. 初始化服务
sentinel本质上是⼀个特殊的redis服务,所以初始化的时候跟redis服务初始化差不多,不过有⼏点不⼀样;⾸先sentinel不会载⼊RDB或者AOF⽂件,因为sentinel根本不使⽤数据库,其次,sentinel不能使⽤数据库键值对⽅⾯的命令,例如set、del、flushdb等等,同
时,sentinel也不能使⽤事务、脚本、RDB或者AOF持久化命令,最后,复制命令,发布与订阅命令,⽂件事件处理器,时间事件处理器等只能在sentinel内部使⽤。
b. 将普通redis代码转成sentinel专⽤代码
将redis服务的代码转成sentinel的专⽤代码,例如sentinel的command与redis的command命令表就不⼀样(redis很多命令,sentinel不需要)
c. 初始化sentinel状态
主要是初始化sentinelState结构,sentinelState⾥⾯保存了sentinel的所有功能和状态,sentinelState结构如下
d. 根据指定的配置⽂件,初始化sentinel监视的主服务器列表
其实就是初始化sentinelState中的masters属性,masters字典中记录了所有被监视的主服务器信息,其中键是服务器名字,值是服务对应的sentinelRedisInstance结构,主要有实例名字,运⾏id,实例地址,客观下线票数,主管下线的最⼤⽆响应时间等等
sentinelState中masters字典的⼤致结构如下:
e. sentinel创建与masters(所有master)之间的⽹络连接
创建与被监视的master的⽹络连接后,sentinel成为该master的客户端,它会向master发送命令,并从master的响应中获取master的信息。对于每个被监视的master,sentinel会向其创建两个异步的⽹络连接
命令连接,这个连接专门⽤于向master发送命令,并接收命令回复
订阅连接,专门订阅master服务的 sentinel:hello频道
2. 获取master信息
sentinel以每10秒⼀次的频率向master发送info命令,通过info的回复来分析master信息,master的回复主要包含了两部分信息,⼀部分是master⾃⾝的信息,⼀部分是master所有的slave(从)的信息,所以sentinel可以⾃动发现master的从服务。sentinel从master哪⼉获取到的master⾃⾝信息以及master所有的从信息,将会更新到sentinel的sentinelState中及masters(sentinelRedisInstance结构)中的slaves字典中
3. 获取从服务器信息
当sentinel发现master有新的从服务时,不但为从服务创建相信的实例结构,⽽且还会创建连接到该从服务的命令连接和订阅连接,创建命令连接后,sentinel会10秒每次的向从服务发送info命令,并从回复信息中提取从服务ID、从服务⾓⾊、从服务所属的主服务的ip及端⼝、主从服务的连接状态、从服务的优先级、从服务的复制偏移量等信息;创建或者更新到从服务的sentinelRedisInstance结构。
4. 向被监视服务器发送询问命令
sentinel会以每两秒⼀次的频率向所有的被监视服务器(master和从服务)发送询问命令,命令格式如下
publish ___sentinel___:hello s_ip s_port s_runid s_epoch m_name m_ip m_port m_epoch
各个参数的解析如下
s_ip:sentinel的ip
s_port:sentinel的端⼝
s_runid:sentinel云⼼id
s_epoch:sentinel当前的配置纪元
m_name:主服务器名字
m_ip:主服务器ip
m_port:主服务器端⼝
m_epoch:主服务器纪元
5. 接收被监视服务器的频道信息
sentinel与被监视的服务之间,⼀⽅⾯,sentinel通过命令链接发送信息到频道,另⼀⽅⾯,通过订阅连接从频道中接收信息。
对于同⼀服务的多个sentinel,⼀个sentinel发送的信息,会被其他sentinel收到,⽤于更新对该sentinel以及被监视服务的认知,⽤于更新sentinelRedisInstance的sentinels字典信息(请看sentinelRedisInstance的数据结构)及master信息。
当sentinel通过频道发现新的sentinel时,不但会更新上图的sentinel字典,同时会与新的sentinel建⽴命令连接(不会建⽴订阅连接,没啥可订阅的,因为sentinel与master及从建⽴订阅连接,是⽤来发现新的sentinel,⽽sentinel之间是已知的,所以不需要订阅连接),最终,监视同⼀个服务的多个sentinel会互联形成⼀个⽹络。
6. 主观下线
⾸先解析⼀下什么叫主观下线,所谓主观下线,就是单个sentinel认为某个服务下线(有可能是接收不到订阅,之间的⽹络不通等等原因)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。