1. 为什么要有集群
随着业务规模增长,存储在redis的业务数据规模和访问QPS也会随着变大,。为了应对业务增长,最直接的方式就是换配置更高的机器(更大的内存更强的计算能力)。但是这种纵向扩容的方法存在诸多不足:
-
执行卡顿: 在fork 后台子进程时可能会引起卡顿(进程页表复制)。
-
复制延迟: 主从复制的带宽压力加大,从服务器的复制延迟可能上升。
-
数据集同步耗时: 当节点故障时,主服务器完成全数据集复制到其它从服务器,时间会更长。
-
恢复耗时: 发生 crash 后,重启和加载数据集到内存的恢复时间会更久。
-
机器无法无限升级: 单机 内存容量、计算处理能力和存储容量无法无限扩容
-
资源利用率低 : 机器配置升级(内存变大, cpu核数增加),核心主线程只使用单核,无法有效使用cpu。
-
资源预算: 随着内存增大,计算和网络带宽成本会上升,需要考虑整体 IT 资源预算。
-
运维难度: 运维大内存实例的复杂度和难度增加,需要优化监控方案。
为了应对这一挑战,Redis推出了Cluster集群模式。Redis Cluster实现了数据和请求的水平分片,将大规模数据集分布到多个节点上,并实现高可用的自动failover。这使得Redis能通过简单地添加更多节点来达到存储容量和处理能力的线性扩展。相比单机限制,Redis Cluster实现了在处理能力、存储容量、网络带宽等多个维度的无缝水平扩展。这为Redis处理海量KEY以及提供高并发访问提供了 POSSIBILITY。因此,Cluster集群模式成为应对大数据量和高访问流量场景的必然选择。
2. 集群工作机制
Redis Cluster 的工作机制主要包含以下几个方面:
2.1 数据分片与数据访问
数据分片
Redis Cluster 将整个数据库分散到多个节点上,每个节点负责存储部分key。具体的分片方式是通过哈希槽实现的。
-
Redis Cluster分为16384个哈希槽管理数据(0~16383)
-
计算key的crc16值 val, 再通过 val&16383 决定key属于哪个哈希槽管理
-
每个节点负责存储部分哈希槽数据
请求路由
-
客户端通过向集群任意一个节点
cluster nodes
获取哈希槽分布信息(也称路由信息, 槽在哪些节点上以及节点的ip和端口) -
在发起具体数据请求时,计算key属于那个哈希槽; 再根据路由信息可知需要访问的具体节点; 最后访问节点执行命令
请求重定向
-
假如key(槽) 已经由新节点负责, 客户端路由信息未及时更新,, 即不负责槽的节点返回
MOVED新节点ip新节点端口
回复包 -
客户端收到回复包后链接新节点访问key, 并且拉取更新路由信息
2.2 主从复制与故障转移
主从复制
为保证高可用性,每个主节点都由一个或多个从节点进行复制。如果主节点故障,从节点可以快速进行主从切换。
故障转移
集群节点使用心跳机制互相检测,如果主节点失联,从节点可以快速接替成为新的主节点。
-
节点ip1故障宕机
-
节点ip3发送ping消息给节点ip1 超过clusternodetimeout(可配置), 认为ip1 为pfail
-
节点ip3 收到节点ip5 的ping消息, p5也认为ip1为pfail, 此时符合集群大于1/2的主节点认为ip1节点pfail, 即ip 为fail, 并且消息广播给集群所有节点
-
ip2收到自己主节点fail 状态,发起failover(主从切换) 投票
-
ip3 和 ip5 收到投票请求,发送ack消息同意ip2 切换
-
ip2 收到ack, 发现大部分主节点同意它切换, 变更原来ip1负责的槽为ip(自己)负责; 并且广播upate消息通知所有节点, 切换成功
2.3 在线伸缩
可以动态添加和删除节点,数据集会自动在节点间重新分片,实现存储和计算的弹性扩容。Redis Cluster 动态添加节点的主要流程如下:
新增主节点
-
新增空节点: 启动新的Redis实例,作为空白节点加入集群。
-
主节点分配哈希槽: 根据主节点数量,对已有主节点的哈希槽进行再平衡, 计算出分配到新主节点的哈希槽。
-
数据迁移: 拥有目标槽的主节点会将这些槽对应的数据迁移到新加入的主节点(cluster setslot, migrate, restore-asking命令 )。
-
客户端感知: 客户端缓存了哈希槽映射信息,需要刷新从集群节点获取最新配置。
新增从节点
-
新增空节点: 启动新的Redis实例,作为空白节点加入集群。
-
从节点配置: 新加入的从节点的主节点,建立复制关系(cluster replicate)。
-
主从关系从新节点通过ping/pong消息扩散给集群其他节点
-
新从节点从主节点复制数据,完成主从数据同步。
-
客户端感知: 客户端缓存了哈希槽映射信息,需要刷新从集群节点获取最新配置。
2.4 读写分离
Redis 读从写主的工作方式如下:
-
主从复制:配备多个Redis从节点,与主节点建立异步复制。
-
主节点复制写入:主节点将写操作通过异步复制发送给从节点。
-
写请求路由到主节点:写命令始终路由到主节点执行。
-
读请求路由到从节点: 客户端通过路由信息识别存在从节点时,将读命令路由到从节点。
-
. 故障切换:主节点故障时,从节点提升为主节点。
读从写主可以极大程度缓解主节点的读压力,实现读写分离。同时从节点提供冗余,提高系统可用性。属于实践中较为成熟和推崇的架构模式。需要注意,由于异步复制存在小时间窗口,从节点的数据可能和主节点有细微不同。对强一致性要求非常高的场景需要慎用。
原文始发于微信公众号(吃瓜技术派):Redis集群攻略 – 这5张图让你秒懂分布式缓存背后原理
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/236019.html