说一说 redis 集群?

说一说 redis 集群?

1 个解决方案

AllenJiang
中间件研发,关注微信公众号 : 小哈学Java, 回复"666", 即可免费领取10G学习&面试资料

redis 集群一个提供多个 Redis(分布式)节点间共享数据的程序集。

在 redis 集群中,集群的键空间被分割为 16384 hash 个槽(slot), 集群的最大节点数量也是 16384 个。集群中各角色的关系为:cluster > node > slot > key

分片:

Redis Cluster 在设计中没有使用一致性哈希(Consistency Hashing),而是使用数据分片引入哈希槽(hash slot)来实现;一个 Redis Cluster 包含 16384(0~16383)个哈希槽,存储在 Redis Cluster 中的所有键都会被映射到这些 slot 中,集群中的每个键都属于这 16384 个哈希槽中的一个,集群使用公式 slot=CRC16(key)/16384 来计算 key 属于哪个槽,其中 CRC16(key)语句用于计算 key 的 CRC16 校验和。

按照槽来进行分片,通过为每个节点指派不同数量的槽,可以控制不同节点负责的数据量和请求数:

如上图所示,当前集群有 3 个节点,槽默认是平均分的:

节点 A (6381)包含 0 到 5499 号哈希槽.

节点 B (6382)包含 5500 到 10999 号哈希槽.

节点 C (6383)包含 11000 到 16383 号哈希槽

这种结构很容易添加或者删除节点. 比如如果我想新添加个节点 D, 我需要从节点 A, B, C 中得部分槽到 D 上. 如果我像移除节点 A, 需要将 A 中得槽移到 B 和 C 节点上, 然后将没有任何槽的 A 节点从集群中移除即可. 由于从一个节点将哈希槽移动到另一个节点并不会停止服务, 所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.

数据迁移(添加节点后,会造成数据迁移)

数据迁移可以理解为 slot(槽)和 key 的迁移,这个功能很重要,极大地方便了集群做线性扩展,以及实现平滑的扩容或缩容。

现在要将 Master A 节点中编号为 1、2、3 的 slot 迁移到 Master B 节点中,在 slot 迁移的中间状态下,slot 1、2、3 在 Master A 节点的状态表现为 MIGRATING(迁移), 在 Master B 节点的状态表现为 IMPORTING(入口)。

此时并不刷新 node 的映射关系。

IMPORTING 状态

被迁移 slot 在目标 Master B 节点中出现的一种状态,准备迁移 slot 从 Mater A 到 Master B 的时候,被迁移 slot 的状态首先变为 IMPORTING 状态。

键空间迁移

键空间迁移是指当满足了 slot 迁移前提的情况下,通过相关命令将 slot 1、2、3 中的键空间从 Master A 节点转移到 Master B 节点。此时刷新 node 的映射关系。


集群的好处?

复制和高可用,集群的节点内置了复制和高可用特性。

优势:

  • 1、节点自动发现

  • 2、slave->master 选举, 集群容错

  • 3、Hot resharding: 在线分片

  • 4、基于配置 (nodes-port.conf) 的集群管理

  • 5、客户端与 redis 节点直连、不需要中间 proxy 层.

  • 6、所有的 redis 节点彼此互联(PING-PONG 机制), 内部使用二进制协议优化传输速度和带宽.