Redis Sentinel 哨兵集群部署方案

AI摘要
本文是一份关于使用Docker部署Redis Sentinel高可用集群的详细技术文档,属于【知识分享】。内容涵盖了部署架构概述、Docker网络配置、Redis主从节点与Sentinel节点的具体配置示例、客户端访问方式、高可用策略以及一个完整的docker-compose.yml文件示例。文档还提供了一个自动生成多哨兵配置文件的Shell脚本,旨在帮助用户快速搭建一个具备自动故障转移功能的Redis高可用环境。

Redis Sentinel 集群部署文档

1. 部署概述

Redis Sentinel 提供高可用的 Redis 主从管理功能,包括:

  • 自动故障转移(Failover)

  • 集群健康监控

  • 客户端主节点地址发现

本部署方案包含:

  • 1 个 Redis 主节点(Master)

  • 1 个 Redis 从节点(Replica)

  • 3 个 Sentinel 节点,负责监控主从节点

所有节点均在同一自定义 Docker 网络下,便于通信。


2. Docker 网络

创建自定义网络:

networks:
  base_net:
    driver: bridge

所有容器通过 base_net 网络互联。


3. Redis 主从配置

3.1 主节点(Redis Master)

配置文件/命令行示例:

redis-master:
  image: redis:7-alpine
  container_name: redis-master
  command: >
    redis-server
    --port 6379
    --appendonly yes
    --protected-mode no
    --requirepass 123456
  ports:
    - "16379:6379"
  networks:
    - base_net

说明:

  • --requirepass 123456:客户端访问主节点需要密码

  • --appendonly yes:开启 AOF 持久化

  • --protected-mode no:关闭保护模式,允许外部连接

3.2 从节点(Redis Replica)

redis-replica:
  image: redis:7-alpine
  container_name: redis-replica
  depends_on:
    - redis-master
  command: >
    redis-server
    --port 6380
    --replicaof redis-master 6379
    --masterauth 123456
    --requirepass 123456
    --protected-mode no
  ports:
    - "16380:6380"
  networks:
    - base_net

说明:

  • --replicaof redis-master 6379:指定主节点

  • --masterauth 123456:从节点访问主节点需要认证

  • --requirepass 123456:客户端访问从节点需要密码


4. Sentinel 节点配置

4.1 Sentinel 配置文件示例(sentinel-26379.conf)

port 26379
sentinel resolve-hostnames yes
sentinel monitor mymaster redis-master 6379 2
sentinel auth-pass mymaster 123456       # 访问主节点密码
requirepass sentinelStrongPwd            # 客户端访问哨兵密码
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
protected-mode no

说明:

  • auth-pass:哨兵访问主节点密码

  • requirepass:客户端访问哨兵密码

  • resolve-hostnames yes:允许通过主机名访问

  • protected-mode no:关闭保护模式,允许外部访问

4.2 Sentinel 容器部署示例

sentinel-1:
  image: redis:7-alpine
  container_name: sentinel-1
  depends_on:
    - redis-master
  volumes:
    - ./sentinel-26379.conf:/etc/redis/sentinel.conf
  command: >
    sh -c "
    until redis-cli -h redis-master -p 6379 -a 123456 ping; do
      echo 'waiting for redis-master...';
      sleep 1;
    done;
    redis-sentinel /etc/redis/sentinel.conf --port 26379
    "
  ports:
    - "26379:26379"
  networks:
    - base_net

其他 Sentinel 节点(26380、26381)同理,只需修改配置文件和端口。


5. 客户端访问说明

5.1 访问 Redis 主从节点

redis-cli -h <host> -p <port> -a 123456 ping
# 返回 PONG

5.2 访问 Sentinel 节点

redis-cli -h <sentinel_host> -p <sentinel_port> -a sentinelStrongPwd SENTINEL get-master-addr-by-name mymaster

说明:

  • 如果哨兵设置了 requirepass,客户端必须提供密码

  • 哨兵命令返回主节点 IP 和端口,便于客户端自动切换


6. 高可用策略

  1. Sentinel 自动监控主节点,当主节点不可用时触发 Failover

  2. 从节点提升为主节点,其他 Sentinel 节点更新配置

  3. 客户端通过 Sentinel API 获取当前主节点信息,实现透明故障切换


7. 部署注意事项

  • 所有节点建议放在同一 Docker 网络中,保证主从和哨兵通信

  • Sentinel 的 auth-passrequirepass 密码必须和 Redis 主节点保持一致

  • 建议使用 至少 3 个 Sentinel 保证选举稳定

  • 客户端应用应支持 Sentinel 模式连接,自动获取主节点


二、以下是使用docker-compose部署方式

下面是一个 完整的 docker-compose.yml 示例,包含:

  • Redis 主节点 + 从节点

  • 3 个 Sentinel 节点

  • Redis 主从密码认证

  • Sentinel 访问主节点密码 + Sentinel 自身密码认证

  • 启动时等待主节点就绪

下面是示例配置:


version: "3.9"

networks:
  base_net:
    driver: bridge

services:

  # ---------------- Redis 主节点 ----------------
  redis-master:
    image: redis:7-alpine
    container_name: redis-master
    command: >
      redis-server
      --port 6379
      --appendonly yes
      --protected-mode no
      --requirepass 123456
    ports:
      - "16379:6379"
    networks:
      - base_net

  # ---------------- Redis 从节点 ----------------
  redis-replica:
    image: redis:7-alpine
    container_name: redis-replica
    depends_on:
      - redis-master
    command: >
      redis-server
      --port 6380
      --replicaof redis-master 6379
      --masterauth 123456
      --requirepass 123456
      --protected-mode no
    ports:
      - "16380:6380"
    networks:
      - base_net

  # ---------------- Sentinel 1 ----------------
  sentinel-1:
    image: redis:7-alpine
    container_name: sentinel-1
    depends_on:
      - redis-master
    volumes:
      - ./sentinel-26379.conf:/etc/redis/sentinel.conf
    command: >
      sh -c "
      until redis-cli -h redis-master -p 6379 -a 123456 ping; do
        echo 'waiting for redis-master...';
        sleep 1;
      done;
      redis-sentinel /etc/redis/sentinel.conf --port 26379
      "
    ports:
      - "26379:26379"
    networks:
      - base_net

  # ---------------- Sentinel 2 ----------------
  sentinel-2:
    image: redis:7-alpine
    container_name: sentinel-2
    depends_on:
      - redis-master
    volumes:
      - ./sentinel-26380.conf:/etc/redis/sentinel.conf
    command: >
      sh -c "
      until redis-cli -h redis-master -p 6379 -a 123456 ping; do
        echo 'waiting for redis-master...';
        sleep 1;
      done;
      redis-sentinel /etc/redis/sentinel.conf --port 26380
      "
    ports:
      - "26380:26380"
    networks:
      - base_net

  # ---------------- Sentinel 3 ----------------
  sentinel-3:
    image: redis:7-alpine
    container_name: sentinel-3
    depends_on:
      - redis-master
    volumes:
      - ./sentinel-26381.conf:/etc/redis/sentinel.conf
    command: >
      sh -c "
      until redis-cli -h redis-master -p 6379 -a 123456 ping; do
        echo 'waiting for redis-master...';
        sleep 1;
      done;
      redis-sentinel /etc/redis/sentinel.conf --port 26381
      "
    ports:
      - "26381:26381"
    networks:
      - base_net

Sentinel 配置示例(三个节点分别为 26379、26380、26381)

示例文件:sentinel-26379.conf

port 26379
sentinel resolve-hostnames yes
sentinel monitor mymaster redis-master 6379 2
sentinel auth-pass mymaster 123456       # Sentinel 访问主节点密码
requirepass sentinelStrongPwd            # 客户端访问 Sentinel 密码
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
protected-mode no

注意:26380、26381 的配置文件类似,只需修改端口号 port。密码保持一致。


🔑 使用说明

  1. 启动:
docker-compose up -d
  1. 客户端访问主节点:
redis-cli -h <host> -p 6379 -a 123456 ping
  1. 客户端访问哨兵:
redis-cli -h <host> -p 26379 -a sentinelStrongPwd SENTINEL get-master-addr-by-name mymaster
  1. 哨兵自动监控主节点,主节点故障时会自动切换到从节点,并更新 Sentinel 状态。

三、自动生成多哨兵配置文件

自动生成三个 Sentinel 配置文件(26379、26380、26381),并且支持配置:

  • 主节点名称与端口

  • 主节点访问密码

  • 哨兵自身访问密码

  • 哨兵端口


sentinel-gen.sh

#!/bin/bash

# ------------------ 配置参数 ------------------
MASTER_NAME="mymaster"            # Redis 主节点名称
MASTER_HOST="redis-master"        # Redis 主节点容器/主机名
MASTER_PORT=6379                  # Redis 主节点端口
MASTER_PASSWORD="123456"          # Redis 主节点密码
SENTINEL_PASSWORD="sentinelStrongPwd"  # 哨兵自身访问密码

SENTINEL_PORTS=(26379 26380 26381)      # 三个哨兵端口
QUORUM=2                                # 哨兵投票数

# 输出目录
OUTPUT_DIR="./"
# --------------------------------------------

for port in "${SENTINEL_PORTS[@]}"; do
    FILE="$OUTPUT_DIR/sentinel-$port.conf"
    cat > "$FILE" <<EOF
port $port
sentinel resolve-hostnames yes
sentinel monitor $MASTER_NAME $MASTER_HOST $MASTER_PORT $QUORUM
sentinel auth-pass $MASTER_NAME $MASTER_PASSWORD
requirepass $SENTINEL_PASSWORD
sentinel down-after-milliseconds $MASTER_NAME 5000
sentinel failover-timeout $MASTER_NAME 10000
sentinel parallel-syncs $MASTER_NAME 1
protected-mode no
EOF
    echo "生成 $FILE 完成"
done

使用方法

  1. 保存脚本为 sentinel-gen.sh

  2. 修改脚本顶部参数:

MASTER_NAME       # Redis 主节点名称
MASTER_HOST       # Redis 主节点容器名
MASTER_PORT       # 主节点端口
MASTER_PASSWORD   # 主节点密码
SENTINEL_PASSWORD # 哨兵访问密码
  1. 运行生成:
chmod +x sentinel-gen.sh
./sentinel-gen.sh
  1. 脚本会生成三个配置文件:
  • sentinel-26379.conf

  • sentinel-26380.conf

  • sentinel-26381.conf

内容已经包含:

  • 监控主节点

  • 主节点密码认证

  • 哨兵自身访问密码

  • 投票、故障检测参数


这样,你的 docker-compose.yml 里的 Sentinel 容器直接挂载生成的配置文件即可,无需手动修改。


本作品采用《CC 协议》,转载必须注明作者和本文链接
每天一点小知识,到那都是大佬,哈哈
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!