分布式-redis集群架构

文章目录

Redis集群架构

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

集群架构不需要哨兵节点

特点

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

数据分片

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

  1. 哈希槽

**分配算法 **slot = CRC16(key) % 16384

定位节点

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

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

动态扩缩容

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

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

集群通信

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

  1. 每秒随机选择5个节点中最久未通信的节点进行PING
  2. 携带自身和其他节点的状态信息
  3. 收到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(集群总线)端口。
  • 主从节点和哨兵节点分开部署,避免资源争用,提高稳定性。

基础配置-所有节点

java 复制代码
# 设置主机名(根据角色修改)
hostnamectl set-hostname redis-m1   # 主节点1
hostnamectl set-hostname redis-m2   # 主节点2
hostnamectl set-hostname redis-m3   # 主节点3
hostnamectl set-hostname redis-s1   # 从节点1
hostnamectl set-hostname redis-s2   # 从节点2
hostnamectl set-hostname redis-s3   # 从节点3

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 或者开放端口
# firewall-cmd --permanent --add-port=6379/tcp --add-port=26379/tcp
# firewall-cmd --reload

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

安装Redis-所有节点

shell 复制代码
# 方式一:源码编译
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

java 复制代码
# 集群配置
cluster-enabled yes
cluster-config-file /data/redis/conf/nodes-6379.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.1.1   # 替换为本机IP
cluster-announce-port 6379		  # redis端口
cluster-announce-bus-port 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。

java 复制代码
# 集群配置
cluster-enabled yes
cluster-config-file /data/redis/conf/nodes-6379.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.1.4   # 替换为本机IP
cluster-announce-port 6379
cluster-announce-bus-port 16379

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

集群配置

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

shell 复制代码
# 列出所有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

输出示例:

plain 复制代码
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

高可用测试

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

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

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万

相关推荐
珠海西格2 小时前
红区之困:分布式光伏爆发背后的“逆流危机”
大数据·运维·服务器·数据库·人工智能·分布式
予枫的编程笔记2 小时前
【面试专栏|Java并发编程】Java并发锁对比:synchronized与Lock,底层原理+适用场景详解
java·synchronized·java面试·java并发编程·并发锁·面试干货·lock接口
醇氧2 小时前
PowerPoint 批量转换为 PDF
java·spring boot·spring·pdf·powerpoint
The Open Group2 小时前
架构之道:平衡企业复杂性的艺术 ——从架构能力到组织持续成长
架构
java1234_小锋2 小时前
Java高频面试题:RabbitMQ如何实现消息的持久化?
java·开发语言
Ulyanov2 小时前
基于Celery的分布式雷达电子战仿真系统:架构设计与实战指南
分布式·python·队列处理·雷达电子战仿真
Volunteer Technology2 小时前
Redis跟HashMap在结构上的区别
数据库·redis·缓存
Volunteer Technology2 小时前
RabbitMQ面试场景题归纳
分布式·面试·rabbitmq
吾诺2 小时前
GO 快速升级Go版本
开发语言·redis·golang