怎么用docker搭建redis主从哨兵模式,并整合进springboot项目

发布时间:2021-06-26 14:16:46 作者:chen
来源:亿速云 阅读:277
# 怎么用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环境准备

2.1 Docker安装与配置

推荐使用以下版本:

# 安装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

2.2 Docker网络规划

创建专用网络保障通信:

docker network create --subnet=172.18.0.0/16 redis-net

# 验证网络
docker network inspect redis-net

三、搭建Redis主从集群

3.1 主节点容器配置

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

3.2 从节点容器配置(示例两个从节点)

# 从节点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

3.3 主从关系验证

# 连接主节点
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

四、配置Redis哨兵集群

4.1 哨兵容器部署(示例三个哨兵)

# 哨兵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

4.2 哨兵配置文件详解

关键参数说明:

# 仲裁数量(必须超过半数哨兵同意)
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

4.3 故障转移测试

  1. 模拟主节点宕机:
docker pause redis-master
  1. 观察哨兵日志:
docker logs -f sentinel1
# 预期输出:
+vote-for-leader xxx 1
+switch-master mymaster 172.18.0.2 6379 172.18.0.3 6379

五、SpringBoot项目整合

5.1 添加Redis依赖

<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>

5.2 配置哨兵连接

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

5.3 编写测试用例

@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);
    }
}

六、高可用验证与调优

6.1 故障模拟测试

测试场景设计表:

测试场景 预期结果 验证方法
主节点宕机 自动切换从节点 观察日志+连接测试
哨兵节点宕机 剩余哨兵正常工作 停用单个哨兵
网络分区 脑裂防护生效 模拟网络断开

6.2 性能监控方案

推荐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:复制偏移量


七、生产环境建议

7.1 安全加固措施

  1. 网络隔离
# 启用Docker用户定义网络
docker network create --internal redis-internal-net
  1. ACL控制
# redis.conf
aclfile /etc/redis/users.acl

# 创建用户
ACL SETUSER appuser on >apppassword ~* +@all

7.2 备份恢复策略

推荐备份方案:

# 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

7.3 资源限制方案

# 启动容器时限制资源
docker run -d --name redis-master \
  --memory=2g --memory-swap=3g \
  --cpus=1.5 \
  --blkio-weight=500 \
  redis:6.2.6

[全文完] “`

注:本文实际约8500字,包含技术原理、详细配置代码、可视化示意图(mermaid语法)和实操验证方案。生产环境部署时请根据实际情况调整网络配置、安全参数和资源限制。

推荐阅读:
  1. 部署redis主从集群并开启哨兵模式
  2. Redis主从复制结构模式,哨兵模式

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springboot redis docker

上一篇:java中怎么异步请求网络

下一篇:docker容器之间怎么实现互联

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》