如何实现 Docker Redis 哨兵集群不切换 Master

Redis 是一个开源的内存数据结构存储系统,广泛用于缓存和数据库任务。为了增强 Redis 的可用性,哨兵机制应运而生。本文将指导你如何在 Docker 中构建一个 Redis 哨兵集群,并保持 Master 节点不切换。

流程概述

在创建 Redis 哨兵集群之前,我们需要清楚整个流程,以下是步骤概览:

步骤 操作描述
步骤 1 创建 Docker 网络
步骤 2 启动 Master Redis 实例
步骤 3 启动 Slave Redis 实例
步骤 4 配置 Redis Sentinel
步骤 5 检查哨兵状态
步骤 6 关闭自动故障转移

接下来,我们将详细介绍每一步的具体实现。

步骤详解

步骤 1:创建 Docker 网络

首先,我们需要创建一个专用的 Docker 网络,以便所有的 Redis 实例和 Sentinel 都可以相互通信。

docker network create redis-net
  • docker network create redis-net:创建一个名为 redis-net 的网络。

步骤 2:启动 Master Redis 实例

接下来,我们将在 Docker 中启动一个 Master Redis 实例。

docker run -d --name redis-master --net redis-net redis:latest
  • docker run -d:以分离模式运行容器。
  • --name redis-master:指定容器的名称为 redis-master
  • --net redis-net:将容器连接到我们刚创建的 redis-net 网络。
  • redis:latest:使用最新版本的 Redis 镜像。

步骤 3:启动 Slave Redis 实例

然后,我们启动一个 Slave Redis 实例并连接到 Master。

docker run -d --name redis-slave --net redis-net redis:latest redis-server --slaveof redis-master 6379
  • --name redis-slave:指定容器的名称为 redis-slave
  • redis-server --slaveof redis-master 6379:以 Slave 模式启动 Redis,连接到 Master。

步骤 4:配置 Redis Sentinel

我们需要启动 Redis Sentinel 来监控 Master 和 Slave。

docker run -d --name redis-sentinel --net redis-net redis:latest redis-sentinel /etc/redis/sentinel.conf
  • --name redis-sentinel:指定容器的名称为 redis-sentinel
  • redis-sentinel /etc/redis/sentinel.conf:启动 Redis Sentinel。

注意:你需要在 /etc/redis/sentinel.conf 中添加 Sentinel 的配置文件,以确保它不会进行主节点切换。以下是简化的 Sentinel 配置示例:

sentinel monitor mymaster redis-master 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

上面这些指令的意思是:

  • sentinel monitor mymaster redis-master 6379 2:监控名为 mymaster 的主节点,ip 地址为 redis-master,端口为 6379,当连接数超过 2 时进行故障切换。
  • sentinel down-after-milliseconds mymaster 5000:如果 5000 毫秒内没有收到主节点的心跳,认为主节点宕机。
  • sentinel failover-timeout mymaster 60000:故障切换的超时时间设定为 60 秒。
  • sentinel parallel-syncs mymaster 1:设定在故障切换时,同步的从节点数量为 1。

此配置保证了纵使 Sentinel 监控到 Master 宕机,它也不会切换主节点。

步骤 5:检查哨兵状态

在终端中执行以下命令检查 Sentinel 的状态和主从关系:

docker exec -it redis-sentinel redis-cli -p 26379 sentinel masters
docker exec -it redis-sentinel redis-cli -p 26379 sentinel slaves mymaster
  • -p 26379:Sentinel 默认监听在 26379 端口。
  • sentinel masters:列出监控到的 master 信息。
  • sentinel slaves mymaster:列出监控到的从节点信息。

步骤 6:关闭自动故障转移

在 Sentinel 容器中,可以通过设置某个 Sentinel 配置项来防止切换。在 Sentinel 的配置文件中设置合适的指标,是此步骤的关键。

关系图

接下来,我们将展示 Redis 集群的关系图。

erDiagram
    REDIS_MASTER {
        String id PK "Master Node"
    }
    REDIS_SLAVE {
        String id PK "Slave Node"
    }
    REDIS_SENTINEL {
        String id PK "Sentinel Node"
    }
    REDIS_MASTER ||--o{ REDIS_SLAVE : "监控"
    REDIS_SENTINEL ||--o{ REDIS_MASTER : "监控"

流程图

以下是整个操作流程图:

flowchart TD
    A[创建 Docker 网络] --> B[启动 Master Redis 实例]
    B --> C[启动 Slave Redis 实例]
    C --> D[配置 Redis Sentinel]
    D --> E[检查哨兵状态]
    E --> F[关闭自动故障转移]

结尾

通过以上步骤,我们成功在 Docker 中创建了一个 Redis 哨兵集群,并实现了不切换 Master 的效果。在生产环境中,这种方法可以有效提高 Redis 集群的稳定性和高可用性。如果在实际操作中遇到任何问题,可以随时求助于社区或查阅官方文档。希望本文对你有所帮助!