一、用途
1、监视库的状态,以便及时处理
2、主库发生故障时,可以自动做主从转移,保证基本的功能
二、流程
1、sentinel本质也是redis进程,开启多个sentinel进程,库连接到sentinel的地址
2、足够数量的sentinel发现并确认master有故障
3、所有sentinel选举其中一个sentinel作为leader
4、leader选择一个slave作为新的master
5、通知其他slave哪个库是新的master
6、修正主从关系
7、老的master复活成为slave
三、配置
1、sentinel monitor mastername ip port quorum:sentinel监视的库地址,自定义库名称,需要多少数量的sentinel可以判定故障
2、sentinel auth-pass mastername password:连接库节点时的密码,因为sentinel需要监视所有主从节点,所以密码应该设置相同
3、sentinel down-after-milliseconds mastername milliseconds:主库异常多久才被认为故障,单位是毫秒,默认30000
4、sentinel parallel-syncs mastername slavenum:主从切换后,同时能有多少个slave对新的master进行数据加载,数字越小,整个过程就越长,数字越大,同时就会有多少slave不可用
5、sentinel failover-timeout mastername milliseconds
①同一个sentinel对同一个master两次failover之间的最小间隔时间
②当一个slave从一个错误的master那里同步数据开始计算,直到slave被纠正为向正确的master那里同步数据的时间
③想要取消一个正在进行的failover所需要的时间
④当进行failover时,配置所有slaves指向新的master所需的最大时间,不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
四、python端实现
from redis.sentinel import Sentinel
# 创建哨兵
sentinel = Sentinel(
[
('127.0.0.1', 63791),
('127.0.0.1', 63792),
('127.0.0.1', 63793)
],
socket_timeout=5
)
# 连接主库
sentinel.discover_master('test_master')
# 连接从库
sentinel.discover_slaves('test_master')
# 读写分离的情况
# 获取主库写入
master = sentinel.master_for('test_master', socket_timeout=0.5)
master.set('name', 'tom')
# 获取从库读出
slave = sentinel.slave_for('test_master', socket_timeout=0.5)
res = slave.get('name')