Sentinel
如果凌晨主节点宕机,运维不可能爬起来然后手工进行主从切换并通知所有程序把地址修改一遍并重新上线。并且这样人工运维效率太低,事故至少要1个小时才能恢复。
所以要有一个高可用方案来抵抗节点故障,故障发生时可以自动进行主从切换,程序也不用重启,Redis提供了这么一种方案——Redis Sentinel(哨兵)。
客户端通过哨兵获取主节点地址,如果主节点挂掉,哨兵自动将某个从节点升级为主节点并建立新的主从关系。
消息丢失
Redis主从采用异步复制,有可能出现主节点挂掉,而从节点还未同步完成,那么这部分未同步的数据就会丢失,Sentinel通过两个参数来限制主从延迟过大。
min-slaves-to-write 1
min-slaves-max-lag 10
第一个参数表示主节点必须有至少一个从节点在进行正常复制,否则停止写服务,丧失可用性。
第二个参数表示若10秒没有收到从节点反馈,则从节点同步异常,丧失可用性。
Sentinel基本使用
from redis.sentinel import Sentinel
sentinel = Sentinel(['localhost', 26379], socket_timeout=0.1)
sentinel.discover_master('mymaster')
sentinel.discover_slaves('mymaster')
master = sentinel.mater_for('mymaster', socket_timeout=0.1)
slave = sentinel.slave_for('mymaster', socket_timeout=0.1)
master.set('foo', 'bar')
slave.get('foo')
sentinel默认端口26379,通过discover_xxx方法可以发现主从地址,主地址只有一个,从地址可以有多个。
xxx_for方法从连接池拿一个连接来使用,因为从地址多个,Redis客户端会对从地址采用轮询方案。