惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Cisco Blogs
Cyberwarzone
Cyberwarzone
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
SecWiki News
SecWiki News
Martin Fowler
Martin Fowler
T
Tor Project blog
N
Netflix TechBlog - Medium
C
Cybersecurity and Infrastructure Security Agency CISA
V
Vulnerabilities – Threatpost
V
Visual Studio Blog
GbyAI
GbyAI
PCI Perspectives
PCI Perspectives
D
DataBreaches.Net
Jina AI
Jina AI
H
Heimdal Security Blog
云风的 BLOG
云风的 BLOG
P
Privacy International News Feed
A
About on SuperTechFans
J
Java Code Geeks
美团技术团队
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
News | PayPal Newsroom
有赞技术团队
有赞技术团队
MyScale Blog
MyScale Blog
博客园 - 司徒正美
C
Check Point Blog
T
Threat Research - Cisco Blogs
Attack and Defense Labs
Attack and Defense Labs
宝玉的分享
宝玉的分享
AI
AI
Simon Willison's Weblog
Simon Willison's Weblog
C
Cyber Attacks, Cyber Crime and Cyber Security
I
Intezer
P
Proofpoint News Feed
Blog — PlanetScale
Blog — PlanetScale
Apple Machine Learning Research
Apple Machine Learning Research
Hugging Face - Blog
Hugging Face - Blog
The Last Watchdog
The Last Watchdog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Vercel News
Vercel News
I
InfoQ
阮一峰的网络日志
阮一峰的网络日志
Cisco Talos Blog
Cisco Talos Blog
W
WeLiveSecurity
Hacker News: Ask HN
Hacker News: Ask HN
Recent Commits to openclaw:main
Recent Commits to openclaw:main
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
D
Docker
博客园 - Franky
Security Archives - TechRepublic
Security Archives - TechRepublic

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12) Snack JSONPath 项目架构分析 Claude Code Buddy 小析:一个非核心功能,如何体现产品的细节完成度 AI新时代下的图床管理方案-Cloudflare图床+MCP+Skills方案指南 化繁为简:顺丰速运App如何通过 HarmonyOS SDK实现专业级空间测量 从零实现富文本编辑器#13-React非编辑节点的内容渲染 AI开发-python-langchain框架(3-23-OpenAI Functions风格Tool Calling智能助手) .NET + AI 进阶实战:基于类的技能开发 - 打造可治理的 Agent 能力模块 【从0到1构建一个ClaudeAgent】规划与协调-技能 上周热点回顾(4.6-4.12) 电子小白的工具三件套:面包板、杜邦线、万能板 单表五亿数据的查询优化 | Mysql、StarRocks 2. WorkBuddy:从“我是谁”到“帮我干活” C# 如何减少代码运行时间:7 个实战技巧 基于HelixToolkit.SharpDX 渲染3D模型 - 笺上知微 从零开始的双臂具身VLA起源及现阶段发展综述 - SkyXZ 记对 xonsh shell 的使用, 脚本编写, 迁移及调优 - pluvium27 受够了Vibe Coding的失控?换个起点,让AI事半功倍 从开始配置漏洞环境到漏洞复现流程 - 難しい 关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法 - 虚无境 Any metadata 的内存布局 C# .NET 周刊|2026年3月2期 - InCerry 我帮你测过了,测试圈排名第二的 Skill 依然很牛逼 Skill Discovery | 无监督技能发现的经典工作总结 - MoonOut PbootCMS 网站内容数量多导致访问慢?这些实用优化方案帮你提速! - 家兴网络技术工作室 上下文工程是什么?过时了么?一文讲明白! - 一枫说码 网站漏洞怎么发现并修复?一篇实用指南(附完整流程) - 家兴网络技术工作室 开了 TUN 模式还是直连?90% 的人都踩过这个坑 Github日报|2026年04月12日 - AI一族 AScript扩展多种脚本语言 - rockey627 AI 学习笔记:Agent 的记忆机制 你能被装进一个文件里吗?——7 万人把同事"蒸馏"成了 AI - 我没有三颗心脏 Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南 - 暮色之狐 在浏览器中快速编辑代码:VSCode Web 集成实践 - Newbe36524 蒸馏自己 skill?基于 Deepseek 的蒸馏器,丐版蒸馏方式,简单便捷 - To_Carpe_Diem Spring AI Aliababa和AgentScope,哪个更好? - 苏三说技术 Etsy 把 1000 个 MySQL 分片迁进 Vitess:425TB 数据背后的真正问题不是性能,而是运维规模 MicroPython LVGL基础知识和概念:底层渲染与性能优化 - FreakStudio 数据库草图算法 Python 潮流周刊#146:CPython 引入 Rust 的进展 - 豌豆花下猫 最小生成树 - mofei1116 红日靶场七:从外网入口、容器逃逸到 AD 接管的完整利用链复盘 - YouDiscovered1t 分享四款开源且实用的 Kafka 管理工具 - 追逐时光者 vLLM 权重加载机制全解析:从挑战到理想架构 LCT 学习笔记 - ACehomoxue Avalonia UI 12.0.0 正式发布:架构演进和性能飞跃 - 张善友 当 AI Agent 把调用链拉长,延迟开始成为一门生意 conhost.exe 无法显示 U+2717 - 145a 太秀了,我把自己蒸馏成了 Skill!已开源 - 程序员鱼皮 ASP.NET Core 内存缓存实战:一篇搞懂该怎么配、怎么避坑 基于 Ghostty 带有分割标签页和为 Claude 编程设计的通知终端 - BugShare AI 焊死入口:教育的“操作系统级”重塑 - 郝hai 初级Java开发工程师使用sql脚本编写代码的过程是简单而且不糊涂 - CoderOilStation Claude Code通关手册(六):MCP协议完全指南 - 暮色之狐 边框灯光环绕动画特效实现指南 - Newbe36524 开源:子木蒸馏版的 SEO 审计工具 seo-audit-skill v1.0 我所理解的Python元模型 【从0到1构建一个ClaudeAgent】规划与协调-TodoWrite - 程序员Seven Claude 和 Codex 在审计 Skill 上性能差异探究 - ACai_sec AScript如何实现中文脚本引擎 - rockey627 【渗透测试】HTB Season10 Garfield 全过程wp - dynasty_chenzi Android 开发者为什么必须掌握 AI 能力?端侧视角下的技术变革 树状数组正确性证明 - AC-wyr 你的 AI 焦虑,可能比 AI 本身更危险——ATM 机没有消灭银行柜员,但恐慌消灭了你的判断力 - 我没有三颗心脏 一个拉胯的分库分表方案有多绝望?整个部门都在救火! - 冰河团队 动态规划入门必学之走方格问题 - Ofnoname PostgREST 与 PostgreSQL 角色权限配置全解析(生产级实践) - SheepDog1998 使用 UEFI 图形输出协议 GOP 在屏幕上显示图像的方法 - 阿源- Claude Code通关手册(五):组建你的AI专家团队,子代理系统 - 暮色之狐 一个程序员到架构师的催婚路之感悟(整整10年后的催婚相亲感悟) - MisterLip 用 Agent Skill 自动生成工作周报 - 赵康
Redis--Redis分布式系统的原理与实操
NE_STOP · 2026-05-11 · via 博客园_首页

Redis分布式系统

Redis分布式系统(Redis集群)很好的解决不同Redis节点存放不同数据,并将用户请求方便地路由到不同Redis的问题。

数据分区算法

分布式数据库系统会根据不同的数据分区算法,将数据分散存储到不同的服务器节点上,每个节点管理整个数据集合的一个子集。

无标题

常见的数据分区规则有两大类:顺序分区和哈希分区。

顺序分区

顺序分区是将数据按照某种顺序平均分配到不同的节点。

比如:轮询分区算法、时间片轮转分区算法、数据块分区算法、业务主题分区算法等。

轮询分区算法

每产生一个数据就依次分配的不同的节点。

该算法适合数据量不确定的场景。

在数据量庞大的情况下,每个节点的数据很平均。

但生产者与节点间的连接要长时间保存。

时间片轮转分区算法

在一个固定长度的时间片内,数据会分配到一个节点,时间片结束,新的数据就分配到下一个节点。

该算法可能会出现节点数据不平均的情况(每个时间片内产生的数据量不同)。

但生产者与节点间的连接只需一个正在使用的就行,使用完毕后释放连接。

数据块分区算法

数据总量确定的情况下,根据各个节点的存储能力,将某块数据分配到一个节点。

业务主题分区算法

不同的业务主题,分配到不同节点。

哈希分区

哈希分区规则是充分利用数据的哈希值来完成分配,对数据哈希值的不同使用方式产生了不同的哈希分区算法。

常见的哈希分区算法如下:

节点取模哈希算法

该算法的前提是,每个节点都分配好了一个唯一序号,对于N个节点的分布式系统,序号范围是【0,N-1】.

然后选取数据本身作为key,计算hash(key)与节点N的模。计算结果就是该数据存储的节点的序号。

该算法优点是简单;缺点是如果分布式系统要扩容或缩容,已存的数据需要根据新的节点数据N进行数据迁移,否则根据key无法找到原来的数据。

实际上一般采用翻倍扩容方式,以减少扩容时数据迁移的比例。

一致性哈希分区算法

一致性哈希算法通过一致性hash环的数据结构实现。

环的起点是0,终点是232-1,并且起点和终点重合,环中间的整数按顺/逆时针分步。

无2标题

上图中o1、o2、o3、o4代表待分配的数据,红色方框是这4个数据的hash(o)在hash环中的落点。

m0、m1、m2代表三个节点,绿色圆圈表示三个节点的hash(m)在hash环中的落点。

数据的hash(o)按照顺/逆时针方向离哪个hash(m)最近,就存在哪个节点上。

该算法的优点是节点扩容或缩容时,只对最近的节点有影响,其他节点无影响。

缺点是:容易形成数据倾斜。且节点变化影响的数据量大,所以不适合数据节点少的场景。

虚拟槽分区算法

该算法首先虚拟出一个固定数量的整数集合,集合中的每个数称为一个slot槽。

槽的数据一般远大于节点数量,然后将槽瓶平均映射到各个节点上。

例如Redis 分布式系统中虚拟了16384个槽,范围是【0,16383】.假设有3个节点,那么solt槽和节点的映射关系如下:

无标3题

数据与槽有关系,和节点没关系。

数据通过hash(key)映射到槽:solt=hash(key)%soltNums。

该算法优点:解耦数据和节点,无需维护节点,只需维护与solt槽的关系。

Redis数据分区就是采用这个算法,计算公式为solt=CRC16%16384.

系统搭建

系统架构

一个master配一个slave。master和slave的关系在搭建成功后会自动分配。

无标4题

删除持久化文件

先将之前Redis主从集群在Redis安装目录下生成的RDB文件dump638*.conf和AOF持久化文件删除。

因为Redis分布式系统要求创建在一个空的数据库之上。

AOF持久化文件全部上appendonlydir目录中。

然后再Redis安装目录中mkdir一个新目录 cluster-dis。

将cluster 目录中的redis.conf 和redis6380.conf文件复制到cluster-dis 目录。

修改redis.conf

  1. dir

    指定工作目录为前面创建的cluster-dis目录。持久化文件、节点配置文件都在这个目录中生成。

    dir "/opt/apps/redis/cluster-dis"
    
  2. cluster-enabled

    cluster-enabled yes  # 开启集群模式
    
  3. cluster-config-file

    指定集群节点的配置文件,该文件会在每次节点启动时自动生成,其在dir属性指定的目录。

    该属性仍然保持注释,在后面的每个节点单独的配置文件中配置它。

  4. cluster-node-timeout

    cluster-node-timeout 15000 # 指定集群节点间通信的超时阈值,单位毫秒
    
  5. 修改redis6380.conf

无标5题

  1. 复制5个配置文件:redis6381.conf、redis6382.conf、redis6383.conf、redis6384.conf、redis6385.conf

将端口号全部换为对应的端口号。

系统的启动与关闭

  1. 使用redis-server redis638*.conf 启动各个节点。此时在cluster-dis目录中生成了6个nodes的配置文件。

  2. 这些节点启动后仍然时6个独立的Redis,通过redis-cli --cluster create 命令将6个节点创建成一个分布式系统。

    redis-cli --cluster create --cluster-replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385
    

    当询问是,输入yes 即可创建完成。

无6标题

  1. 测试系统

    通过cluster nodes 命令可以查看各节点的关系及连接情况,只要看到每个节点的connected,说明系统搭建成功。对于命令redis-cli 需要注意:

    • redis-cli 带有参数-c 表示要连接的是一个集群,而不是一个节点
    • 端口号可以使用6个中的任意一个。

无标7题

  1. 关系系统:将各个节点shutdown 即可。

    redis-cli -p 5380 shutdown
    

集群操作

  1. 先连接集群

    redis-cli -c -p 6380
    
  2. 写入数据:单个key写入没有问题,一次写入多个key会报错。

    当批量写入多个key时,由于多个key会计算出多个solt。多个solt可能会对应多个节点,而一次只能写入一个节点,所有该操作会报错。

    不过,系统提供了批量写入多个key的方案,为这些key指定一个统一的group,让这个group 作为计算slot的唯一值。

    mset name{emp} ali age{emp} 22
    

无8标题

集群查询

  1. 查询key的slot:通过cluser keyslot 查询指定key的slot

    cluster keyslot emp # 查询emp的slot
    
  2. 查询slot中key的数量:通过cluster countkeyinslot 查询指定slot中包含key的个数

    cluster countkeyinslot 13178
    
  3. 查询slot中的key:通过cluster getkeysinslot 查询指定slot中包含的key

    cluster getkeysinslot 13178
    

故障转移

分布式系统中某个master如果宕机,那么对应的slave就会自动晋升为master,如果原master又重新启动,那么原master会自动变为新master的slave。

全覆盖需求

如果某slot范围对应的节点全部宕机,那么分布式系统是否还可以对外提供服务,取决于属性cluster-require-full-coverage的设置。

该属性的取值有:

  • yes:默认值,要求所有slot节点必须全覆盖的情况下系统才能运行。
  • no:slot节点不全的情况下系统也可以提供查询服务。

集群扩容

这里新增两个新节点:端口号为6386的master和端口号为6387的slave节点。

  1. 复制并修改两个配置文件。

    使用redis6380.conf 复制出redis6386.conf 、redis6387.conf ,并修改端口号。

  2. 启动这两个节点。

    在这里先启动分布式系统,执行下列命令

    ./start-redis-cluster.sh
    

    启动这两个新节点后,他们还是孤立节点,和其他节点没有任何关系。

  3. 添加master节点

    redis-cli -c --cluster add-node 127.0.0.1:6386 127.0.0.1:6380
    

    通过命令redis-cli -c --cluster add-node {newHost}:{newPort} {existHost}:{existPort}将新节点加入到系统中,其中{newHost}:{newPort} 是新节点的地址,{existHost}:{existPort} 是原系统中任意节点地址。

    添加完成后,此时新master还没有对应的slot。

  4. 分配slot。

    由于slot数量不变,所以slot分配本质就是一个slot的移动过程。

    通过redis-cli -c --cluster reshard {existHost}:{existPort}命令开启slot分配流程。{existHost}:{existPort} 为分布式系统中的任意节点地址。

无标9题

该流程会先查询当前节点的slot的分配情况。

然后开始Q&A交互。一共询问了四个问题,这里有三个:

  • 准备移动多少slot?

  • 谁来接收移动的slot

  • 选择要移动slot的源节点。这里有以下两种方案:

    1.选择键入all,表示所有已存在的slot的节点都作为源节点,将slot进行全局大分配。
    2.选择其他部分节点作为slot源节点。将源节点的动态ID复制到这里,每个ID键入完毕后回车,然后再键入下一个源节点ID,直到最后一个键入完毕后再键入done。
    

    这里键入的是all。进行全局大分配。

    其会先检测指定的slot源节点的数据,然后指定出reshard方案。

无标10题

 这里会再进行一次Q&A交互,询问是否继续处理推荐的方案。键入yes。开始真正的全局分配,直至完成。

 此时master节点新增完成。
  1. 添加slave节点。

    先启动这个节点。

    执行命令redis-cli -c --cluster add-node {newHost}:{newPort} {existHost}:{existPort} --cluster-slave --cluster-master-id masterID 将新节点指定为master的slave。

无11标题

此时通过redis-cli -c -p 6386 cluster nodes 命令看到其已添加成功。

集群缩容

这里将slave节点6387和master节点6386从系统中删除。

  1. 删除slave节点

    执行redis-cli --cluster del-node <delHost>:<dePort> delNodeId 命令删除。

  2. 移出master的slot

    在删除一个master之前,保证该master没有分配的slot。否则无法删除。

    执行redis-cli -c --cluster reshard 127.0.0.1:6380

    可以看到6386有1999个slot,所以键入1999,然后键入要接收的master节点的id,

    然后键入6386节点(源节点)的id,然后键入done,然后键入yes,此时slot移出完成。

无标12题

  1. 删除master节点

    执行redis-cli --cluster del-node <delHost>:<dePort> delNodeId 命令删除。

    此时删除完成。

分布式系统的限制

  • 仅支持0号数据库
  • 批量操作key有限制
  • 分区仅限于key
  • 事务支持有限
  • 不支持分级管理