Docker下Redis 7.4哨兵集群部署(3节点一主两从)

详细介绍如何在3台服务器上使用Docker(不使用Docker Compose)部署Redis 7.4集群,采用哨兵机制实现高可用性的一主两从架构。

环境准备

服务器要求

  • 3台Linux服务器(可以是物理机或虚拟机)
  • 每台服务器已安装Docker环境
  • 服务器之间网络互通
  • 开放以下端口:
    • Redis服务端口:6379
    • 哨兵服务端口:26379

网络配置

为了容器间能够通信,我们需要创建一个Docker网络:

docker network create redis-net

这将创建一个名为redis-net的桥接网络,所有Redis和哨兵容器都将连接到这个网络

部署Redis主从集群

1. 部署主节点

在第一台服务器上运行以下命令启动Redis主节点容器:

docker run -d --name redis-master --net redis-net \
-p 6379:6379 \
-v /data/redis/master:/data \
redis:7.4-alpine \
redis-server --appendonly yes --requirepass your_strong_password

参数说明:

  • --net redis-net:将容器连接到redis-net网络
  • -p 6379:6379:映射容器端口到主机
  • -v /data/redis/master:/data:持久化数据存储
  • --appendonly yes:启用AOF持久化
  • --requirepass:设置Redis访问密码

2. 部署从节点

在第二台和第三台服务器上分别运行以下命令启动Redis从节点容器:

# 第二台服务器
docker run -d --name redis-slave1 --net redis-net \
-p 6379:6379 \
-v /data/redis/slave1:/data \
redis:7.4-alpine \
redis-server --appendonly yes --requirepass your_strong_password \
--slaveof redis-master 6379 --masterauth your_strong_password

# 第三台服务器
docker run -d --name redis-slave2 --net redis-net \
-p 6379:6379 \
-v /data/redis/slave2:/data \
redis:7.4-alpine \
redis-server --appendonly yes --requirepass your_strong_password \
--slaveof redis-master 6379 --masterauth your_strong_password

注意从节点配置了--slaveof参数指向主节点,并设置了--masterauth使用与主节点相同的密码

3. 验证主从状态

在主节点服务器上执行以下命令检查复制状态:

docker exec -it redis-master redis-cli -a your_strong_password INFO replication

预期输出应显示role:master和两个连接的从节点信息

部署Redis哨兵集群

1. 准备哨兵配置文件

在每台服务器上创建哨兵配置文件sentinel.conf,内容如下:

port 26379
sentinel monitor mymaster redis-master 6379 2
sentinel auth-pass mymaster your_strong_password
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 10000

关键参数说明:

  • sentinel monitor mymaster redis-master 6379 2:监控名为mymaster的主节点,至少需要2个哨兵同意才能判定主节点失效
  • sentinel down-after-milliseconds:5000毫秒(5秒)无响应认为节点下线
  • sentinel parallel-syncs:故障转移时并行同步的从节点数量

2. 启动哨兵容器

在每台服务器上分别启动哨兵容器:

# 第一台服务器
docker run -d --name redis-sentinel1 --net redis-net \
-p 26379:26379 \
-v /path/to/sentinel.conf:/usr/local/etc/redis/sentinel.conf \
redis:7.4-alpine \
redis-sentinel /usr/local/etc/redis/sentinel.conf

# 第二台服务器
docker run -d --name redis-sentinel2 --net redis-net \
-p 26379:26379 \
-v /path/to/sentinel.conf:/usr/local/etc/redis/sentinel.conf \
redis:7.4-alpine \
redis-sentinel /usr/local/etc/redis/sentinel.conf

# 第三台服务器
docker run -d --name redis-sentinel3 --net redis-net \
-p 26379:26379 \
-v /path/to/sentinel.conf:/usr/local/etc/redis/sentinel.conf \
redis:7.4-alpine \
redis-sentinel /usr/local/etc/redis/sentinel.conf

3. 验证哨兵状态

在任何一台服务器上执行以下命令检查哨兵状态:

docker exec -it redis-sentinel1 redis-cli -p 26379 INFO sentinel

预期输出应显示监控的主节点信息和哨兵节点数量

故障转移测试

1. 模拟主节点故障

在主节点服务器上停止主节点容器:

docker stop redis-master

2. 观察故障转移

等待约10-15秒后,检查哨兵日志:

docker logs redis-sentinel1

应该能看到哨兵检测到主节点下线并触发故障转移的日志

3. 验证新主节点

检查新的主节点信息:

docker exec -it redis-sentinel1 redis-cli -p 26379 sentinel get-master-addr-by-name mymaster

输出应为其中一个从节点(redis-slave1或redis-slave2)的IP和端口

4. 恢复原主节点

如果需要恢复原主节点,只需重新启动它:

docker start redis-master

启动后,原主节点会自动以从节点身份加入集群

客户端连接配置

应用程序连接Redis集群时,应使用哨兵模式连接,而不是直接连接主节点。以下是Python示例:

from redis.sentinel import Sentinel

sentinel_list = [
    ('sentinel1_ip', 26379),
    ('sentinel2_ip', 26379),
    ('sentinel3_ip', 26379)
]

sentinel = Sentinel(sentinel_list, socket_timeout=0.5, password='your_strong_password')

# 获取主节点连接
master = sentinel.master_for('mymaster', socket_timeout=0.5, password='your_strong_password')

# 获取从节点连接
slave = sentinel.slave_for('mymaster', socket_timeout=0.5, password='your_strong_password')

# 写入数据(到主节点)
master.set('foo', 'bar')

# 读取数据(从从节点)
value = slave.get('foo')

注意事项

  1. ​密码一致性​​:所有Redis节点和哨兵必须使用相同的密码配置
  2. ​网络延迟​​:确保服务器间网络延迟低,否则可能影响哨兵判断
  3. ​持久化配置​​:建议启用AOF持久化以确保数据安全
  4. ​资源限制​​:为Docker容器设置适当的内存限制,避免Redis占用过多主机资源
  5. ​监控告警​​:建议设置对哨兵和Redis节点的监控,及时发现并处理问题

通过以上步骤,您已经成功部署了一个高可用的Redis 7.4哨兵集群,能够自动处理主节点故障并实现故障转移。

posted on 2025-07-13 08:12  yi-sheng  阅读(208)  评论(0)    收藏  举报