广东深圳网站建设方便做两个阿里网站

张小明 2026/1/1 20:20:07
广东深圳网站建设方便,做两个阿里网站,深圳百度搜索排名优化,免费心理咨询师24小时在线咨询Redis集群模式架构详解 前言 Redis 本质上是个单机服务#xff0c;一旦崩了#xff0c;服务就不可用。加几个从节点做备份可以实现高可用#xff0c;但所有节点存的都是全量数据#xff0c;无法突破单机内存瓶颈。如果想存储更多数据#xff0c;该怎么办#xff1f;这就…Redis集群模式架构详解前言Redis 本质上是个单机服务一旦崩了服务就不可用。加几个从节点做备份可以实现高可用但所有节点存的都是全量数据无法突破单机内存瓶颈。如果想存储更多数据该怎么办这就需要 Redis 集群模式了。个人主页你的主页文章目录Redis集群模式架构详解一、为什么需要集群模式二、数据分片方案演进三、哈希槽机制详解四、集群节点通信机制五、客户端请求路由六、集群扩缩容与数据迁移七、集群故障转移八、集群模式的限制九、总结一、为什么需要集群模式1.1 单机 Redis 的瓶颈Redis 将数据存储在内存中单机服务器的内存总有上限。假设一台服务器内存 64GBRedis 实际可用约 50GB当数据量超过这个限制就无法继续存储了。1.2 主从复制的局限主从复制可以实现高可用┌─────────────┐ │ Master │ ← 写入 │ (全量数据) │ └──────┬──────┘ │ 同步 ┌───────┴───────┐ ↓ ↓ ┌─────────────┐ ┌─────────────┐ │ Slave-1 │ │ Slave-2 │ ← 读取 │ (全量数据) │ │ (全量数据) │ └─────────────┘ └─────────────┘问题从节点存的是和主节点一样的全量数据加再多从节点也无法突破单机内存瓶颈。打个比方你有一本 500 页的书复印了 10 份分给 10 个人。虽然有 10 个人可以同时读这本书读性能提升但每个人手里还是完整的 500 页书的内容并没有变多。1.3 集群模式的思路既然单机内存有限那就把数据切分成多份放到多个 Redis 节点上┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ Node-A │ │ Node-B │ │ Node-C │ │ 数据分片1 │ │ 数据分片2 │ │ 数据分片3 │ └─────────────┘ └─────────────┘ └─────────────┘打个比方把 500 页的书拆成 3 本A 拿 1-170 页B 拿 171-340 页C 拿 341-500 页。这样每个人只需要保管一部分内容总容量就扩大了 3 倍。二、数据分片方案演进2.1 方案一取模分片最直观的想法对 Key 进行哈希然后对节点数取模。节点编号 hash(key) % 节点总数举个例子假设有 3 个 Redis 节点hash(order:1001) % 3 1 → 存到 Node-1 hash(order:1002) % 3 2 → 存到 Node-2 hash(order:1003) % 3 0 → 存到 Node-0致命问题扩容时数据大规模迁移假设现在要从 3 个节点扩容到 4 个节点# 扩容前 hash(order:1001) % 3 1 → Node-1 hash(order:1002) % 3 2 → Node-2 hash(order:1003) % 3 0 → Node-0 # 扩容后节点数变成4 hash(order:1001) % 4 2 → Node-2 ← 需要迁移 hash(order:1002) % 4 3 → Node-3 ← 需要迁移 hash(order:1003) % 4 1 → Node-1 ← 需要迁移几乎所有数据都需要重新分配迁移成本极高。2.2 方案二一致性哈希一致性哈希将整个哈希值空间组织成一个虚拟的圆环0 │ Node-C ──┼── Node-A ╱│╲ ╱ │ ╲ ╱ │ ╲ ╱ │ ╲ ╱ │ ╲ ╱ │ ╲ Node-B ──┴──────数据的 Key 经过哈希后落在环上某个位置然后顺时针找到第一个节点就是它应该存储的位置。优点扩容时只影响相邻节点的数据缺点节点少时数据分布不均匀数据倾斜需要引入虚拟节点来解决增加了复杂度2.3 方案三哈希槽Redis Cluster 采用Redis Cluster 没有使用一致性哈希而是引入了**哈希槽Hash Slot**的概念。核心思想在 Key 和 Node 之间加一层固定长度的中间层。Key → 哈希槽固定 16384 个 → Node为什么这样设计没有什么是加一层中间层不能解决的。既然担心节点数变化导致分片结果改变那就让公式里用于计算的值固定下来。槽位编号 CRC16(key) % 16384不管节点数怎么变16384 这个数字永远不变所以同一个 Key 计算出的槽位编号也永远不变。三、哈希槽机制详解3.1 哈希槽分配Redis Cluster 固定有16384个哈希槽编号 0-16383这些槽位会分配给集群中的各个主节点。举个例子3 个主节点的集群Node-A: 负责槽位 0 ~ 5460 5461 个槽 Node-B: 负责槽位 5461 ~ 10922 5462 个槽 Node-C: 负责槽位 10923 ~ 16383 5461 个槽3.2 Key 到槽位的映射当客户端要操作一个 Key 时1. 计算 Key 的 CRC16 值 2. 对 16384 取模得到槽位编号 3. 找到负责这个槽位的节点 4. 向该节点发送命令举个例子Key product:10086 CRC16(product:10086) 28456 槽位编号 28456 % 16384 12072 12072 在 10923~16383 范围内 → 由 Node-C 负责3.3 为什么是 16384 个槽这是一个权衡的结果槽位太少数据分布不够均匀扩容时迁移粒度太粗槽位太多每个节点需要维护的槽位信息太多节点间心跳包携带的数据量太大16384 2^14是一个比较合适的数字心跳包中槽位信息只需要 2KB16384 / 8 2048 字节即使集群有 1000 个节点每个节点平均也能分到 16 个槽3.4 Hash Tag控制 Key 的槽位分配有时候我们希望某些相关的 Key 落在同一个槽位同一个节点可以使用Hash Tag。语法Key 中用{}包裹的部分会被用来计算槽位# 这三个 Key 会落在同一个槽位 {user:1001}:name {user:1001}:age {user:1001}:email # 因为它们的 Hash Tag 都是 user:1001 槽位 CRC16(user:1001) % 16384使用场景需要对多个 Key 执行事务操作需要使用 Lua 脚本操作多个 Key需要使用 MGET/MSET 批量操作四、集群节点通信机制4.1 Gossip 协议Redis Cluster 节点之间使用Gossip 协议进行通信这是一种去中心化的协议。特点没有中心节点每个节点地位平等节点之间互相交换信息最终达到一致类似八卦传播信息会逐渐扩散到所有节点Node-A 发现 Node-D 挂了 ↓ 告诉 Node-B Node-B 知道了 ↓ 告诉 Node-C Node-C 知道了 ↓ 最终所有节点都知道 Node-D 挂了4.2 节点间通信内容每个节点会维护以下信息信息类型说明节点信息集群中所有节点的 IP、端口、状态槽位分配每个槽位由哪个节点负责故障信息哪些节点被标记为故障4.3 PING/PONG 心跳节点之间通过 PING/PONG 消息保持通信Node-A → PING → Node-B Node-B → PONG → Node-A心跳消息中携带发送节点的信息发送节点知道的部分其他节点信息随机选择槽位分配信息通过不断交换信息所有节点最终会达成一致的集群视图。五、客户端请求路由5.1 客户端如何知道数据在哪客户端首次连接集群时会通过CLUSTER SLOTS命令获取槽位分配信息127.0.0.1:7000CLUSTER SLOTS1)1)(integer)02)(integer)54603)1)192.168.1.1012)(integer)70002)1)(integer)54612)(integer)109223)1)192.168.1.1022)(integer)70013)1)(integer)109232)(integer)163833)1)192.168.1.1032)(integer)7002客户端会在本地缓存这份槽位映射表后续请求直接根据 Key 计算槽位找到对应节点。5.2 MOVED 重定向如果客户端的槽位信息过期了访问了错误的节点会收到MOVED错误# 客户端访问 Node-A但 Key 实际在 Node-C127.0.0.1:7000GET product:10086(error)MOVED12072192.168.1.103:7002MOVED 的含义12072这个 Key 对应的槽位编号192.168.1.103:7002负责这个槽位的节点地址客户端收到 MOVED 后会更新本地的槽位映射表重新向正确的节点发送请求打个比方你去政务大厅办事走错了窗口工作人员告诉你这个业务请去 3 号窗口你就去 3 号窗口下次再办同样的事就直接去 3 号窗口了。5.3 ASK 重定向ASK是另一种重定向发生在数据迁移过程中。127.0.0.1:7000GET product:10086(error)ASK12072192.168.1.103:7002ASK 与 MOVED 的区别类型含义客户端行为MOVED槽位已经永久迁移到新节点更新本地缓存后续请求直接访问新节点ASK槽位正在迁移中这个 Key 可能在新节点不更新缓存只是这一次去新节点查询ASK 的处理流程1. 客户端访问 Node-A查询 Key 2. Node-A 发现这个槽位正在迁移且本地没有这个 Key 3. Node-A 返回 ASK 重定向 4. 客户端向 Node-C 发送 ASKING 命令 5. 客户端向 Node-C 发送 GET 命令 6. Node-C 返回数据如果有的话六、集群扩缩容与数据迁移6.1 扩容流程假设原来有 3 个节点现在要加入第 4 个节点 Node-D。步骤一将新节点加入集群redis-cli --cluster add-node192.168.1.104:7003192.168.1.101:7000此时 Node-D 已经加入集群但还没有分配任何槽位。步骤二重新分配槽位redis-cli --cluster reshard192.168.1.101:7000系统会询问要迁移多少个槽位比如 4096 个迁移到哪个节点Node-D 的 ID从哪些节点迁移可以选择 all从所有节点平均迁移迁移后的槽位分布# 迁移前 Node-A: 0 ~ 5460 (5461 个槽) Node-B: 5461 ~ 10922 (5462 个槽) Node-C: 10923 ~ 16383 (5461 个槽) # 迁移后每个节点迁移约 1365 个槽给 Node-D Node-A: 1365 ~ 5460 (4096 个槽) Node-B: 6826 ~ 10922 (4097 个槽) Node-C: 12288 ~ 16383 (4096 个槽) Node-D: 0~1364, 5461~6825, 10923~12287 (4096 个槽)6.2 数据迁移过程槽位迁移时数据是怎么迁移的源节点 Node-A 目标节点 Node-D ┌─────────────┐ ┌─────────────┐ │ 槽位 0~1364 │ ──── 迁移 ────→ │ 槽位 0~1364 │ │ (迁移中) │ │ (接收中) │ └─────────────┘ └─────────────┘迁移步骤标记槽位状态源节点将槽位标记为MIGRATING迁出中目标节点将槽位标记为IMPORTING迁入中逐个迁移 Key获取源节点该槽位的所有 Key逐个将 Key 迁移到目标节点MIGRATE 命令迁移是原子操作要么成功要么失败更新槽位归属所有 Key 迁移完成后更新槽位归属信息通过 Gossip 协议通知所有节点迁移期间的请求处理客户端请求 Key-X属于正在迁移的槽位 ↓ 访问源节点 Node-A ↓ Node-A 检查本地是否有 Key-X ├── 有 → 直接返回 └── 没有 → 返回 ASK 重定向到 Node-D6.3 缩容流程缩容就是扩容的逆过程将要下线节点的槽位迁移到其他节点确认槽位迁移完成将节点从集群中移除# 迁移槽位redis-cli --cluster reshard192.168.1.101:7000# 移除节点redis-cli --cluster del-node192.168.1.101:7000node-id七、集群故障转移7.1 主从架构为了保证高可用集群中的每个主节点都应该有从节点┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ Master-A │ │ Master-B │ │ Master-C │ │ 槽位 0~5460 │ │槽位5461~10922│ │槽位10923~16383│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ ↓ ↓ ↓ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ Slave-A │ │ Slave-B │ │ Slave-C │ └─────────────┘ └─────────────┘ └─────────────┘7.2 故障检测主观下线PFAIL某个节点认为另一个节点不可用。Node-A 向 Node-B 发送 PING ↓ 超过 cluster-node-timeout 没收到 PONG ↓ Node-A 将 Node-B 标记为 PFAIL主观下线客观下线FAIL超过半数的主节点都认为某节点不可用。Node-A 标记 Node-B 为 PFAIL Node-C 标记 Node-B 为 PFAIL Node-D 标记 Node-B 为 PFAIL ↓ 超过半数主节点认为 Node-B 下线 ↓ Node-B 被标记为 FAIL客观下线 ↓ 触发故障转移7.3 故障转移过程当主节点被标记为 FAIL 后它的从节点会发起选举1. 从节点发现主节点 FAIL 2. 从节点向其他主节点发起投票请求 3. 其他主节点投票每个主节点只能投一票 4. 获得超过半数票的从节点成为新主节点 5. 新主节点接管原主节点的槽位 6. 广播通知所有节点更新配置选举优先级复制偏移量大的从节点优先数据更完整如果偏移量相同节点 ID 小的优先7.4 集群不可用的情况以下情况会导致集群不可用情况说明某个槽位没有节点负责主节点挂了且没有从节点超过半数主节点挂了无法完成故障转移投票集群处于 FAIL 状态需要人工介入修复配置项cluster-require-full-coverageyes默认任何槽位不可用整个集群都不可用no只有不可用槽位的数据无法访问其他正常八、集群模式的限制8.1 不支持跨槽位的多 Key 操作# 如果 key1 和 key2 在不同槽位以下命令会报错MGET key1 key2 MSET key1 value1 key2 value2解决方案使用 Hash Tag 让相关 Key 落在同一槽位MGET{user:1001}:name{user:1001}:age# 可以执行8.2 事务和 Lua 脚本的限制事务MULTI/EXEC和 Lua 脚本中涉及的所有 Key 必须在同一个槽位。# 如果 key1 和 key2 在不同槽位事务会失败MULTI SET key1 value1 SET key2 value2 EXEC8.3 数据库只能使用 db0单机 Redis 支持 16 个数据库db0-db15但集群模式只能使用 db0。SELECT1# 在集群模式下会报错8.4 复制结构限制不支持多层复制从节点的从节点从节点只能复制主节点8.5 Key 批量操作的性能即使使用 Hash Tag大量 Key 集中在一个槽位也会导致该节点压力过大热点问题。九、总结9.1 核心概念回顾概念说明哈希槽固定 16384 个Key 通过 CRC16 映射到槽位槽位分配每个主节点负责一部分槽位MOVED槽位已永久迁移客户端需更新缓存ASK槽位迁移中临时重定向Gossip节点间去中心化通信协议PFAIL/FAIL主观下线/客观下线9.2 集群模式 vs 主从复制 vs 哨兵特性主从复制哨兵模式集群模式数据分片❌❌✅自动故障转移❌✅✅写入扩展❌❌✅读取扩展✅✅✅存储扩展❌❌✅9.3 集群模式适用场景场景是否适合数据量超过单机内存✅ 非常适合需要高可用✅ 适合需要高写入吞吐✅ 适合大量跨 Key 操作⚠️ 需要注意 Hash Tag复杂事务操作❌ 不太适合一句话总结Redis 集群通过哈希槽实现数据分片突破单机内存限制通过主从复制实现高可用通过 Gossip 协议实现去中心化管理。是 Redis 在大规模场景下的最佳实践方案。热门专栏推荐Agent小册Java基础合集Python基础合集Go基础合集大数据合集前端小册数据库合集Redis 合集Spring 全家桶微服务全家桶数据结构与算法合集设计模式小册消息队列合集等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持文章到这里就结束了如果有什么疑问的地方请指出诸佬们一起来评论区一起讨论希望能和诸佬们一起努力今后我们一起观看感谢您的阅读如果帮助到您不妨3连支持一下创造不易您们的支持是我的动力
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站建设常用工具一个网站开发项目小组成员

Mac系统字体管理完全指南:仿宋GB2312专业配置方案 【免费下载链接】Mac安装仿宋GB2312字体 Mac安装仿宋GB2312字体本仓库提供了一个资源文件,用于在Mac系统上安装仿宋GB2312字体 项目地址: https://gitcode.com/Resource-Bundle-Collection/c237d …

张小明 2026/1/1 20:18:26 网站建设

武进网站建设价格wordpress导航页面模板下载地址

字符串 String 1. 特性介绍 String 位于Java.lang包中,无需导包 String类由fianl修饰,表示不能被修改,不能被继承 String类构建的对象不可在被修改当使用一个字面量给字符串赋值时,首先会去字符串常量池中检测是否存在 如果存在&a…

张小明 2026/1/1 20:17:52 网站建设

专业企业网站建设定制wordpress文档可以下载吗

FaceFusion镜像支持GPU显存超分技术 在生成式AI席卷内容创作领域的今天,人脸替换(Face Swapping)早已不再是影视特效工作室的专属工具。从短视频平台上的趣味换脸滤镜,到专业级影视后期制作,这类技术正以前所未有的速度…

张小明 2026/1/1 20:16:44 网站建设

网站制作方案报价网站域名不合法

还在为暗黑破坏神2单机模式的各种限制而烦恼吗?PlugY生存套件作为暗黑2最经典的功能增强工具,为单机玩家带来了革命性的游戏体验升级。这款免费的插件通过无限储物、全符文解锁等强大功能,让您的单机冒险焕然一新。 【免费下载链接】PlugY Pl…

张小明 2026/1/1 20:16:11 网站建设

html5网站建设中对企业网站的印象

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

张小明 2026/1/1 20:15:02 网站建设

如何做翻唱网站动漫设计与制作专业就业方向

利用.NET Core构建应用程序 1. .NET Core概述 .NET Core 是一个开源框架(托管在 GitHub 上,链接为 https://github.com/dotnet/core),由微软发布并由 .NET 社区维护,用于为 Windows、Linux 和 macOS 构建跨平台应用程序。你可以从微软官方的 .NET Core 网站(https://ww…

张小明 2026/1/1 20:14:28 网站建设