欢迎光临
我们一直在努力

分布式-redis集群架构

文章目录

  • Redis集群架构
    • 特点
    • 数据分片
    • 集群通信
    • 故障恢复
  • 生产级集群部署文档
    • 基础配置-所有节点
    • 安装Redis-所有节点
    • 配置Redis集群节点
      • 主节点配置(redis-m1, redis-m2, redis-m3)
      • 从节点配置(redis-s1, redis-s2, redis-s3)
      • 集群配置
    • 验证
      • 查看集群信息
      • 查看节点列表
      • 测试数据读写
      • 高可用测试
      • 性能测试

Redis集群架构

Redis集群由多个主节点(Master)和对应的从节点(Replica)组成,每个节点负责存储部分数据(分片)。采用去中心化的分布式架构,通过分片(Sharding)实现数据的分布式存储。

集群架构不需要哨兵节点

特点

核心机制技术实现设计目标
分布式数据分片 采用** 16384 Slot** 哈希槽分区,数据按 CRC16(key) mod 16384分配到不同节点 负载均衡 & 水平扩展
去中心化架构 节点间通过 Gossip 协议交换状态(PING/PONG),无单点依赖 高可用 & 故障自愈
主从复制模型 每个分片包含 1 主 N 从(建议至少 1 从),主节点故障时从节点自动晋升(Raft选主) 数据冗余 & 快速恢复
客户端重定向 客户端直连任意节点,若访问错误分片返回 MOVED响应并重定向 降低代理层开销

数据分片

Redis 集群将整个数据空间划分为16384个哈希槽(编号 0~16383),每个槽对应一个数据分片。

  • 哈希槽
  • **分配算法 **slot = CRC16(key) % 16384

    定位节点

    1. 客户端计算键的哈希槽
    2. 查找槽所在节点
    3. 直接连接对应节点操作数据


    集群维护一个槽到节点的映射表(CLUSTER SLOTS 命令可查看),客户端根据槽号找到对应节点。

    动态扩缩容

    添加节点:新节点加入时,会从现有节点迁移部分哈希槽(如从 Node A 迁移 1000 个槽到 Node C)。

    删除节点:将待删除节点的哈希槽重新分配到其他节点。

    集群通信

    Redis集群使用Gossip协议传播节点状态信息(如新增节点、故障检测、槽迁移等)

  • 每秒随机选择5个节点中最久未通信的节点进行PING
  • 携带自身和其他节点的状态信息
  • 收到PING后回复PONG消息
  • 消息类型说明
    MEET 手动触发新节点加入集群
    PING 检测节点健康状态,节点定期交换元数据(如槽分配、IP 地址、端口)
    PONG 对PING/MEET的响应,节点定期交换元数据(如槽分配、IP 地址、端口)
    FAIL 广播故障节点信息,通知其他节点某节点已下线,触发故障转移
    PUBLISH 发布订阅消息

    故障恢复

    1、故障检测

    主观下线(PFail):节点A发现节点B超过cluster-node-timeout未响应,标记B为PFail。

    客观下线(Fail):节点A通过Gossip协议将PFail广播给其他节点,若多数节点确认B不可达,则标记B为 Fail。

    2、故障转移

    1)故障检测:超过半数主节点确认某主节点下线

    2)满足条件的Replica选举:

    基于Raft算法的选举机制

    优先选择复制偏移量最大的,数据最新从节点

    3)配置更新:新主节点接管槽位并通知集群

    3、槽重新分配

    新Master接管原Master的哈希槽。

    其他节点更新槽映射表。

    生产级集群部署文档

    硬件:3主3从,不用哨兵节点,针对大型公司(日活百万级至千万级,QPS 10万+)的场景

    主机名IP地址角色硬件配置服务端口
    redis-m1 192.168.1.1 主节点1 16核/64GB/1TB 6379, 16379 (集群总线)
    redis-m2 192.168.1.2 主节点2 16核/64GB/1TB 6379, 16379
    redis-m3 192.168.1.3 主节点3 16核/64GB/1TB 6379, 16379
    redis-s1 192.168.1.4 从节点1 16核/64GB/1TB 6379, 16379
    redis-s2 192.168.1.5 从节点2 16核/64GB/1TB 6379, 16379
    redis-s3 192.168.1.6 从节点3 16核/64GB/1TB 6379, 16379,

    说明:

    • 集群共6个节点,3主3从,16384个槽位均匀分布在3个主节点。
    • 每个从节点为其对应主节点的副本(由集群自动分配,也可手动指定)。
    • 所有服务器之间网络互通,防火墙开放 6379(Redis)和 16379(集群总线)端口。
    • 主从节点和哨兵节点分开部署,避免资源争用,提高稳定性。

    基础配置-所有节点

    # 设置主机名(根据角色修改)
    hostnamectl sethostname redism1 # 主节点1
    hostnamectl sethostname redism2 # 主节点2
    hostnamectl sethostname redism3 # 主节点3
    hostnamectl sethostname rediss1 # 从节点1
    hostnamectl sethostname rediss2 # 从节点2
    hostnamectl sethostname rediss3 # 从节点3

    # 关闭防火墙
    systemctl stop firewalld
    systemctl disable firewalld
    # 或者开放端口
    # firewallcmd permanent addport=6379/tcp addport=26379/tcp
    # firewallcmd reload

    # 关闭SELinux(临时)
    setenforce 0
    sed i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

    安装Redis-所有节点

    # 方式一:源码编译
    cd /usr/local/src
    wget https://download.redis.io/releases/redis-7.2.4.tar.gz
    tar xzf redis-7.2.4.tar.gz
    cd redis-7.2.4
    make && make install PREFIX=/usr/local/redis

    # 创建数据目录和配置目录:
    mkdir -p /data/redis/{data,logs,conf,run}
    useradd redis -s /sbin/nologin -M
    chown -R redis:redis /data/redis /usr/local/redis

    # 启动redis[暂时不启动]
    ./redis-server /data/redis/conf/redis.conf

    配置Redis集群节点

    主节点配置(redis-m1, redis-m2, redis-m3)

    以 redis-m1(192.168.1.1)为例, 编辑 /data/redis/conf/redis.conf

    # 集群配置
    clusterenabled yes
    clusterconfigfile /data/redis/conf/nodes6379.conf
    clusternodetimeout 15000
    clusterannounceip 192.168.1.1 # 替换为本机IP
    clusterannounceport 6379 # redis端口
    clusterannouncebusport 16379 # redis集群总线端口

    # 以下配置和主从架构一致即可
    # 基础配置
    # 主节点认证密码(可选,建议设置)
    # 持久化配置 RDB+AOF
    # AOF配置(可根据需求选择开启)
    # 内存管理(根据实际内存调整,留出系统内存)

    启动redis ./redis-server /data/redis/conf/redis.conf

    从节点配置(redis-s1, redis-s2, redis-s3)

    从节点配置与主节点基本相同,仅 cluster-announce-ip 需修改为对应IP。

    以 redis-s1(192.168.1.4)为例,配置文件同上,只需将 cluster-announce-ip 改为 192.168.1.4。

    # 集群配置
    clusterenabled yes
    clusterconfigfile /data/redis/conf/nodes6379.conf
    clusternodetimeout 15000
    clusterannounceip 192.168.1.4 # 替换为本机IP
    clusterannounceport 6379
    clusterannouncebusport 16379

    启动redis ./redis-server /data/redis/conf/redis.conf

    集群配置

    在任意一台有 redis-cli 的节点(如 redis-m1)执行:

    # 列出所有6个节点的IP:端口,为每个主节点分配1个从节点。
    ./redis-cli -a Redis123 –cluster create \\
    192.168.1.1:6379 192.168.1.2:6379 192.168.1.3:6379 \\
    192.168.1.4:6379 192.168.1.5:6379 192.168.1.6:6379 \\
    –cluster-replicas 1

    执行后会显示分配方案,确认后输入 yes。

    等待片刻,集群创建成功。

    验证

    查看集群信息

    redis-cli -a Redis123 -c -h 192.168.1.1 cluster info

    输出示例:

    cluster_state:ok
    cluster_slots_assigned:16384
    cluster_slots_ok:16384
    cluster_known_nodes:6
    cluster_size:3

    查看节点列表

    redis-cli -a Redis123 -c -h 192.168.1.1 cluster nodes

    应列出6个节点,包含主从关系及槽位分配

    测试数据读写

    redis-cli -a Redis123 -c -h 192.168.1.1 set foo bar

    redis-cli -a Redis123 -c -h 192.168.1.1 get foo

    高可用测试

    • 模拟主节点故障
    • 在 redis-m1上执行后等待30s:systemctl stop redis
    • Redis Cluster会自动将从节点(例如 redis-s1)提升为新主节点。
    • 恢复原主节点
    • 启动redis-m1:systemctl start redis
    • 它将作为从节点自动加入集群。
    • 手动故障转移

    若需将从节点提升为主,可在从节点执行:

    redis-cli -a Redis123 -h 192.168.1.4 -p 6379 CLUSTER FAILOVER

    性能测试

    总写能力:3个主节点处理写请求,可线性扩展,总写QPS约15万~24万(按单节点5~8万估算)。

    总读能力:如果所有读请求都发送到主节点,则总读QPS同样约15万~24万;如果允许从节点处理读(通过客户端配置),则总读QPS可接近 30万~48万(3主+3从同时服务读,但需注意从节点可能有一定延迟)。

    总混合QPS:在读写比例2:8下,总QPS可达 20万~30万。

    赞(0)
    未经允许不得转载:171主机测评 » 分布式-redis集群架构
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址