Redis学习日记(六):Redis Cluster 集群

一、Redis Cluster 是什么?

    

Redis Cluster 是 Redis 的 分布式 解决方案,反而 Redis Sentinel 更像是 集群 的表现形式。这里有我的 Redis学习日记(四):Redis Sentinel 高可用。

那分布式和集群有什么区别呢? 

举个例子: 一家餐厅,给客人提供用餐服务,那整个用餐服务是一个大流程,需要选材,切菜,烹饪,洗碗等。 现在需要扩张,餐厅经理可以选择招全部流程都熟悉的工人,每个人都负责自己选材,切菜,烹饪等一整道流程;或者经理可以招专门的一些人去选材,一些人去专门切菜,一部分人专门烹饪,一部分人洗碗……  前者我们就可以把它认为是集群的处理模式,后者就像分布式的处理模式。

那有sentinel 保证主从复制的高可用性,为什么还要有分布式的 cluster呢?

Sentinel 有两个问题:

1、数据存储上限:单节点的数据存储量很小,如果要存储一份单节点远不能存储的数据的时候,Sentinel就存在限制。

2、请求访问上限:Sentinel 解决的 主从复制 的高可用,即使使用读写分离来提高读的并发量,但是主从复制的写入还是存在着较大的限制。

 

那 Redis Cluster 作为Redis 的分布式解决方案,它是怎么解决的上述问题的呢?

这就是 分布式 的了,我们可以想象 Redis Cluster 将整个redis 分布式的数据 均匀地分布在不同的节点上。那这也是分布式的最大难题。

如何将 这么大的数据量储存在不同的节点上 的同时 保证 读取的有效性整个分布式集群的高可用

 

那上述的 三个问题也是 下面 着重要讲的问题

 

二、数据存储

 

分布式数据存储一般有 3 种 存储方式 :

1、顺序存储

这种方法最简单,如果有 500 个数据,总4个节点,那均匀分布的话就是,0~124 节点1, 125 ~ 249 节点2, 250~374 节点3, 375~499 节点4 ,但是实际在数据分配的时候要考虑预留的空间,数据并不会这么完全,按照上述的数据分布, 如果这时只有 0~99 的数据都分布在节点1,那节点1 分布 100个,节点2,节点3,节点4都是空着的,就会造成数据的离散度低,导致数据和请求访问严重倾斜。

2、一致性哈希分区

为每一个节点分配一个 token,这些 token 组成一个哈希环, 在进行数据读写的时候 先对key 进行 hash,然后按照hash值按照顺时针找到第一个大于 hash 值的token 节点读写。好处在于 新增和删除节点 的时候只影响 token 节点的相邻节点,对其他节点无影响,但是新增和删除节点的时候也会造成数据的不完整,这时就得手动更新或者放弃这些数据。当token节点少的时候节点变化对数据造成的影响比较大,因此此种方式适合 少节点的 分布式方案。

3、虚拟槽分区

此种分区方式巧妙的运用了 哈希空间,key 映射到 sort 槽中, 节点管理槽,通过虚拟槽完成 key 在节点上的分配。

Redis学习日记(六):Redis Cluster 集群_第1张图片

这种分区方式的优点在于可以通过动态的修改 节点 与 sort槽 的映射关系达到 key 的动态迁移,如 现在节点3 宕机了,我们只需把6554~9830 均匀的分配到其他节点就可以实现节点3 的数据迁移了。

 

三、读取的有效性

我们知道了 redis cluster 怎么分布式地存储数据,那下一个问题就是怎么方便快捷的读取到这个数据。

首先我们得知道使用redis cluster 在读取数据的时候首先都得根据key的值算出 sort 的值,也就是槽,然后redis 根据这个 sort 值得到存储数据的节点取得数据。

这里有两种客户端的 读 方式:

①、傀儡客户端:

它的读取方式就是按照 cluster 的方式去读,我们通过 客户端A 连接了节点 node1 并想取 key1 的值,但是这个key1 的值通过CRC16(key)&sort 得到的sort 映射在 node2,那么客户端A就取不到值了,这时redis 会通过move 命令(???)告诉你这个sort在哪个节点,那这是这个傀儡客户端做的事就是根据这个命令去得到节点2的值(???)。这就是傀儡客户端,那它的优点就是简单,实现方便,流程就是想得到key的值,但是这个值并不在自己的节点,这时通过返回的信息去请求其他节点去得到这个值就行了。这样的结果会造成 多次取值 会加重网络请求导致读的效率降低。

②、smart客户端:

如 java 的 jedis cluster,它维护两个映射,一个是 slot 值到 jedis cluster连接池 的映射,一个是 node 到 jedis cluster连接池 的映射。如现在我们需要得到 key2 的值,通过 CRC(16)& sort 得到 key2 的slot, 通过 slot 到 node 的映射得到 节点的访问对象(如一个jedis对象)。

 

四、集群的高可用如何保证

1、Gossip消息传播协议(流言协议)

redis cluster 集群节点间通过不断的通信交换信息,一段时间后所有节点都能知道集群的所有信息,类似人之间的流言蜚语的传播。这里的消息包括节点的信息,故障转移等信息。

2、故障恢复

Redis学习日记(六):Redis Cluster 集群_第2张图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(redis)