Redis集群基本概念与部署

学习前思考下面几个问题

  • 为什么要使用集群?集群的好处是?
  • 集群的部署怎样完成?其数据在写入和读取时具体流程是什么样的?
  • 集群模式,解决了哪些问题?又带来了哪些问题?

自己理解的Redis集群:

由于单例Redis的容器瓶颈,以及海量数据时代的到来,对Redis扩容成为必须要解决的问题;程序层面上,则采用Redis集群的形式,通过虚拟槽分配策略,将多个Redis服务形成一个有机的整体,从而应对海量数据的高并发的应用场景!


一:集群的基本概念

Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation)。

还有一种解释也很nice!

Redis Cluster 是 Redis 的分布式解决方案,在3.0版本正式推出,有效地解决了 Redis 分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,可以采用 Cluster 架构方案达到负载均衡的目的。(扩容是目标,负载均衡是扩容时要达到的要求,采用的是更加优越的hash算法–算法散列性更好)。

1. 集群模型

Redis(八):Redis集群概念篇

观察集群模型不难发现:任意两个节点之间均可联系(网络相同,资源共享)。 分布式框架最大的特点也是如此,去中心化,无中心节点,好处显而易见,极大地提高了服务的稳定性,数据的高可用。在好的模型(或者算法支持下)还可以实现数据(请求)的负载均衡

2. 关键性概念

2.1 分区

在数据上叫数据分布问题,在分布式架构上就是分区问题。

什么是分区?个人理解分区是将资源更好的管理,无论是依据业务关系还是非业务关系(hash分区–离散型);主要目的就是为了实现资源在分布式架构中的有效管理(用大白话说,就是建立一套行之有效的存放规则,什么资源来了,存放在哪,怎么修改怎么提取等等诸如此类。)

分区是分布式架构的根基(也是其核心的设计理念)。

顺序分区

特点: 将整个数据分散到等大小的节点数量的小块中。平均分配的特点。

如何实现节点扩展和压缩的?(待了解!)

hash分区

基于Hash算法实现的离散型分区方式,数据的存放基于Key值以及Hash算法以及分区方式的选择,而与业务层次无关。

顺序分区与hash分区的区别
分区类型 特点 优 缺 代表产品
顺序分区 分区数据与业务关联
可顺序查找
数据离散性差
访问倾斜(频率高的访问打到一个节点上) BigTable
Hbase
Hash分区 分区数据与业务无关
不可顺序查找
数据离散性好
节点伸缩,导致数据迁移或者丢失。 Redis-Cluster
Dynamo
2.2 哈希分区

常见的分区形式:

1. 节点取余分区
  • 平均分配节点的分区空间;
  • 计算方式:Hash(Key)%N
  • 对存入数据的key值,hash后用节点数量进行取余!来确定其存储在哪个节点。
  • 缺点: 从计算方式不难看出,当增加或减少节点时,映射的分区空间(节点)也发生改变,这也就导致了节点与节点之间的数据迁移,也可能发生数据丢失
2. 一致性Hash分区
  • 概括成一句话就是:每个节点会分配到一个Token,该Token的值在0-232之间,Token之间按照值大小形成一个Token闭环,数据插入时,根据k的hash值对232进行取模,将该值与Token闭环比较,找到第一个大于等于该值得Token(即服务节点),将数据存入。
  • 该方式的优点:节点与节点之间隔离性强—即当节点扩容或压缩时,只会影响到扩容位置(压缩位置)前后两个节点的数据存储(发生数据迁移);而对其他节点无影响。
  • 缺点:若hash算法的散列性不佳,或者说数据偏向性太强,会导致某一节点压力过大(即数据绝大多数都存放到分布式服务中的某一节点)。
3. 虚拟槽分区
  • Redis-Cluster 选取的分区方式
  • 该方式如何进行分区的?槽的概念?
    • :利用离散性优秀的hash算法,将数据均匀的分布在一个整数集合范围内,其中每一个整数就是一个槽
    • Redis-Cluster的槽位范围在0-2的14次幂-1之间(16383),节点分配槽位并不是数组范围,而是整数个数;也就是说如果有5个节点,每个节点的槽位大概3276个槽位,节点负责的槽位极可能不是连续,而是均衡选取(槽位),使得每个节点的存放的数据近乎相同。
    • 举例说明:加入有4个槽位(1,2,3,4),2个Redis节点(A,B);数据Key经过hash算法命中四个槽位的数量不同,槽位1:50%数据命中,槽位2:40%命中,槽位3:10%命中,槽位4:无数据命中;槽位分配策略,则会将1,4槽位作为一组,2,3槽位作为一组进行槽位分配,以保证每个节点的数据压力大致相同。
  • 节点扩容或压缩,会对所有节点的槽位进行再分配,涉及到数据的迁移操作

个人总结(带有浓重的个人色彩,希望与道友们一起更新自我的认知!):集群的关键在于资源分配,资源分配的策略,目前使用的就是分区;而分区的关键在于分区策略的选择,不同的分区策略主要考察:

  • 1:节点扩容,压缩对数据影响(迁移,丢失);
  • 2: 尽可能使数据均衡分布在每个节点(使集群性能最大化)
    • 这就牵扯到分区的算法离散性是否够好,节点模型是否合理等等一系列问题;这也是深入研究集群策略,集群方案的重点。
  • 3:这结合自己的认知,一个集群框架是否好用?性能只是一方面因素,是否方便维护;学习成本是否够低;选取的技术是否持续开源;架构的扩展性、稳定性等等因素。就像道人面试阿里(被血虐),就在面试官哪里上了一课:衡量一个算法的好坏不单单是一个性能因素,你写的算法,可读性是否够强?设计的算法是否符合当前系统设计开发要求?后期维护是否方便?该算法的延展性如何?诸如此类!面试惨败,但是道人也算体会到一个核心,看问题的角度越单一,你可选择的方式越少;降维打击总是致命的的原因,也是信息的高度不够(信息差),也可理解为看问题的角度不同,别人能从更高纬度上看问题,观察到的东西肯定比你多的多。所以看问题一定不要局限,一定要上升高度和下降高度(至于为啥下降高度啦?有兴趣的,可以看下三体,或者跟道人私下交流),只有这样,我们看到的才不是冰山一角,或者能看到冰山更大的一角。

各位道友,如果有收获!点个赞再走呗!欢迎与道人交流,指出不足之处。

Redis(八):Redis集群概念篇

相关文章: