停掉现有的redis集群
因为这篇文章我是在 搭建完redis主从集群之后写的,如果要是没有搭建过这些,可以直接略过。要是从我上一篇 搭建redis主从集群过来的,可以执行下。
docker compose down
查找下redis相关进程
ps -ef | grep redis
可以看到前面的 7001 7002 7003 这三个端口已经没有了
上传sentinel.conf 文件
sentinel announce-ip "192.168.200.128"
sentinel monitor sdemaster 192.168.200.128 7001 2
sentinel down-after-milliseconds sdemaster 5000
sentinel failover-timeout sdemaster 60000
这里面就是sentinel.conf 文件的内容。
端口号要改成自己的
说明
sentinel announce-ip "192.168.200.128" :声明当前sentinel的IP
sentinel monitor hmaster sdemaster 192.168.200.128 7001 2 :指定集群的主节点信息。
sdemaster:主节点名称,自定义,任意写的。
192.168.200.128 7001 :主节点的ip和端口
2 :认定 master 下线时的 quorm 值
sentinel down-after-milliseconds sdemaster :声明master节点超时多久后被标记下线
sentinel failover-timeout sdemaster : 故障转移的超时时间
在虚拟机的 /home/sde/modules/redis 目录下创建 3个文件夹, s1 s2 s3
目录具体位置,要根据自己情况而定。
mkdir s1 s2 s3
把sentinel.conf 文件分别拷贝到 上述的3个文件夹中。
for dir in s1 s2 s3; do
cp /home/sde/modules/redis/sentinel.conf /home/sde/modules/redis/$dir/
done
具体的目录要改成你自己的
查看s1
查看s2
查看s3
修改 docker-compose.yml 文件
version: "3.2"
services:
r1:
image: redis
container_name: r1
network_mode: "host"
entrypoint: ["redis-server", "--port", "7001"]
r2:
image: redis
container_name: r2
network_mode: "host"
entrypoint: ["redis-server", "--port", "7002","--slaveof","192.168.200.128","7001"]
r3:
image: redis
container_name: r3
network_mode: "host"
entrypoint: ["redis-server", "--port", "7003","--slaveof","192.168.200.128","7001"]
s1:
image: redis
container_name: s1
volumes:
- /home/sde/modules/redis/s1:/etc/redis
network_mode: "host"
entrypoint: ["redis-sentinel", "/etc/redis/sentinel.conf", "--port", "27001"]
s2:
image: redis
container_name: s2
volumes:
- /home/sde/modules/redis/s2:/etc/redis
network_mode: "host"
entrypoint: ["redis-sentinel", "/etc/redis/sentinel.conf", "--port", "27002"]
s3:
image: redis
container_name: s3
volumes:
- /home/sde/modules/redis/s3:/etc/redis
network_mode: "host"
entrypoint: ["redis-sentinel", "/etc/redis/sentinel.conf", "--port", "27003"]
/home/sde/modules/redis 是我自己创建的目录,这个文件要根据你们自己的目录更改。
解读:
image:redis 执行使用的redis镜像
container_name:s1 指定容器的名称为s1
volumes 讲宿主机上的 /home/sde/modules/redis/s1 目录挂载到容器内的 /etc/redis 目录。
作用:讲sentinel的配置文件 sentinel.conf 存储在宿主机上,方便持久化和修改。
注意:确保宿主机上的 s1 目录已经存在 sentinel.conf 文件
network_mode:"host" 使用宿主机的网络模式,而不是docker默认桥接模式,这样容器可以直接使用宿主机的网络线,避免端口映射问题。
entrypoint 覆盖默认的容器启动命令,指定启动 Redis Sentinel 的方式
redis-sentinel:Redis Sentinel 的启动方式。
/home/sde/modules/redis/sentinel.conf 指定Sentinel的配置文件路径(挂载的宿主机路径)。
--port 27001 指定sentinel监听的端口号为 27001
s2 s3 服务的配置依次类推。
启动集群
docker compose up -d
以s1为例,查看运行日志。
docker logs -f s1
s1
s2
s3
可以看到sentinel已经联系到了7001这个节点,并且与其它几个哨兵也建立了链接。哨兵信息如下:
27001
:Sentinel ID
是b59bad2b0876679bf6155f9aaec3a0ad1f386b5b
27002
:Sentinel ID
是bdc690efab03792689dc7ba1cb2fe92f973dc3d9
27003
:Sentinel ID
是bb02acb3ffaa1ee4e542d79c8dbc1bc111d057c8
演示failover
接下来,我们演示一下当主节点故障时,哨兵是如何完成集群故障恢复(failover)的。
我们停止7001
这个master
节点,然后再启动模拟宕机重启:
docker stop r1
稍微等待一段时间后,会发现sentinel节点触发了failover:可以使用 docker logs -f s1 等查看各个容器的日志:
启动 r1
docker start r1
看看 s1 日志
看看 r2 信息
docker exec -it r2 redis-cli -p 7002
可以看到 r2 成为了新的主节点