Redis主从与集群搭建全指南

一、Redis 主从复制 (Replication)

主从复制是 Redis 提供的一种高可用性和数据冗余的机制。一个主节点 (master) 可以拥有多个从节点 (slave)。主节点负责处理写操作,并将写操作的数据变更异步地传播给所有从节点。从节点默认是只读的,用于处理读请求或作为故障转移的备胎。

主从设置步骤
  1. 准备节点

    • 启动多个 Redis 服务器实例(可以是在同一台机器的不同端口,也可以是不同机器)。假设我们有三个实例:
      • 主节点:127.0.0.1:6379
      • 从节点1:127.0.0.1:6380
      • 从节点2:127.0.0.1:6381
  2. 配置主节点 (可选)

    • 主节点通常不需要特殊配置即可作为主节点启动。但为了安全或持久化,你可能需要配置 requirepass (主节点密码) 和 daemonize (后台运行) 等选项。主节点配置文件 (redis-6379.conf) 示例片段:

      ini 复制代码
      port 6379
      daemonize yes
      requirepass your_master_password  # 如果设置了密码,从节点连接时需要
    • 启动主节点:

      bash 复制代码
      redis-server /path/to/redis-6379.conf
  3. 配置从节点

    • 这是关键步骤。在每个从节点的配置文件中,需要指定它要复制的主节点信息。从节点配置文件 (redis-6380.conf / redis-6381.conf) 示例片段:

      ini 复制代码
      port 6380  # 或 6381
      daemonize yes
      slaveof 127.0.0.1 6379  # 指向主节点的 IP 和端口
      masterauth your_master_password  # 如果主节点设置了 requirepass,这里需要填写相同的密码
    • 启动从节点:

      bash 复制代码
      redis-server /path/to/redis-6380.conf
      redis-server /path/to/redis-6381.conf
  4. 验证主从状态

    • 连接到任意节点(主或从),使用 INFO replication 命令查看复制状态。

    • 在主节点执行:

      bash 复制代码
      redis-cli -h 127.0.0.1 -p 6379 -a your_master_password
      > INFO replication

      输出中应看到 role:masterconnected_slaves:2 (或其他实际数字),以及从节点的连接信息。

    • 在从节点执行:

      bash 复制代码
      redis-cli -h 127.0.0.1 -p 6380
      > INFO replication

      输出中应看到 role:slave, master_host:127.0.0.1, master_port:6379, master_link_status:up (表示连接正常),以及 slave_repl_offset (复制偏移量)。

关键点

  • 主节点写,从节点读。
  • 复制是异步的,存在短暂的数据不一致窗口期。
  • 从节点可以级联 (slave of slave)。
  • 故障转移需要手动干预或借助 Redis Sentinel / Redis Cluster 等方案。

二、Redis 集群 (Cluster)

Redis Cluster 是 Redis 官方提供的分布式方案,用于解决单机 Redis 在内存容量、并发处理能力和故障恢复方面的瓶颈。它将数据分片存储在多个节点上,并提供自动的故障转移。

核心概念
  • 分片 (Sharding) :数据被自动分片到多个主节点上存储。默认将整个数据集划分为 16384 个哈希槽 (hash slot)。
  • 主节点 (Master Node):负责存储一部分哈希槽的数据和处理读写请求。
  • 从节点 (Slave Node):作为主节点的副本,在主节点故障时通过选举成为新的主节点。
  • 集群总线 (Cluster Bus):节点间通过 TCP 端口 (默认主端口 + 10000) 进行通信(如Gossip协议、故障检测、配置更新)。
集群搭建步骤 (以三主三从为例)
  1. 准备节点

    • 启动六个 Redis 服务器实例。每个节点都需要一个配置文件。

    • 每个节点的配置文件 (redis-7000.confredis-7005.conf) 需要启用集群模式并设置节点端口。示例片段 (redis-7000.conf):

      ini 复制代码
      port 7000
      daemonize yes
      cluster-enabled yes  # 启用集群模式
      cluster-config-file nodes-7000.conf  # 节点自动生成的集群配置文件
      cluster-node-timeout 5000
      appendonly yes  # 建议开启持久化
    • 启动所有六个节点:

      bash 复制代码
      redis-server /path/to/redis-7000.conf
      redis-server /path/to/redis-7001.conf
      ...  # 启动 redis-7002.conf, redis-7003.conf, redis-7004.conf, redis-7005.conf
  2. 创建集群

    • 使用 redis-cli 提供的集群管理命令 --cluster create 来初始化集群。你需要指定所有节点的地址,并告诉工具哪些节点是主节点,哪些是它的从节点(通常按顺序排列,前三个是主,后三个分别对应前三个主)。

    • 命令格式:

      bash 复制代码
      redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
      • --cluster create:创建集群。
      • 127.0.0.1:7000 ...:列出所有节点地址。
      • --cluster-replicas 1:指定每个主节点分配 1 个从节点。工具会自动将前 N 个节点视为主节点,后 N * replicas 个节点作为它们的从节点。这里 N=3。
    • 执行命令后,工具会显示它计划分配的槽位分布(每个主节点分配约 5461 个槽)。确认无误后输入 yes

  3. 验证集群状态

    • 连接到任意节点:

      bash 复制代码
      redis-cli -c -p 7000  # -c 表示以集群模式连接
      > CLUSTER INFO  # 查看集群整体状态,应为 "cluster_state:ok"
      > CLUSTER NODES  # 查看所有节点信息,包括角色 (master/slave)、负责的槽位范围、连接状态等
    • 测试读写:尝试写入一个 key。集群模式下的客户端会自动重定向到正确的节点。

      bash 复制代码
      > SET mykey "hello world"
      -> Redirected to slot [14687] located at 127.0.0.1:7002
      OK
      > GET mykey
      -> Redirected to slot [14687] located at 127.0.0.1:7002
      "hello world"

关键点

  • 最小配置要求:至少 3 个主节点才能形成集群(因为故障转移需要多数投票)。
  • 数据分片:客户端需要理解集群协议(如 redis-cli -c 或支持集群的客户端库),否则操作会因 MOVED 错误而失败。
  • 自动故障转移:当主节点故障且被大多数主节点判定为下线时,其对应的从节点会发起选举成为新主节点。
  • 节点发现:新节点加入集群或节点间通信通过集群总线和 Gossip 协议自动完成。
  • 槽位迁移:支持运行时动态添加/删除节点和重新分片 (redis-cli --cluster reshard)。

注意事项

  • 版本:确保所有节点使用相同的主要 Redis 版本。
  • 网络:集群节点间需要双向网络通信(客户端端口和集群总线端口)。
  • 工具redis-cli --cluster help 查看所有集群管理命令(添加节点、删除节点、修复、重新分片等)。
  • 生产环境 :强烈建议将节点部署在不同物理机或虚拟机,避免单点故障。配置合理的 cluster-node-timeout

通过以上步骤,你应该能够成功配置 Redis 主从复制和 Redis Cluster。主从复制提供数据备份和读写分离,而 Redis Cluster 则提供了高可用、高并发、大容量的分布式解决方案。

相关推荐
The star"'2 小时前
mysql(4-7)
数据库·mysql·adb
TextIn智能文档云平台2 小时前
什么是多模态信息抽取,它和传统OCR有什么区别?
大数据·人工智能
The star"'3 小时前
mysql(1-3)
运维·mysql·云计算
Cheadmaster3 小时前
20252820_进程管理实验
linux
jiayong233 小时前
Redis面试深度解析
数据库·redis·面试
思成不止于此3 小时前
【MySQL 零基础入门】DQL 核心语法(四):执行顺序与综合实战 + DCL 预告篇
数据库·笔记·学习·mysql
model20053 小时前
Alibaba linux 3安装LAMP(5)
linux·运维·服务器
weixin_462446234 小时前
SpringBoot切换Redis的DB
数据库·spring boot·redis
哇哈哈&4 小时前
安装wxWidgets3.2.0(编译高版本erlang的时候用,不如用rpm包),而且还需要高版本的gcc++19以上,已基本舍弃
linux·数据库·python