当前位置: 首页 > news >正文

Redis基础系列-集群模式

文章目录

  • Redis基础系列-集群模式
    • 1.什么是集群模式?
    • 2.集群模式原理
      • 2.1 集群中的哈希槽(slot)
      • 2.2 集群的分片
      • 2.3 节点通信
      • 2.3 CRC16算法
      • 2.3 读写过程
    • 3.集群模式部署
    • 4.集群常用命令
    • 5.集群验证
    • 6. 主从容错切换
    • 6.主从扩容
      • 6.1 新增master
      • 6.2 重新分派槽号
      • 6.3 新增slave加入集群
      • 6.4 为什么新节点分配的槽位不是连续的?
    • 7. 主从缩容
      • 7.1 删除从机节点
      • 7.2 删除master集群节点
      • 7.3 清空槽位将槽位分配给192.168.111.147:6381
    • 8. 参考和感谢
    • 9. 下载完整的redis集群配置

Redis基础系列-集群模式

1.什么是集群模式?

Redis集群是一种分布式数据库解决方案,通过多节点协同工作实现高可用性、数据分片存储和负载均衡。核心特点包括:

  • 水平扩展:数据分散存储至16384个哈希槽,支持TB级数据量
  • 故障自愈:主节点宕机时,从节点自动接替(需哨兵或Cluster模式支持)
  • 去中心化架构:每个节点保存集群状态信息,避免单点故障

2.集群模式原理

2.1 集群中的哈希槽(slot)

Redis集群没有使用一致性hash,而是引入了哈希槽的概念
Redis集群有16384个哈希槽,每个key通过校验CRC16校验后对16384去模来决定放置那个槽位,集群中的每个节点负责一部分哈希槽,例如:

2.2 集群的分片

使用Redis集群时我们会将存储的数据分散到多台redis机器上,这称为分片。简言之,集群中的每个Redis实例都被认为是整个数据的一个分片。

2.3 节点通信

  1. 通信端口规则
  • 数据端口:默认6379(可自定义,如7000-7010)
  • 集群总线端口:数据端口 + 10000(如6379 → 16379)
    注:这是集群节点间专用通信通道,需确保防火墙开放此端口段
  1. 核心通信协议
    Redis集群采用混合通信模式,结合Gossip协议与集中式消息广播:
通信类型协议端口频率功能说明
节点发现Gossip(PING/PONG)总线端口每秒10次交换节点状态和槽位信息
故障检测集中式广播总线端口实时触发主节点下线通知和从节点晋升
数据迁移自定义二进制数据端口按需触发槽位重分配时的键值迁移
  1. 通信流程示例
NodeA NodeB Cluster AllNodes PING(包含自身状态) PONG(携带集群视图) 通过总线端口16379通信 PUBLISH 节点故障事件 FAILOVER 广播 NodeA NodeB Cluster AllNodes

2.3 CRC16算法

CRC16(Cyclic Redundancy Check 16)是Redis集群用于数据分片的核心哈希算法,它将任意长度的键名转换为0-16383之间的固定范围值(哈希槽编号)。

-取余
-环形取余

2.3 读写过程

读流程
CRC16计算槽位
客户端GET请求
查询本地路由表
是否匹配主/从节点?
从当前节点读取数据
返回ASK/MOVED重定向
客户端定向到正确节点
返回数据
写流程
CRC16计算槽位
客户端SET请求
查询本地路由表
是否匹配主节点?
写入主节点内存
返回MOVED重定向
客户端更新路由表并重试
异步复制到从节点

3.集群模式部署

  • 集群相关软件配置下载
    redis镜像下载

  • 三主三从集群机构,三台机子,使用docker部署

192.168.10.111 6381
192.168.10.111 6382192.168.10.112 6383
192.168.10.112 6384192.168.10.113 6385
192.168.10.113 6386
  • 准备目录
mkdir -p /home/jykj/redisCluster
chmod -R 777 /home/jykj/redisCluster
  • 防火墙端口开放
firewall-cmd --zone=public --add-port=6381/tcp --permanent
firewall-cmd --zone=public --add-port=6382/tcp --permanent
firewall-cmd --zone=public --add-port=6383/tcp --permanent
firewall-cmd --zone=public --add-port=6384/tcp --permanent
firewall-cmd --zone=public --add-port=6385/tcp --permanent
firewall-cmd --zone=public --add-port=6386/tcp --permanentfirewall-cmd --zone=public --add-port=16381/tcp --permanent
firewall-cmd --zone=public --add-port=16382/tcp --permanent
firewall-cmd --zone=public --add-port=16383/tcp --permanent
firewall-cmd --zone=public --add-port=16384/tcp --permanent
firewall-cmd --zone=public --add-port=16385/tcp --permanent
firewall-cmd --zone=public --add-port=16386/tcp --permanentfirewall-cmd --reloadfirewall-cmd --zone=public --query-port=6383/tcp
  • 三台机器六个节点的配置
    vim redisCluster3681.conf
bind 0.0.0.0
daemonize no
protected-mode no
port 6381
logfile "/home/jykj/redisCluster/redis6381.log"
pidfile /home/jykj/redisCluster/redis6381.pid
dir /home/jykj/redisCluster
dbfilename dump6381.rdb
appendonly yes
appendfilename "appendonly6381.aof"
requirepass 111111
masterauth 111111cluster-enabled yes
cluster-config-file nodes-6381.conf
cluster-node-timeout 5000
  • redis容器实例构建命令
docker run -d --name redisCluster6386 \
--restart=always \
--privileged=true \
--network=host \
-v /home/jykj/redisCluster:/home/jykj/redisCluster \
redis:7.4.2 redis-server /home/jykj/redisCluster/redis6386.conf
  • 创建集群主从关系
docker exec -it redisCluster6381 \
redis-cli -a 111111 --cluster create \
--cluster-replicas 1 --cluster-yes --cluster-timeout 15000 \
192.168.10.111:6381 192.168.10.111:6382 \
192.168.10.112:6383 192.168.10.112:6384 \
192.168.10.113:6385 192.168.10.113:6386 

# 先清理所有节点(在6台主机分别执行)
docker exec redisCluster6385 redis-cli -a 111111 -p 6385 flushall 
docker exec redisCluster6385 redis-cli -a 111111 -p 6385 cluster reset hard 
docker exec redisCluster6386 redis-cli -a 111111 -p 6386 flushall 
docker exec redisCluster6386 redis-cli -a 111111 -p 6386 cluster reset hard # 带健康检查的集群重建(推荐)
docker exec -it redisCluster6381 redis-cli -a 111111 -p 6381 --cluster create \
--cluster-replicas 1 --cluster-yes --cluster-timeout 20000 \
192.168.10.111:6381 192.168.10.111:6382 \
192.168.10.112:6383 192.168.10.112:6384 \
192.168.10.113:6385 192.168.10.113:6386

4.集群常用命令

查看集群信息

<!--进入redis-->
redis-cli -p 6381<!--查看信息-->
cluster info<!--查看节点-->
cluster nodes<!--xxx-->
info replication<!--查看key的槽位-->
cluster keyslot k1<!--检查节点信息-->
redis-cli --cluster check 172.17.0.1:6381
命令功能示例
CLUSTER NODES查看节点拓扑redis-cli -p 7000 cluster nodes
CLUSTER INFO检查集群状态redis-cli -p 7000 cluster info
CLUSTER SLOTS查看槽位分布redis-cli -p 7000 cluster slots
CLUSTER FAILOVER手动故障转移在从节点执行触发主从切换
INFO REPLICATION查看主从复制状态redis-cli -p 7000 info replication

5.集群验证

  • 主从关系(并不是我们一开始设定的顺序)

一定注意槽位的范围区间,需要路由到位

6. 主从容错切换

  • 我们关掉6381,看看集群架构的变化

  • 恢复6381,6381能否恢复上位(答案是不能)

  • 集群不保证数据一致性100%OK,一定会有数据丢失情况
    Redis集群不保证强一致性,这意味着在特定的条件下,Redis集群可能会丢掉一些被系统收到的写入请求命令

  • 手动故障转移 or 节点从厘调整该如何处理
    上面一换后6381、6384主从对调了,和原始设计图不一样了,该如何
    重新登陆6381机器

6.主从扩容

6.1 新增master

进入新增的redis容器

新增的6387作为master节点加入集群

redis-cli --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381

6387 就是将要作为master新增节点
6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群

6.2 重新分派槽号

命令:redis-cli --cluster reshard IP地址:端口号
redis-cli --cluster reshard 192.168.111.147:6381

6.3 新增slave加入集群

redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID

6.4 为什么新节点分配的槽位不是连续的?

重新分配成本太高,所以前面的集群各自习出来 部分槽位,从旧节点分别匀出坑位给新节点

7. 主从缩容

7.1 删除从机节点

命令:redis-cli --cluster del-node ip:从机端口 从机6388节点ID

redis-cli --cluster del-node 192.168.111.147:6388 5d149074b7e57b802287d1797a874ed7a1a284a8

7.2 删除master集群节点

命令:redis-cli --cluster del-node ip:端口 6387节点ID

redis-cli --cluster del-node 192.168.111.147:6387 e4781f644d4a4e4d4b4d107157b9ba8144631451

7.3 清空槽位将槽位分配给192.168.111.147:6381

redis-cli --cluster reshard 192.168.111.147:6381

8. 参考和感谢

尚硅谷Redis零基础到进阶,最强redis7教程,阳哥亲自带练

9. 下载完整的redis集群配置

Redis集群配置和软件

http://www.xdnf.cn/news/237691.html

相关文章:

  • 基于站点观测的中国1km土壤湿度日尺度数据集(2000-2022)
  • 深入探索ChatClient:简化AI模型交互的强大工具
  • 关于现代哲学的哲学理论的探索
  • layui轮播图根据设备宽度图片等比例,高度自适应
  • 在柯希霍夫积分法偏移成像中,反假频处理
  • 【黑马JavaWeb+AI知识梳理】后端Web基础01 - Maven
  • ReSearch: Learning to Reason with Search for LLMs via Reinforcement Learning
  • 【补题】Codeforces Round 664 (Div. 1) A. Boboniu Chats with Du
  • 西门子PLC S7-1200 的组态软件控制
  • DeepSeek V2:引入MLA机制与指令对齐
  • ZLG嵌入式笔记 | 移动硬盘和虚拟机的那些事儿
  • 深度卷积模型:案例研究
  • 【iPaaS融合集成平台-混合云时代,iPaaS正在成为企业集成的“中央枢纽”】
  • 数据访存性能影响因素:虚拟内存管理和TLB的概念和工作流程
  • 【Java】一篇讲透Java中的集合类
  • 多智能体协同作战:MagenticOne如何指挥一支AI团队
  • 什么是工业互联网平台?
  • kbuild system学习
  • 浮阀塔精馏分离乙醇-水溶液工艺设计研究
  • 从实列中学习linux shell4: shell 脚本中 $0 $1 $2 $3 >> 以及 awk 都是干啥的?
  • FastAPI系列12:使用JWT 登录认证和RBAC 权限控制
  • 前端笔记-Element-Plus
  • python安装和环境配置,开发方法简要步骤。
  • Android 自带的分享功能分享到三方应用
  • ProfiNet转CAN协议转换网关数据交互实现:工业自动化异构网络无缝对接
  • [250429] 免费!DeepSeek-R1T-Chimera 合并 R1 和 V3, 在 OpenRouter 上可用
  • 2025华东杯ABC题赛题已出速拿
  • ​​智能制造中的预测性维护:基于深度学习的设备故障预测​​
  • 矫平机:金属板材精密加工的“整形专家”
  • 在 Linux 系统中,让线程主动放弃当前 CPU 时间片