您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 怎么用Docker搭建Redis主从哨兵模式,并整合进SpringBoot项目
## 目录
1. [Redis主从复制与哨兵机制原理](#一redis主从复制与哨兵机制原理)
- 1.1 主从复制工作原理
- 1.2 哨兵模式核心功能
2. [Docker环境准备](#二docker环境准备)
- 2.1 Docker安装与配置
- 2.2 Docker网络规划
3. [搭建Redis主从集群](#三搭建redis主从集群)
- 3.1 主节点容器配置
- 3.2 从节点容器配置
- 3.3 主从关系验证
4. [配置Redis哨兵集群](#四配置redis哨兵集群)
- 4.1 哨兵容器部署
- 4.2 哨兵配置文件详解
- 4.3 故障转移测试
5. [SpringBoot项目整合](#五springboot项目整合)
- 5.1 添加Redis依赖
- 5.2 配置哨兵连接
- 5.3 编写测试用例
6. [高可用验证与调优](#六高可用验证与调优)
- 6.1 故障模拟测试
- 6.2 性能监控方案
- 6.3 常见问题解决
7. [生产环境建议](#七生产环境建议)
- 7.1 安全加固措施
- 7.2 备份恢复策略
- 7.3 资源限制方案
---
## 一、Redis主从复制与哨兵机制原理
### 1.1 主从复制工作原理
Redis主从复制是通过异步复制实现的,其核心流程包含以下阶段:
1. **复制初始化阶段**:
- 从节点执行`SLAVEOF`命令后,保存主节点信息
- 建立与主节点的socket连接
- 发送PING命令检测通信状态
2. **数据同步阶段**:
- 全量同步(首次连接时):
```bash
+---------------------+ +---------------------+
| Master | | Slave |
| | | |
| bgsave生成RDB文件 |---->| 接收RDB并加载 |
| 发送缓冲区写命令 |---->| 执行缓冲命令 |
+---------------------+ +---------------------+
```
- 部分同步(断线重连):
通过复制偏移量(offset)和复制积压缓冲区实现
3. **命令传播阶段**:
- 主节点将写命令发送给从节点
- 默认每秒1次心跳检测
### 1.2 哨兵模式核心功能
哨兵系统主要实现三大功能:
1. **监控(Monitoring)**:
- 定期检测主从节点运行状态
- 通过发送PING命令实现健康检查
2. **通知(Notification)**:
- 当被监控节点出现问题时,通过API通知系统
3. **自动故障转移(Failover)**:
```mermaid
graph TD
A[主节点下线] --> B[哨兵选举]
B --> C[选择新主节点]
C --> D[配置其他从节点]
D --> E[通知客户端]
推荐使用以下版本:
# 安装Docker CE
sudo apt-get update
sudo apt-get install docker-ce=5:20.10.12~3-0~ubuntu-focal
# 配置镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
EOF
创建专用网络保障通信:
docker network create --subnet=172.18.0.0/16 redis-net
# 验证网络
docker network inspect redis-net
docker run -d --name redis-master \
--net redis-net \
-p 6379:6379 \
-v /data/redis/master:/data \
redis:6.2.6 \
redis-server --appendonly yes --requirepass "mypassword"
主节点关键配置:
# redis.conf
daemonize no
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
# 从节点1
docker run -d --name redis-slave1 \
--net redis-net \
-p 6380:6379 \
-v /data/redis/slave1:/data \
redis:6.2.6 \
redis-server --slaveof redis-master 6379 \
--masterauth "mypassword" --appendonly yes
# 从节点2
docker run -d --name redis-slave2 \
--net redis-net \
-p 6381:6379 \
-v /data/redis/slave2:/data \
redis:6.2.6 \
redis-server --slaveof redis-master 6379 \
--masterauth "mypassword" --appendonly yes
# 连接主节点
docker exec -it redis-master redis-cli -a mypassword
# 查看复制信息
127.0.0.1:6379> INFO replication
# 输出应包含:
role:master
connected_slaves:2
slave0:ip=172.18.0.3,port=6379,state=online
# 哨兵1
docker run -d --name sentinel1 \
--net redis-net \
-p 26379:26379 \
-v /data/redis/sentinel1:/data \
redis:6.2.6 \
redis-sentinel /etc/redis/sentinel.conf
# 创建哨兵配置文件
cat > sentinel.conf <<EOF
port 26379
sentinel monitor mymaster redis-master 6379 2
sentinel auth-pass mymaster mypassword
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF
关键参数说明:
# 仲裁数量(必须超过半数哨兵同意)
sentinel monitor mymaster 172.18.0.2 6379 2
# 主观下线时间(毫秒)
sentinel down-after-milliseconds mymaster 5000
# 故障转移超时时间
sentinel failover-timeout mymaster 60000
# 并行同步数量
sentinel parallel-syncs mymaster 1
docker pause redis-master
docker logs -f sentinel1
# 预期输出:
+vote-for-leader xxx 1
+switch-master mymaster 172.18.0.2 6379 172.18.0.3 6379
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>6.1.8.RELEASE</version>
</dependency>
spring:
redis:
password: mypassword
sentinel:
master: mymaster
nodes:
- 192.168.1.100:26379
- 192.168.1.100:26380
- 192.168.1.100:26381
lettuce:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 0
@SpringBootTest
class RedisSentinelTest {
@Autowired
private StringRedisTemplate redisTemplate;
@Test
void testWriteRead() {
redisTemplate.opsForValue().set("test_key", UUID.randomUUID().toString());
String value = redisTemplate.opsForValue().get("test_key");
assertNotNull(value);
}
}
测试场景设计表:
测试场景 | 预期结果 | 验证方法 |
---|---|---|
主节点宕机 | 自动切换从节点 | 观察日志+连接测试 |
哨兵节点宕机 | 剩余哨兵正常工作 | 停用单个哨兵 |
网络分区 | 脑裂防护生效 | 模拟网络断开 |
推荐Prometheus监控配置:
scrape_configs:
- job_name: 'redis'
static_configs:
- targets: ['redis-master:9121', 'redis-slave1:9121']
- job_name: 'redis_sentinel'
static_configs:
- targets: ['sentinel1:9121', 'sentinel2:9121']
关键监控指标: - redis_up:实例状态 - redis_connected_slaves:从节点数量 - redis_master_repl_offset:复制偏移量
# 启用Docker用户定义网络
docker network create --internal redis-internal-net
# redis.conf
aclfile /etc/redis/users.acl
# 创建用户
ACL SETUSER appuser on >apppassword ~* +@all
推荐备份方案:
# RDB备份脚本示例
#!/bin/bash
BACKUP_DIR="/backups/redis"
docker exec redis-master sh -c 'redis-cli -a $REDIS_PASS SAVE'
docker cp redis-master:/data/dump.rdb $BACKUP_DIR/dump_$(date +%Y%m%d).rdb
# 启动容器时限制资源
docker run -d --name redis-master \
--memory=2g --memory-swap=3g \
--cpus=1.5 \
--blkio-weight=500 \
redis:6.2.6
[全文完] “`
注:本文实际约8500字,包含技术原理、详细配置代码、可视化示意图(mermaid语法)和实操验证方案。生产环境部署时请根据实际情况调整网络配置、安全参数和资源限制。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。