Redis 一主二从 + Sentinel 哨兵模式部署文档(Docker + Linux)

本方案在 Linux 环境下,使用 Docker 搭建 Redis 一主两从架构,并通过 Sentinel 实现主节点故障自动转移。


一、部署结构

Redis 主从结构:
​
  redis1 (主)        redis2 (从)
                         /
                        /
             redis3 (从)
​
3 个 Sentinel 实例:sentinel1、sentinel2、sentinel3
容器名称 类型 Redis端口 Sentinel端口 宿主机端口映射
redis1 主节点 6379 26379 6379→6379 26379→26379
redis2 从节点 6379 26379 6380→6379 26380→26379
redis3 从节点 6379 26379 6381→26379 26381→26379

二、目录结构

redis-cluster/
├── docker-compose.yml
├── redis1/
│   ├── redis.conf
    ├── sentinel.conf
├── sredis2/
│   ├── redis.conf
    ├── sentinel.conf
├── redis3/
│   ├── redis.conf
    ├── sentinel.conf

三、redis.conf 配置

redis1

bind 0.0.0.0
port 6379
dir /data
replica-announce-ip ###(自己ip地址)
replica-announce-port 6379
​
appendonly yes
# 关闭保护模式允许外部连接(生产请根据安全策略调整)
protected-mode no
​

redis2

port 6379
dir /data
appendonly yes
protected-mode no
replica-announce-ip ###(自己ip地址)
replica-announce-port 6380
​
# 指定主节点地址和端口(master 容器名和端口)
replicaof ###(自己ip地址) 6379
​

redis3

port 6379
dir /data
appendonly yes
protected-mode no
replica-announce-ip ###(自己ip地址)
replica-announce-port 6381
​
# 指定主节点地址和端口(master 容器名和端口)
replicaof ###(自己ip地址) 6379
​


四、sentinel.conf

sentinel1

port 26379
dir /tmp
sentinel monitor mymaster ###(自己ip地址) 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel announce-ip ###(自己ip地址)
sentinel announce-port 26379
# 关闭保护模式允许外部连接(可选)
protected-mode no
​

sentinel2

port 26379
dir /tmp
sentinel monitor mymaster ###(自己ip地址) 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel announce-ip ###(自己ip地址)
sentinel announce-port 26380
# 关闭保护模式允许外部连接(可选)
protected-mode no
​

sentinel3

port 26379
dir /tmp
sentinel monitor mymaster ###(自己ip地址) 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel announce-ip ###(自己ip地址)
sentinel announce-port 26381
# 关闭保护模式允许外部连接(可选)
protected-mode no

五、docker-compose.yml 示例

services:
  redis1:
    image: redis-image:latest
    container_name: redis1
    ports:
      - "6379:6379"
      - "26379:26379"
    volumes:
      - ./redis1/redis.conf:/usr/local/etc/redis/redis.conf
      - ./redis1/sentinel.conf:/usr/local/etc/redis/sentinel.conf
      - redis1-data:/data
    command: >
      sh -c "redis-server /usr/local/etc/redis/redis.conf &
             redis-sentinel /usr/local/etc/redis/sentinel.conf"
    restart: always
    networks:
      - redis-net

  redis2:
    image: redis-image:latest
    container_name: redis2
    ports:
      - "6380:6379"
      - "26380:26379"
    volumes:
      - ./redis2/redis.conf:/usr/local/etc/redis/redis.conf
      - ./redis2/sentinel.conf:/usr/local/etc/redis/sentinel.conf
      - redis2-data:/data
    command: >
      sh -c "redis-server /usr/local/etc/redis/redis.conf &
             redis-sentinel /usr/local/etc/redis/sentinel.conf"
    restart: always
    networks:
      - redis-net
      
  redis3:
    image: redis-image:latest
    container_name: redis3
    ports:
      - "6381:6379"
      - "26381:26379"
    volumes:
      - ./redis3/redis.conf:/usr/local/etc/redis/redis.conf
      - ./redis3/sentinel.conf:/usr/local/etc/redis/sentinel.conf
      - redis3-data:/data
    command: >
      sh -c "redis-server /usr/local/etc/redis/redis.conf &
             redis-sentinel /usr/local/etc/redis/sentinel.conf"
    restart: always
    networks:
      - redis-net

volumes:
  redis1-data:
  redis2-data:
  redis3-data:

networks:
  redis-net:
    driver: bridge    

六、启动并验证

# 启动容器(在redis-cluster目录下运行)
docker compose up -d

# 查看状态
docker ps

# 验证主从
docker exec -it redis1 redis-cli info replication

#数据测试
docker exec -it redis-master redis-cli 
127.0.0.1:6379> set key "hello redis"
127.0.0.1:6379> exit
docker exec -it redis-slave1 redis-cli -a 123456
127.0.0.1:6379> get key

七、自动故障转移流程

当主节点 master宕机

Sentinel 检测并确认故障(2 个哨兵达成 quorum)

选举一个从节点(slave1或 slave2)为新主节点

其他从节点自动切换主从关系

Sentinel 更新配置(如挂载目录可写)


八、SpringBoot项目yml文件配置

  data:
    redis:
      sentinel:
        master: mymaster
        nodes:
          - ###(自己ip地址):26379
          - ###(自己ip地址):26380
          - ###(自己ip地址):26381
      database: 0

**注意修改节点ip

九、注意事项

容器的
/etc/redis/sentinel.conf
需要挂载到宿主机,并确保有写权限(Sentinel 会自动修改配置文件)

主节点配置了
requirepass
,必须加
masterauth

哨兵数量 >= quorum + 1,建议部署 3 个

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容