redis哨兵

一、用途

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')
posted @ 2020-09-08 20:12  专业搬砖人士  阅读(126)  评论(0)    收藏  举报