写点什么

【Redis 集群原理专题】(1)介绍一下常用的 Redis 集群机制方案的原理和分析

作者:浩宇天尚
  • 2021 年 11 月 20 日
  • 本文字数:1927 字

    阅读完需:约 6 分钟

【Redis集群原理专题】(1)介绍一下常用的Redis集群机制方案的原理和分析

集群化的方案

Redis 的 Sentinel 解决了主从复制故障不能自动迁移的问题,但是主节点的写性能和存储能力依然是受到了 Redis 单机容量有限的限制,所以使用 Redis 集群去解决这个问题,将 Redis 的数据根据一定的规则分配到多台机器。

Redis 集群方案

Redis Cluster 集群模式通常具有:高可用、可扩展性、分布式、容错等特性。Redis 分布式方案一般有两种:

客户端分区方案

客户端就已经决定数据会被存储到哪个 redis 节点或者从哪个 redis 节点 读取数据。其主要思想是采用 哈希算法 将 Redis 数据的 key 进行散列,通过 hash 函数,特定的 key 会 映射 到特定的 Redis 节点上。



客户端分区方案 的代表为 Redis Sharding,Redis Sharding 是 Redis Cluster 出来之前,业界普遍使用的 Redis 多实例集群方法。Java 的 Redis 客户端驱动库 Jedis,支持 Redis Sharding 功能,即 ShardedJedis 以及 结合缓存池 的 ShardedJedisPool。

优点

不使用第三方中间件,分区逻辑可控,配置简单,节点之间无关联,容易线性扩展,灵活性强。

缺点

客户端 无法 动态增删 服务节点,客户端需要自行维护 分发逻辑,客户端之间无连接共享,会造成连接浪费。

代理分区方案

客户端发送请求到一个代理组件,代理解析客户端的数据,并将请求转发至正确的节点,最后将结果回复给客户端。


  • 优点:简化 客户端 的分布式逻辑,客户端 透明接入,切换成本低,代理的 转发 和 存储 分离。

  • 缺点:多了一层 代理层,加重了 架构部署复杂度 和 性能损耗。



代理分区 主流实现的有方案有 Twemproxy 和 Codis。

Twemproxy

Twemproxy 也叫 nutcraker,是 twitter 开源的一个 redis 和 memcache 的 中间代理服务器 程序。Twemproxy 作为 代理,可接受来自多个程序的访问,按照 路由规则,转发给后台的各个 Redis 服务器,再原路返回。Twemproxy 存在 单点故障 问题,需要结合 Lvs 和 Keepalived 做 高可用方案。



  • 优点:应用范围广,稳定性较高,中间代理层 高可用。

  • 缺点:无法平滑地 水平扩容/缩容,无 可视化管理界面,运维不友好,出现故障,不能 自动转移。

Codis

Codis 是一个 分布式 Redis 解决方案,对于上层应用来说,连接 Codis-Proxy 和直接连接 原生的 Redis-Server 没有的区别。Codis 底层会 处理请求的转发,不停机的进行 数据迁移 等工作。Codis 采用了无状态的 代理层,对于 客户端 来说,一切都是透明的。


优点

实现了上层 Proxy 和底层 Redis 的 高可用,数据分片和自动平衡,提供 命令行接口 和 RESTful API,提供 监控 和 管理 界面,可以动态 添加 和 删除 Redis 节点。

缺点

部署架构 和 配置复杂,不支持 跨机房 和 多租户,不支持 鉴权管理。

Cluster 集群方案

Cluster 模式是 Redis3.0 开始推出,由多个节点群组成的分布式服务集群,Redis 的数据分布在这些节点中。集群不需要 Sentinel 哨兵也可以完成故障自动迁移。 使用集群时需要将 redis 配置文件中的 cluster-enable 配置打开。


采⽤⽆中⼼结构,每个节点保存数据和整个集群状态, 各个节点会互相通信,采⽤gossip 协议交换节点元数据信息,每个节点都和其他所有节点连接。一个集群⾄少需要 6 个节点才可以保证⾼可⽤,即 3 主 3 从。


客户端随机地 请求任意一个 Redis 实例,然后由 Redis 将请求 转发 给 正确 的 Redis 节点。Redis Cluster 实现了一种 混合形式 的 查询路由,但并不是 直接 将请求从一个 Redis 节点 转发 到另一个 Redis 节点,而是在 客户端 的帮助下直接 重定向( redirected)到正确的 Redis 节点。


核心原理

redis cluster 集群采⽤数据分⽚中的哈希槽来进⾏数据存储与读取的,Cluster 会预分好 16384 个槽,每个节点负责其中的一部分槽位。当需要在 Redis 集群中放置⼀个数据时,Cluster 默认会根据 CRC16 算法 CRC16(key) mod 16384 的值,决定将⼀个 key 放到哪个槽位中。

常见的配置
  • cluster-enabled yes:开启集群模式(cluster)

  • cluster-config-file:该参数指定了集群配置文件的位置,记录集群节点信息。以集群模式启动时,会首先寻找是否有集群配置文件,如果有则使用文件中的配置启动,如果没有,则初始化配置并将配置保存到文件中

  • cluster-node-timeout time:节点连接超时时间

  • cluster-announce-ip ip:集群节点的 ip,当前节点的 ip

  • cluster-announce-port port:集群节点映射端⼝

优点

无中心节点,数据按照 槽 存储分布在多个 Redis 实例上,可以平滑的进行节点 扩容/缩容,支持 高可用 和 自动故障转移,运维成本低。

缺点

严重依赖 Redis-trib 工具,缺乏监控管理,需要依赖 Smart Client (维护连接,缓存路由表,MultiOp 和 Pipeline 支持)。


  • Failover 节点的 检测过慢,不如 中心节点 ZooKeeper 及时。

  • Gossip 消息具有一定开销。

  • 无法根据统计区分 冷热数据。



发布于: 1 小时前阅读数: 4
用户头像

浩宇天尚

关注

🏆 InfoQ写作平台-签约作者 🏆 2020.03.25 加入

【个人简介】酷爱计算机技术、醉心开发编程、喜爱健身运动、热衷悬疑推理的”极客狂人“ 【技术格言】任何足够先进的技术都与魔法无异 【技术范畴】Java领域、Spring生态、MySQL专项、APM专题及微服务/分布式体系等

评论

发布
暂无评论
【Redis集群原理专题】(1)介绍一下常用的Redis集群机制方案的原理和分析