1. Redis 简介

  2. 持久化机制

    • RDB 快照

    • AOF 追加文件

    • 混合持久化

  3. 主从复制

    • Docker Compose 配置

    • 测试主从同步

  4. 哨兵模式(Sentinel)

    • 架构与原理

    • 配置与部署

    • 故障转移测试

  5. Redis Cluster 集群

    • 概念与哈希槽

    • 3 主 3 从搭建

    • 数据分片验证

    • 自动故障转移测试

  6. 清理环境

  7. 附录:常见问题与警告


1. Redis 简介

Redis 是一个开源的内存数据结构存储系统,用作数据库、缓存和消息代理。支持字符串、哈希、列表、集合、有序集合等数据类型。其高性能和丰富的功能使其成为后端开发的核心组件。


2. 持久化机制

Redis 提供多种持久化方式,确保数据在重启后不丢失。

2.1 RDB(快照)

  • 原理:在指定时间间隔内,将内存数据集写入磁盘(二进制文件 dump.rdb)。

  • 触发:自动(save 配置)或手动(BGSAVE)。

  • 优点:文件紧凑,恢复速度快,性能影响小。

  • 缺点:可能丢失最后一次快照之后的数据。

配置示例redis.conf):

conf

save 900 1      # 900秒内至少1个key变化则保存
save 300 10
save 60 10000
dbfilename dump.rdb
dir /data

2.2 AOF(追加文件)

  • 原理:记录每个写操作命令,追加到 appendonly.aof 文件。

  • 同步策略

    • always:每个命令同步磁盘(最安全,性能低)

    • everysec:每秒同步一次(默认,最多丢1秒数据)

    • no:由操作系统决定

  • 优点:数据安全性高,可读性好,支持修复。

  • 缺点:文件体积大,恢复速度慢。

配置示例

conf

appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

2.3 混合持久化(Redis 4.0+)

  • 原理:AOF 重写时,将当前数据以 RDB 格式写入 AOF 文件开头,后续新命令以 AOF 格式追加。

  • 优点:兼顾快速恢复(RDB)和数据安全(AOF)。

  • 启用

conf

aof-use-rdb-preamble yes

3. 主从复制

3.1 架构

  • 一个主节点(可写),多个从节点(只读)。

  • 从节点通过 slaveof 命令复制主节点数据,实现读写分离和热备份。

3.2 Docker Compose 部署

创建目录 ~/redis-replication,编写 docker-compose.yml

yaml

version: '3.8'
services:
  redis-master:
    image: redis:7.2
    container_name: redis-master
    ports:
      - "6379:6379"
    command: redis-server --appendonly yes
    networks:
      - redis-net
​
  redis-slave1:
    image: redis:7.2
    container_name: redis-slave1
    ports:
      - "6380:6379"
    command: redis-server --slaveof redis-master 6379 --appendonly yes
    depends_on:
      - redis-master
    networks:
      - redis-net
​
  redis-slave2:
    image: redis:7.2
    container_name: redis-slave2
    ports:
      - "6381:6379"
    command: redis-server --slaveof redis-master 6379 --appendonly yes
    depends_on:
      - redis-master
    networks:
      - redis-net
​
networks:
  redis-net:
    driver: bridge

3.3 测试主从同步

bash

# 启动服务
cd ~/redis-replication
docker compose up -d
​
# 主节点写入数据
docker exec -it redis-master redis-cli
127.0.0.1:6379> set name "redis master"
OK
​
# 从节点读取数据
docker exec -it redis-slave1 redis-cli get name
"redis master"
​
# 查看从节点角色
docker exec -it redis-slave1 redis-cli info replication
# role:slave, master_host:redis-master

结论:从节点成功复制主节点数据,且为只读。


4. 哨兵模式(Sentinel)

4.1 原理

哨兵是一个独立进程,用于监控主从集群,实现自动故障转移。多个哨兵组成分布式系统,通过投票决定主节点是否客观下线并选举新主。

4.2 部署架构

  • 1 个主节点 + 2 个从节点 + 3 个哨兵(奇数个)

  • 所有服务在同一 Docker 网络中,使用容器名通信。

4.3 配置文件

sentinel1.conf(其余两个相同,端口一致):

conf

port 26379
sentinel monitor mymaster redis-master 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
bind 0.0.0.0

4.4 Docker Compose 完整配置

docker-compose.yml 中添加哨兵服务(接上面主从配置):

yaml

  sentinel1:
    image: redis:7.2
    container_name: sentinel1
    ports:
      - "26379:26379"
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf
    depends_on:
      - redis-master
      - redis-slave1
      - redis-slave2
    networks:
      - redis-net
​
  sentinel2:  # 类似,映射 26380:26379
  sentinel3:  # 类似,映射 26381:26379

4.5 测试故障转移

bash

# 启动所有服务
docker compose up -d
​
# 查看哨兵状态
docker exec -it sentinel1 redis-cli -p 26379 sentinel masters
​
# 停止主节点
docker stop redis-master
​
# 观察哨兵日志(约15秒后切换)
docker logs sentinel1 -f
​
# 查看新主节点(应该是某个从节点升级)
docker exec -it redis-slave1 redis-cli info replication | grep role
# role:master
​
# 恢复原主节点(自动成为从节点)
docker start redis-master

结论:哨兵成功检测主节点宕机,并完成自动故障转移,原主恢复后降级为从节点。


5. Redis Cluster 集群

5.1 核心概念

  • 哈希槽:16384 个槽,每个 key 通过 CRC16(key) % 16384 映射到某个槽。

  • 分片:每个主节点负责一部分槽,多个主节点共同承载所有数据。

  • 高可用:每个主节点可有多个从节点,主节点故障时从节点自动提升。

  • 去中心化:节点间通过 gossip 协议通信,无需哨兵。

5.2 部署 3 主 3 从集群(使用 Docker 内部网络)

创建目录 ~/redis-cluster-test,编写 docker-compose.yml

yaml

version: '3.8'
services:
  redis1: { image: redis:7.2, container_name: redis-cluster-1, networks: [redis-cluster-net], command: redis-server --port 6379 --cluster-enabled yes --appendonly yes }
  redis2: { ... }
  redis3: { ... }
  redis4: { ... }
  redis5: { ... }
  redis6: { ... }
networks:
  redis-cluster-net:
    driver: bridge

详细配置请见后文完整命令。

5.3 创建集群

bash

# 启动容器
cd ~/redis-cluster-test
docker compose up -d
​
# 创建集群(使用临时容器,同一网络)
docker run --rm -it --network redis-cluster-net redis:7.2 \
  redis-cli --cluster create \
  redis1:6379 redis2:6379 redis3:6379 \
  redis4:6379 redis5:6379 redis6:6379 \
  --cluster-replicas 1
# 输入 yes 确认

5.4 验证集群状态

bash

# 进入任意容器
docker exec -it redis-cluster-1 redis-cli -c
​
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_known_nodes:6
​
127.0.0.1:6379> cluster nodes
# 输出显示3个master和3个slave

5.5 数据分片测试

bash

127.0.0.1:6379> set user:1000 "Alice"
-> Redirected to slot [5798] located at 172.28.0.7:6379
OK
172.28.0.7:6379> get user:1000
"Alice"
​
# 写入多个key,观察自动重定向
set user:2000 "Bob"
set order:5000 "Order5000"

5.6 故障转移测试

bash

# 宿主机停止一个主节点(例如 redis-cluster-2)
docker stop redis-cluster-2
​
# 等待30秒,查看集群节点状态
docker exec -it redis-cluster-1 redis-cli -c cluster nodes
# 原主节点标记为 fail,其从节点升级为 master
​
# 恢复原主节点
docker start redis-cluster-2
# 稍后它会以 slave 身份重新加入

结果:集群自动完成故障转移,业务不中断。


6. 清理环境

bash

# 主从+哨兵
cd ~/redis-replication
docker compose down -v
​
# 集群
cd ~/redis-cluster-test
docker compose down -v
docker network rm redis-cluster-net

7. 附录:常见问题与警告

7.1 哨兵警告 Could not rename tmp config file

  • 原因:Docker bind mount 不支持 rename 操作。

  • 影响:不影响功能,可忽略或改用 Docker 卷。

7.2 内存 overcommit 警告

  • 解决:宿主机执行 sysctl vm.overcommit_memory=1 并永久配置。

7.3 集群创建卡在 Waiting for the cluster to join

  • 原因:节点无法通过 127.0.0.1 或未开放总线端口(16379 等)。

  • 解决:使用 Docker 内部网络(容器名通信)或配置 --cluster-announce-ip 为宿主机真实 IP,并开放防火墙/安全组。

7.4 客户端连接集群失败

  • 使用支持集群协议的客户端(如 redis-cli -c、JedisCluster、lettuce)。

  • 若使用端口映射,需同时映射业务端口(6379)和总线端口(16379)。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐