基础参考:https://www.cnblogs.com/wang-li/p/9955303.html
配置文件讲解
1.sentinel monitor
# sentinel monitor <master-name> <ip> <redis-port> <quorum> sentinel 监视主服务器的信息,master-name:是主服务器名称 ip:是主服务器ip redis-port:是主服务器端口 quorum:主服务器失效需要多少个sentinel同意,如果同意的sentinel不达标,则不会进行redis 故障迁移 默认配置: sentinel monitor mymaster
2.sentinel down-after-milliseconds
# sentinel down-after-milliseconds <master-name> <milliseconds> SDOWN:如果服务器在给定的毫秒数之内,没有返回sentinel发送的PING命令的回复,或则返回一个错误,那么sentinel将这个服务器标记为主观下线(subjectively down,简称SDOWN) ODOWN:只有在数量足够多的sentinel都将一个服务器标记为主观下线后,服务器才会被标记为客观下线(objectively down),这时,自动故障迁移才会执行 默认配置: sentinel down-after-milliseconds mymaster
SDOWN log如下:
==> log-by-sentinel-.log <== :X Nov :: ==> log-by-sentinel-.log <== :X Nov :: ==> log-by-sentinel-.log <== :X Nov ::
通过上面的log,可以发现,此3个log都是主观下线SDOWN
2.1关于主观下线和客观下线
2.1.1主观下线:
是指单个sentinel实例对单个服务器做出SDOWN的判断
2.1.2客观下线:
是指多个sentinel实例对单个服务器做出的SDOWN判断,并且通过sentinel is-master-down-by-addr命令交流后,得出的服务器下线判断
ODOWN log如下:
==> log-by-sentinel-.log <== :X Nov :: #quorum / :X Nov :: :X Nov :: :X Nov ::
3.sentinel parallel-syncs
# sentinel parallel-syncs <master-name> <numslaves> 在执行故障转移时,可以同时有多少从服务器对新的主服务器进行数据同步,此值越小,同步时间越长,此值越大,同步时间越小,但是所耗费的网路资源也就越多 默认配置: sentinel parallel-syncs mymaster
4.sentinel auth-pass
# sentinel auth-pass <master-name> <password> 用于设置主库和从库的master-name 和密码,不过需要关注的点是,主库和从库应该设置为一致的,否则会有问题
5.sentinel notification-script
# sentinel notification-script <master-name> <script-path> 用于设置在进行故障转移后服务器发送的脚本 例如:自己写一个简单的python脚本,接收到的信息如下:
6.sentinel client-reconfig-script
# sentinel client-reconfig-script <master-name> <script-path> 用于设置在进行故障转移后客户端发送的脚本
关于redis sentinel的客户端
如果Redis sentinel在进行故障转移后,并没有将master的信息通知到客户端,那么故障转移将毫无意义
Python来实现
代码如下
# cat redis_sentinel_client.py #!/usr/bin/env python3 import redis import redis.sentinel sentinel_list = redis.sentinel.Sentinel([ (), (), (), ]) #获取主服务器信息 get_master_info = sentinel_list.discover_master('mymaster') print (get_master_info) #获取从服务器信息 get_slave_info = sentinel_list.discover_slaves('mymaster') print (get_slave_info) #主服务器进行写入 write_redis_master = sentinel_list.master_for() print ("主库端口: %s" %(write_redis_master.info()['tcp_port'])) ','test123'): #从服务器进行读取 read_redis_slaves = sentinel_list.slave_for() print ("从库端口:%s" %(read_redis_slaves.info()['tcp_port'])) print (read_redis_slaves.get(')) #
执行结果如下
# ./redis_sentinel_client.py () [(), ()] 主库端口: 从库端口: b'test123' # ./redis_sentinel_client.py () [(), ()] 主库端口: 从库端口: b'test123' #