阅读目录
使用Redis Sentinel实现Redis HA。
阅读此文前,先阅读文章:《【Redis】配置redis主从复制》http://www.cnblogs.com/ssslinppp/p/5661419.html
作者:ssslinppp
配置redis主从IP和port:
master and slave | ip | port |
master | 127.0.0.1 | 6379 |
slave1 | 127.0.0.1 | 6380 |
slave2 | 127.0.0.1 | 6381 |
一、配置Sentinel.conf
上文中已经创建的主从设备,截图如下:
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154712217-1147621721.png)
如上图所示:
- master:6379
- slave1:6380
- slave2:6380
sentinel配置文件如下:
#
sentinel monitor mymaster 127.0.0.1 6379 1
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 18000
sentinel parallel-syncs mymaster 1
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154712732-1260159187.png)
解释说明如下:
>>> sentinel monitor mymaster 127.0.0.1 6379 1
- mymaster :为master redis的名称;
- ip和port指定了6379端口的Redis为master;
- quorum:一般情况下会启动多个redis sentinel作为分布式使用,当master挂掉之后,需要从若干个slave中推选出1个slave作为新的master,并将其他slave的slaveof设置指向这个新的master。而判断master redis是否挂掉,需要sentinel 说了算,只有不少于quorum个sentinel认为master redis挂掉,才会进行failover。因为这里只启动了一个sentinel,所以配置quorum为1,若是启动了多个sentinel用于分布式,可以将quorum设置>1。
>>> sentinel down-after-milliseconds mymaster 30000
表示当master redis 30s 没有应答时,就可以断定master挂掉了,但需要结合上面配置的quorum一起。
>>> sentinel failover-timeout mymaster 18000
若sentinel在该配置时间内没有完成failover操作(即故障时master/slave自动切换),则认为本次failover失败。
>>> sentinel parallel-syncs mymaster 1
指定在failover过程中,同时被sentinel reconfigure的最大slave实例数。由于reconfigure过程中,对应的slave会中断响应客户的请求,故为避免所有的slave同时不可用,该值需适当配小。
二、启动Redis Sentinel
./src/redis-sentinel sentinel.conf
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154713498-214241497.png)
从上可以看出,master redis 为6379,而slave又两个,分别为:6380和6381.
此时在去观察sentinel.conf,会发现sentinel.conf发生了变化,如下所示:
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154714170-62144698.png)
- slave 6380的日志记录:
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154715498-1947132339.png)
- 再看看sentinel的提示信息:
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154716186-1696621067.png)
- 再来观察sentinel.conf
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154717279-1502035022.png)
可以对比最初的sentinel.conf
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154717811-1291693503.png)
此时再分别看看6379/6380/6381的redis.conf:
- 6379的redis.conf
分2种情况
情况1:当6379(原先的master redis)关闭后,还未重启,此时的redis.conf文件内没有slaveof的配置;
情况2:当6379服务启动后,会在redis.conf的最后添加slaveof的配置,如下:
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154718420-1155558523.png)
同时可以看到sentinel输出如下信息:
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154719295-130649550.png)
此时看看6379的日志信息:
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154719842-1286477754.png)
- 6380的redis.conf
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154720467-1192089034.png)
- 6381的redis.conf
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154720857-754016700.png)
已经将slaveof自动修改为:6380(新的master)
测试新的同步信息:
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154721357-132712301.png)
从上面的输出结果可以看出,redis 主从复制依然有效。
四、重新切换为最初的master
前面我们看到了当master挂掉时,sentinel会自动的从slave中挑选出一个作为master,并重新配置各redis实例的配置文件。
当之前挂掉的master又重启后,如果希望还是还原到原先的主从配置,可以通过如下操作来进行:
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154721889-47819114.png)
登录到sentinel,使用命令:
redis-cli -h 127.0.0.1 -p 26379 #26379为sentinel的端口
执行语句:
sentinel failover mymaster
接下来我们来看看是否还原到之前的主从配置:
- 先看看sentinel的输出信息:
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154722529-1966858298.png)
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154723279-511518804.png)
接下来看看3个redis.conf是否自动变化了(reconfigure)
- 6379的redis.conf
全文搜索slaveof,没有此配置选项,说明已经发生了变化,因为6379此时就是master redis。
- 6380的redis.conf
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154724061-1444216204.png)
在最后添加了:slaveof 127.0.0.1 6379;
说明6380已经从master重新变化为slave了。
- 6381的redis.conf
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154724623-840650368.png)
还可以通过如下方式进行说明:
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154724998-1685805245.png)
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154726186-197267378.png)
![](https://images2015.cnblogs.com/blog/731047/201607/731047-20160712154726623-1122860742.png)
五、参考链接
《【Redis】配置redis主从复制》http://www.cnblogs.com/ssslinppp/p/5661419.html
《Configuring Redis High Availability》 http://www.veritas.com/community/blogs/configuring-redis-high-availability
《Windows下Redis Sentinel部署》http://bbs.redis.cn/forum.php?mod=viewthread&tid=715
转载请标明出处:http://www.cnblogs.com/ssslinppp/
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步