redis 使用 Docker 部署 简单的Redis 集群(包括哨兵机制)
目录
环境准备
步骤 1:创建 Docker Compose 配置文件
步骤 2:创建配置文件
主节点配置文件 (redis.conf)
从节点配置文件 (slave.conf)
哨兵配置文件 (sentinel.conf)
步骤 3:启动 Redis 集群
步骤 4:验证集群状态
1. 检查主节点状态
2. 检查从节点状态
3. 检查哨兵状态
步骤 5:测试故障转移
步骤 6:清理环境(可选)
总结
这个示例将部署:
- 1 个 Redis 主节点
- 2 个 Redis 从节点
- 3 个 Redis 哨兵节点
环境准备
-
Docker 和 Docker Compose:
- 确保你的环境中已经安装了 Docker 和 Docker Compose。
- 如果尚未安装,可以参考 Docker 官方文档 进行安装。
-
网络配置:
- 确保 Docker 主机之间的网络可以互通。
- 确保防火墙规则允许 Docker 容器之间的通信。
- 创建一个redis-network:docker network create redis-network
- 查看网络情况:docker network inspect redis-network
步骤 1:创建 Docker Compose 配置文件
创建一个 docker-compose.yml
文件,用于定义 Redis 集群的服务:
version: '3.8'services:redis-master:image: redis:alpinecontainer_name: redis-masterports:- "6379:6379"volumes:- ./redis.conf:/usr/local/etc/redis/redis.conf- ./master-data:/datacommand: ["redis-server", "/usr/local/etc/redis/redis.conf"]networks:- redis-networkredis-slave-1:image: redis:alpinecontainer_name: redis-slave-1ports:- "6380:6379"volumes:- ./slave.conf:/usr/local/etc/redis/redis.conf- ./slave1-data:/datacommand: ["redis-server", "/usr/local/etc/redis/redis.conf"]depends_on:- redis-masternetworks:- redis-networkredis-slave-2:image: redis:alpinecontainer_name: redis-slave-2ports:- "6381:6379"volumes:- ./slave.conf:/usr/local/etc/redis/redis.conf- ./slave2-data:/datacommand: ["redis-server", "/usr/local/etc/redis/redis.conf"]depends_on:- redis-masternetworks:- redis-networkredis-sentinel-1:image: redis:alpinecontainer_name: redis-sentinel-1ports:- "26379:26379"volumes:- ./sentinel.conf:/usr/local/etc/redis/sentinel.confcommand: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]depends_on:- redis-master- redis-slave-1- redis-slave-2networks:- redis-networkredis-sentinel-2:image: redis:alpinecontainer_name: redis-sentinel-2ports:- "26380:26379"volumes:- ./sentinel.conf:/usr/local/etc/redis/sentinel.confcommand: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]depends_on:- redis-master- redis-slave-1- redis-slave-2networks:- redis-networkredis-sentinel-3:image: redis:alpinecontainer_name: redis-sentinel-3ports:- "26381:26379"volumes:- ./sentinel.conf:/usr/local/etc/redis/sentinel.confcommand: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]depends_on:- redis-master- redis-slave-1- redis-slave-2networks:- redis-networknetworks:redis-network:driver: bridge
步骤 2:创建配置文件
主节点配置文件 (redis.conf
)
bind 0.0.0.0
port 6379
dir /data
replicaof no one
masterauth <password> # 设置主节点密码,根据需要修改
requirepass <password> # 设置Redis访问密码,根据需要修改
从节点配置文件 (slave.conf
)
bind 0.0.0.0
port 6379
dir /data
replicaof 192.168.1.100 6379 # 指定主节点的IP和端口
masterauth <password> # 与主节点密码一致
requirepass <password> # 与主节点密码一致
哨兵配置文件 (sentinel.conf
)
# 端口配置:指定Sentinel监听的端口,默认是26379
port 26379 # 守护进程配置:让Sentinel在后台运行
daemonize yes # PID文件配置:指定PID文件的存储路径,方便管理Sentinel进程
pidfile /var/run/redis-sentinel.pid # 监控配置:监控名为mymaster的主节点,IP地址为192.168.1.100(需改为自己的虚拟机的ip地址,ip address找到eth0或ens33),端口为6379,需要至少2个Sentinel同意才能判定主节点下线
sentinel monitor mymaster 192.168.1.100 6379 2 # 主节点密码:用于Sentinel连接主节点进行验证,需要与主节点的密码配置一致
sentinel auth-pass mymaster <password> # 下线判断配置:设置Sentinel判断主节点下线的超时时间,单位为毫秒,默认为30000ms(30秒)
sentinel down-after-milliseconds mymaster 30000 # 并行同步配置:设置并行同步的从节点数量,值为1表示一次一个节点同步
sentinel parallel-syncs mymaster 1 # 故障转移超时配置:设置故障转移的超时时间,单位为毫秒,默认为180000ms(180秒)
sentinel failover-timeout mymaster 180000
步骤 3:启动 Redis 集群
在 docker-compose.yml
所在的目录下,运行以下命令验证docker-compose.yml
文件格式是否正确
docker-compose config
格式无误则运行以下命令启动集群:
docker-compose up -d
-d
参数表示后台运行。- 集群启动后,可以通过
docker ps
查看所有运行的容器。
步骤 4:验证集群状态
1. 检查主节点状态
docker exec -it redis-master redis-cli ping
# 预期输出:PONG
2. 检查从节点状态
docker exec -it redis-slave-1 redis-cli info replication | grep role
# 预期输出:role:slave
3. 检查哨兵状态
docker exec -it redis-sentinel-1 redis-cli -p 26379 sentinel masters
# 预期输出:包含主节点的状态信息
步骤 5:测试故障转移
-
停止主节点容器:
docker stop redis-master
-
观察哨兵日志:
docker logs -f redis-sentinel-1
- 看到哨兵检测到主节点下线并触发故障转移的日志。
-
验证新主节点:
docker exec -it redis-slave-1 redis-cli info replication | grep role # 预期输出:role:master
步骤 6:清理环境(可选)
如果需要清理环境,可以运行以下命令:
docker-compose down -v
-v
参数表示删除 volumes,即清理所有数据卷。
总结
通过以上步骤,我们成功使用 Docker 部署了一个 Redis 集群,包含:
- 1 个主节点:处理所有写操作。
- 2 个从节点:处理读操作,并提供数据冗余。
- 3 个哨兵节点:监控主节点状态,实现自动故障转移。
这个集群实现了以下功能:
- 高可用性:主节点故障时,哨兵自动将从节点提升为主节点。
- 读写分离:从节点分担读操作,提升系统性能。
- 自动故障转移:哨兵持续监控主节点状态,确保集群稳定性。