Master <= Salveredis
10.24.6.5:6379 <= 10.24.6.7:6379服务器
flushdb:删除这个db下的。
flushall:删除全部socket
Sentinel服务器地址:tcp
10.24.6.7翻译
启动3d
Redis-sentinel sentinel.confserver
或者blog
Redis-server sentinel.conf –sentinel排序
Redis服务器:ip
Master <= Salve
10.24.6.5:6379 <= 10.24.6.7:6379
10.24.6.4:6379
10.24.6.6:6379
有两种方式,一种是经过配置文件,如何配置参考附录的sentinel.conf。这种方式主要是面向预配置的redis群集。
另一种方式使用redis-cli作热配置:
127.0.0.1:26381> sentinel monitor mymaster 172.18.18.207 6501 1 OK
命令的格式以下:
SENTINEL MONITOR <name> <ip> <port> <quorum>
注:quorum表示发起failover须要的sentinel数量,看sentinel群集的数量决定。
从sentinel中删除群集,命令: 172.18.18.207:26381> sentinel remove mymaster OK
from redis.sentinel import Sentinel
sentinel = Sentinel([('10.24.6.7', 26379)], socket_timeout=0.1)
master = sentinel.master_for('10.24.6.5master', socket_timeout=0.1)
print master
master.set('foo', 'bar')
print master.get('foo')
首先解释2个名词:SDOWN和ODOWN.
SDOWN适合于master和slave,可是ODOWN只会使用于master;当slave失效超过"down-after-milliseconds"后,那么全部sentinel实例都会将其标记为"SDOWN".
1) SDOWN与ODOWN转换过程:
2) Sentinel与slaves"自动发现"机制:
在sentinel的配置文件中(local-sentinel.conf),都指定了port,此port就是sentinel实例侦听其余sentinel实例创建连接的端口.在集群稳定后,最终会每一个sentinel实例之间都会创建一个tcp连接,此连接中发送"PING"以及相似于"is-master-down-by-addr"指令集,可用用来检测其余sentinel实例的有效性以及"ODOWN"和"failover"过程当中信息的交互.
在sentinel之间创建链接以前,sentinel将会尽力和配置文件中指定的master创建链接.sentinel与master的链接中的通讯主要是基于pub/sub来发布和接收信息,发布的信息内容包括当前sentinel实例的侦听端口:
发布的主题名称为"__sentinel__:hello";同时sentinel实例也是"订阅"此主题,以得到其余sentinel实例的信息.因而可知,环境首次构建时,在默认master存活的状况下,全部的sentinel实例能够经过pub/sub便可得到全部的sentinel信息,此后每一个sentinel实例便可以根据+sentinel信息中的"ip+port"和其余sentinel逐个创建tcp链接便可.不过须要提醒的是,每一个sentinel实例均会间歇性(5秒)向"__sentinel__:hello"主题中发布本身的ip+port,目的就是让后续加入集群的sentinel实例也能或获得本身的信息.
根据上文,咱们知道在master有效的状况下,便可经过"INFO"指令得到当前master中已有的slave列表;此后任何slave加入集群,master都会向"主题中"发布"+slave 127.0.0.1:6579 ..",那么全部的sentinel也将当即得到slave信息,并和slave创建连接并经过PING检测其存活性.
补充一下,每一个sentinel实例都会保存其余sentinel实例的列表以及现存的master/slaves列表,各自的列表中不会有重复的信息(不可能出现多个tcp链接),对于sentinel将使用ip+port作惟一性标记,对于master/slaver将使用runid作惟一性标记,其中redis-server的runid在每次启动时都不一样.
3) Leader选举:
其实在sentinels故障转移中,仍然须要一个“Leader”来调度整个过程:master的选举以及slave的重配置和同步。当集群中有多个sentinel实例时,如何选举其中一个sentinel为leader呢?
在配置文件中“can-failover”“quorum”参数,以及“is-master-down-by-addr”指令配合来完成整个过程。
A) “can-failover”用来代表当前sentinel是否能够参与“failover”过程,若是为“YES”则代表它将有能力参与“Leader”的选举,不然它将做为“Observer”,observer参与leader选举投票但不能被选举;
B) “quorum”不只用来控制master ODOWN状态确认,同时还用来选举leader时最小“赞同票”数;
C) “is-master-down-by-addr”,在上文中以及提到,它能够用来检测“ip + port”的master是否已经处于SDOWN状态,不过此指令不只可以得到master是否处于SDOWN,同时它还额外的返回当前sentinel本地“投票选举”的Leader信息(runid);
每一个sentinel实例都持有其余的sentinels信息,在Leader选举过程当中(当为leader的sentinel实例失效时,有可能master server并没失效,注意分开理解),sentinel实例将从全部的sentinels集合中去除“can-failover = no”和状态为SDOWN的sentinels,在剩余的sentinels列表中按照runid按照“字典”顺序排序后,取出runid最小的sentinel实例,并将它“投票选举”为Leader,并在其余sentinel发送的“is-master-down-by-addr”指令时将推选的runid追加到响应中。每一个sentinel实例都会检测“is-master-down-by-addr”的响应结果,若是“投票选举”的leader为本身,且状态正常的sentinels实例中,“赞同者”的本身的sentinel个数不小于(>=) 50% + 1,且不小与<quorum>,那么此sentinel就会认为选举成功且leader为本身。
在sentinel.conf文件中,咱们指望有足够多的sentinel实例配置“can-failover yes”,这样可以确保当leader失效时,可以选举某个sentinel为leader,以便进行failover。若是leader没法产生,好比较少的sentinels实例有效,那么failover过程将没法继续.
4) failover过程:
在Leader触发failover以前,首先wait数秒(随即0~5),以便让其余sentinel实例准备和调整(有可能多个leader??),若是一切正常,那么leader就须要开始将一个salve提高为master,此slave必须为状态良好(不能处于SDOWN/ODOWN状态)且权重值最低(redis.conf中)的,当master身份被确认后,开始failover
A)“+failover-triggered”: Leader开始进行failover,此后紧跟着“+failover-state-wait-start”,wait数秒。
B)“+failover-state-select-slave”: Leader开始查找合适的slave
C)“+selected-slave”: 已经找到合适的slave
D) “+failover-state-sen-slaveof-noone”: Leader向slave发送“slaveof no one”指令,此时slave已经完成角色转换,此slave即为master
E) “+failover-state-wait-promotition”: 等待其余sentinel确认slave
F)“+promoted-slave”:确认成功
G)“+failover-state-reconf-slaves”: 开始对slaves进行reconfig操做。
H)“+slave-reconf-sent”:向指定的slave发送“slaveof”指令,告知此slave跟随新的master
I)“+slave-reconf-inprog”: 此slave正在执行slaveof + SYNC过程,如过slave收到“+slave-reconf-sent”以后将会执行slaveof操做。
J)“+slave-reconf-done”: 此slave同步完成,此后leader能够继续下一个slave的reconfig操做。循环G)
K)“+failover-end”: 故障转移结束
L)“+switch-master”:故障转移成功后,各个sentinel实例开始监控新的master。
Sentinel.conf详解