搭建Redis哨兵集群

发布于:2025-03-25 ⋅ 阅读:(28) ⋅ 点赞:(0)

停掉现有的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这个节点,并且与其它几个哨兵也建立了链接。哨兵信息如下:

  • 27001Sentinel IDb59bad2b0876679bf6155f9aaec3a0ad1f386b5b
  • 27002Sentinel IDbdc690efab03792689dc7ba1cb2fe92f973dc3d9
  • 27003Sentinel IDbb02acb3ffaa1ee4e542d79c8dbc1bc111d057c8

演示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 成为了新的主节点


网站公告

今日签到

点亮在社区的每一天
去签到