前言
毕设中使用了 Redis 作为缓存,自己以往的项目中使用的都是单机的 Redis,这次要将单机的 Redis 实例改为 Redis 集群。
更新:这种方式部署有坑,外网环境下无法访问该集群,解决办法已更新在《Docker网络模型踩坑》。
搭建步骤
系统环境:Centos7.4 & Docker 18.09.2
首先拉取Redis镜像。
1 | $ docker pull redis |
搭建一主二从集群,yourpassword
为自定义密码,注意主从密码需要一致。
1 | # master |
下载 Redis 官方的哨兵配置 sentinel.conf。
1 | $ wget http://download.redis.io/redis-stable/sentinel.conf |
查看 master 的 IP 地址。
1 | $ docker inspect redis-master |
即下面的”IPAddress”字段。
1 | [ |
在 sentinel.conf 中配置以下字段。
1 | port 26379 |
其中第三个参数
复制多两份配置。
1 | $ cp sentinel.conf sentinel2.conf |
再将 sentinel2.conf 和 sentinel3.conf 中的 port
分别改为 26380 与 26381。
启动三个哨兵。
1 | # sentinel1 |
检查哨兵启动是否成功。
1 | $ docker exec -it redis-sentinel bash |
显示以下信息说明集群已启动成功。
1 | # Sentinel |
下线 master,检测主从切换是否成功。1
$ docker stop redis-master
等待一段时间,进入任意 sentinel 内部。
1 | $ docker exec -it redis-sentinel bash |
可以看到主库已经成功切换。1
2
3
4
5
6
7# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=X.X.X.X:6380,slaves=2,sentinels=3
或者输入 sentinel master mymaster
,同样可以看到主库切换后的结果。1
2
3
4
5
61) "name"
2) "mymaster"
3) "ip"
4) "X.X.X.X"
5) "port"
6) "6380"
注:即使重新启动原来的 redis-master 节点,集群也不会自动切换回该节点,需手动切换。
题外话:1
2
3
4# Sentinel
sentinel_masters:1
···
master0:name=mymaster,status=ok,address=X.X.X.X:6380,slaves=2,sentinels=3
info
命令返回的信息中的 status 字段其实还有其他几种状态,仅列两个需要注意的如下:
- s_down :Subjectively down(主观下线),即当前sentinel 认为 master 为”不可用”状态。
- o_down :Objectively down(客观下线),即多个 sentinel 都认为 master 处于”s_down”状态,那么此时master将处于 o_down状态,即 master 已经被集群确定为”不可用”,将会开启 failover 重新选举新的 matser。
注意,Objectively down(客观下线)只适用于 master 节点, 对于其他类型的 Redis 节点, sentinel 在将它们判断为失效前不需要进行协商, 所以从服务器或者其他 sentinel 永远都不会达到客观下线的条件。