本方案在 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
九、注意事项
容器的 需要挂载到宿主机,并确保有写权限(Sentinel 会自动修改配置文件)
/etc/redis/sentinel.conf
主节点配置了 ,必须加
requirepass
masterauth
哨兵数量 >= quorum + 1,建议部署 3 个
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END



















暂无评论内容