参考
https://blog.csdn.net/suixinsuoyu12519/article/details/83781543
https://blog.csdn.net/tianpeng341204/article/details/78963850
从redis 3.0之后版本支持redis-cluster集群
,Redis-Cluster采用无中心结构,每个节点保存管辖范围槽内的数据
和整个集群状态(每个节包含的槽的信息
),每个节点都和其他所有节点连接。按照槽来进行分片,通过为每个节点指派
不同数量的槽,可以控制不同节点负责的数据量和请求数。
Redis 集群没有使用一致性hash, 而是引入了哈希槽
的概念。 当前集群有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的映射关系。
复制&高可用
集群的节点内置了复制和高可用特性。
结构特点:
- 所有的redis
节点彼此互联
(PING-PONG机制),内部使用二进制协议
优化传输速度
和带宽
。 - 节点的fail是通过集群中超过半数的节点检测失效时才生效。
- 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可,由该节点重定向key值应该存放哪个节点。
- redis-cluster把所有的物理节点映射到[0-16383](2^14=16384)slot上(不一定是平均分配),cluster 负责维护node<->slot<->value。
- Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据
CRC16(key) mod 16384
的值,决定将一个key放到哪个桶中。 - slave->master 选举,集群容错。
- Hot resharding:在线分片。
Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。集群的每个节点负责一部分hash槽。这种结构很容易添加或者删除节点,并且无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态。
使用哈希槽的好处
就在于可以方便的添加或移除节点。
当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;
当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;
在这一点上,我们以后新增或移除节点的时候不用先停掉所有的 redis 服务。