哨兵简介-哨兵原理

 

哨兵简介:由一个或多个Sentinel实例组成的Sentinel系统可监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器提升为新的主服务器,然后由新的主服务器代替已下线的主服务器继续提供命令请求,但是Sentinel还会继续监视下线的原主,当它重新上线时,将它设置为新主的从服务器。

Sentinel原理:

1、当一个Sentinel启动时,它需要执行的步骤;

1)初始化服务器;

2)将普通Redis服务器使用的代码替换成Sentinel专用代码;

3)初始化Sentinel状态;

4)根据给定的配置文件,初始化Sentinel的监视主服务器列表;

5)创建连向主服务器的网络连接:命令连接和订阅连接。

命令连接专门用于向主服务器发送命令,并接收命令回复;订阅连接专门用于订阅主服务器的_sentinel_:hello频道。Sentinel_sentinel_:hello频道订阅会一直持续到Sentinel与服务器的连接断开为止,也就是说,对于每个与Sentinel连接的服务器,Sentinel既通过命令连接向服务器的_sentinel_:hello频道发送信息,又通过订阅连接从服务器的_sentinel_:hello频道接收消息。

2Sentinel获取主服务器信息:Sentinel默认会以10秒一次的频率,通过命令连接向被监视的主服务器发送INFO命令并通过分析INFO命令的回复来获取主服务器的当前信息。

Sentinel在分析INFO命令中包含的从服务器的信息时,会检查从服务器对应的实例结构是否已经存在于slaves字典中:如果从服务器对应的实例结构已经存在,那么Sentinel对它进行更新;如果从服务器对应的实例结构不存在,那么说明这是一个新发现的从服务器,Sentinel会在slaves字典中为这个从服务器新创建一个实例结构。

3、获取从服务器信息:当Sentinel发现主服务器有新的从服务器出现时,除了会为这个新的从服务器创建相应的实例结构外,还会创建连接到从服务器的命令连接和订阅连接。在船舰命令连接后,Sentinel会在默认情况下,以10秒一次的频率通过命令连接向从服务器发送INFO命令,并获得以下内容的回复:

根据这些信息,Sentinel会对从服务器的实例结构进行更新。

4、向主服务器和从服务器发送信息:默认情况下,Sentinel会以两秒一次的频率通过命令连接向所有被监视的主服务器和从服务器发送一下格式的命令:

PUBLISH __sentinel__: hello

“<s_ip>,<s_port>,<s_runid>,<s_epoch>,<m_name>,<m_ip>,<m_port>,<m_epoch>”

S_开头的记录是Sentinel本身的信息,epoch代表当前的配置纪元;

M_开头的参数记录的则是主服务器的信息,如果Sentinel正在监视的是主服务器,则记录的是主服务器的信息,如果监视的是从服务器,记录的则是从服务器的信息。

5、接受来自主服务器和从服务器的频道信息:当Sentinel与一个主服务器或者从服务器建立起订阅连接后,Sentinel会通过订阅连接,向服务器发送SUBSCRIBE _sentinel_:hello命令,Sentinel_sentinel_:hello频道订阅会一直持续到Sentinel与服务器的连接断开为止,也就是说,对于每个与Sentinel连接的服务器,Sentinel既通过命令连接向服务器的_sentinel_:hello频道发送信息,又通过订阅连接从服务器的_sentinel_:hello频道接收消息。

对于监视同一个服务器的多个Sentinel来说,一个Sentinel发送的信息会被其它的Sentinel接受到,这些信息会更新其它的Sentinel对发送信息Sentinel的认知,也会用于更新其它Sentinel对被监视服务器的认知。

当一个Sentinel_sentinel_:hello频道收到一条信息时,会对这条信息进行分析,如果信息中记录的Sentinel运行ID和接收信息的Sentinel的运行ID相同,则说明是自己发送的,丢弃不做进一步处理,相反的,接受到的运行ID与信息记录的运行ID不同,说明这条信息是监视同一个服务器的其它Sentinel发来的,接受信息的Sentinel将根据信息中的各个参数,对相应主服务器的实例结构进行更新。

5.1各个Sentinel会通过建立命令连接相连,通过发送命令请求进行信息交换。各Sentinel之间不会创建订阅连接,Sentinel在连接主服务器或从服务器时,会同时创建命令连接和订阅连接,但是在连接其它Sentinel时,却只会创建命令连接。因为Sentinel需要通过接收主服务器或从服务器发来的频道信息来发现未知的新Sentinel,所以才需要建立订阅连接,而相互已知的Sentinel只要使用命令连接来进行通信就足够了。

6、检测主观下线状态:默认情况下,Sentinel会以每秒一次的频率向所有与它建立了命令连接的实例(包括主服务器、从服务器、其它Sentinel在内)发送PING命令,并通过返回的PING命令回复来判断实例是否在线。有效回复:+PONG -LOADING -MASTERDOWN,其余回复都是无效回复。Sentinel配置文件中的down-after-milliseconds选项指定了Sentinel判断实例进入主观下线所需要的时间长度:如果一个实例在down-after-milliseconds毫秒内,连续向Sentinel返回无效回复,那么Sentinel会修改这个实例对应的实例结构,在结构的flags属性中打开SRI_S_DOWN标识,以此来表示这个实例进入主观下线状态。

(多个Sentinel设置的主观下线时间可能不同)

7、检查客观下线状态:当一个Sentinel将一个主服务器判断为主观下线之后,同时向其它Sentinel询问判断主服务器是否真的下线,当Sentinel从其它Sentinel那里接收到足够数量的已下线判断后,Sentinel会将主服务器判定为客观下线,并对主服务器执行故障转移操作。

(1) Sentinel发送SENTINEL is-master-down-by-addr<ip> <port> <current_epoch> <runid>命令询问其它Sentinel是否同意主服务器已下线。

(2) 目标Sentinel接收SENTINEL is-master-down-by命令,分析命令检查主服务器是否已经下线,然后向源Sentinel返回一个包含三个参数的Multi Bulk回复作为SENTINEL is-master-down-by命令的回复。(down_state:返回检查结果,1代表主服务器已下线,0代表主服务器未下线 leader_runid leader_epoch)比如1 * 0回复代表Sentinel也同意主服务器下线。

(3) 接收SENTINEL is-master-down-by-addr命令的回复,统计同意主服务器已下线的数量,当数量达到配置指定的判断客观下线所需的数量时,Sentinel会将主服务器实例结构flags属性的SRI_O_DOWN标识打开,表示主服务器已经进入客观下线状态。

 

Sentinel monitor master 127.0.0.1 6379 2 当所有sentinel中有两个认为主服务器下线时,Sentinel就会将主服务器判断为客观下线。

8、选举领头Sentinel:当一个主服务器被判断为客观下线时,监视这个主服务器的各个Sentinel会进行协商,选举出一个领头Sentinel对下线主服务器进行故障转移操作。

9、故障转移:

(1)选出新主服务器:领头Sentinel向被选出从服务器(新主)发送SLAVEOF no one命令,以每秒一次的频率向被升级的从服务器发送INFO命令,观察回复的角色信息,直到slave变成master

(2)修改从服务器的复制目标;

(3)将旧的主服务器变为新主的从服务器;

 

指定配置文件开启redis:

 

/usr/local/redis3/conf/redis_6379.conf  &

 

 开启sentinel

 

./redis-server /usr/local/redis3/conf/sentinel.conf  --sentinel  &

 

开启复制 >slaveof 192.168.0.142 6379

 

加登陆密码 >config set requirepass  up366.com

 

 

 

posted @ 2018-03-30 16:21  君要上天么  阅读(1258)  评论(0编辑  收藏  举报