在前面一篇文章《 redis高可用性基础:Master-Slave 》中,主备切换过程时有好几个步骤,需要人工介入,这势必增加服务的故障时间(Down Time)。
而 Sentinel 正是自动化这一过程的官方工具,详细文档请参考《Redis Sentinel Documentation – Redis》。
Sentinel 的功能
监控
Sentinel不断地检测Master和Slave实例的运行状态。通知
Sentinel通过API,能够通知系统管理员、其它程序:监控的Redis实例出问题了。自动故障切换
如果
Master实例出问题了,Sentinel通过将一个Slave实例提升为Master修复故障,其它Slave实例使用新的Master实例,同时通知给使用Redis服务的应用程序以便重新建立连接。配置提供者
Sentinel做为客户端服务发现的权威来源:客户端连接到Sentinel以获取当前Master的地址,故障切换后报告新的地址。
Sentinel 演示
Redis Sentinel 推荐的配置为至少三个Sentinel部署在三台不同的机器上,只配一台自已本身就是单点没有意义,二台时可能出现“脑裂”。
启动上一篇文章《 redis高可用性基础:Master-Slave 》配置好的
Master及SlaveRedis实例Master监听在6379端口,Slave监听在6380端口。使用端口号
500050015002创建三个Sentinel实例Sentinel实例a的配置文件redis-sentinel-a.confport 5000 sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 sentinel parallel-syncs mymaster 1
其它两个
Sentinel实例bc配置和a基本一样,只是端口号分别为5001和5002:终端
3启动Sentinel aredis-sentinel ./redis-sentinel-a.conf终端
4启动Sentinel bredis-sentinel ./redis-sentinel-b.conf终端
5启动Sentinel credis-sentinel ./redis-sentinel-c.conf可以发现当
Sentinel实例启动时Sentinel的配置文件会自动进行更新,记录Slave及其它Sentinel的信息。从
Sentinel获取当前Master的地址通过
redis-cli连上任一Sentinelredis-cli -p 5000127.0.0.1:5000> sentinel get-master-addr-by-name mymaster 1) "127.0.0.1" 2) "6379"
故障切换测试
让
Master停止响应30秒redis-cli -p 6379 debug sleep 30约
10秒钟后,通过Sentinel的日志输出看到发生了主从切换。重新获取当前的
Master127.0.0.1:5000> sentinel get-master-addr-by-name mymaster 1) "127.0.0.1" 2) "6380"
Redis实例的配置文件被自动修正,以反映新的Master-Slave状态:redis-master.conf添加了配置行slaveof 127.0.0.1 6380redis-slave.conf删除了配置行slaveof 127.0.0.1 6379和我们在上一篇文章《 redis高可用性基础:Master-Slave 》手工做的主备切换如出一辙。
三个
Sentinel配置文件中的Master-Slave配置也被自动修正。
疑问
Redis实例的配置文件是被谁修改的?如果是
Sentinel那么就意味着所有Redis实例的同一机器上必须配置有Sentinel(《Redis Sentinel Documentation – Redis》未提及)。万一因为某种原因,原
Master配置文件未改为Slave,会不会出现脑裂?感觉应该是会出现脑裂的,但是只要客户端应用总是使用
Sentinel提供的Master地址,就不会有问题。node.js访问单个redis实例已经用得很溜了,下一篇文章会研究node.js访问redis sentinel,相信答案就会水落石出了。Redis Sentinel能保证不丢数据吗?不能。由于
Redis是异步复制,没有办法防止数据丢失,假设配置如下:min-slaves-to-write 1 min-slaves-max-lag 10
假设出现了分裂(partition),
Master要10秒钟后才发现Slave失联再禁止写入,当分裂消除(partition heals), 旧Master做为Slave连上新的Master,这10秒钟内写入的数据不会合入(merge)新的Master,数据丢失了。