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')
注意事项
- 密码一致性:所有Redis节点和哨兵必须使用相同的密码配置
- 网络延迟:确保服务器间网络延迟低,否则可能影响哨兵判断
- 持久化配置:建议启用AOF持久化以确保数据安全
- 资源限制:为Docker容器设置适当的内存限制,避免Redis占用过多主机资源
- 监控告警:建议设置对哨兵和Redis节点的监控,及时发现并处理问题
通过以上步骤,您已经成功部署了一个高可用的Redis 7.4哨兵集群,能够自动处理主节点故障并实现故障转移。