1、分布式数据存储的核心算法,数据分布的算法
①、redis cluster
a、自动将数据进行分片,每个master上放一部分数据
b、提供内置的高可用支持,部分master不可用时,还是可以继续工作的,在redis cluster架构下,每个redis要放开两个端口号,比如一个是6379,另外一个就是加10000的端口号,比如16379,16379端口号是用来进行节点间通信的,也就是cluster bus的东西,集群总线。cluster bus的通信,用来进行故障检测,配置更新,故障转移授权,cluster bus用了另外一种二进制的协议,主要用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间。
2、最老土的hash算法和弊端(大量缓存重建)
在整个设计当中:集群的主从是由随机的去选择的,由脚本里面最近的节点ip段来主从划分选的,缺点:比如突然第二台挂掉:会影响整个的缓存都会不可用了,因为是按照%来取的,这是hash方式最老土的。
3、一致性hash算法(自动缓存迁移)+虚拟节点(自动负载均衡)
比如有三个master.,通过hash算法,来把key放入到不同的位置,hash算法有很多,这时如果节点没有直接落到2上,而是落到下面的位置,这时会有一个顺时针的旋转,然后它就会落到2的位置。现在如果即使第三个master挂掉的话,数据不会全部无效。如果下次的key落到3的附近,发现第三个master挂了,无效的,它会继续旋转找到第一个。
但是这时会有热点数据的问题,可能某一个时刻,发现2里面的数据存的很多, 而1的里面没有数据。
这时redis搞了一个虚拟节点。虚拟节点去生成1的节点的快捷方式,类似于快速。
这时就给它均匀分布,这时就不会导致所有的key落在一个节点上,这时会根据虚拟节点找到真实节点去进行存储了。这就不会出现热点数据堆积的问题。这就不会导致主从的结构的数据完全失效。
4、redis cluster的hash slot算法
①、redis cluster有固定的16384个hash slot,对每个key计算CRC16值,然后对16384取模,可以获取key对应的hash slot,redis cluster中每个master都会持有部分slot,比如有3个master,那么可能每个master持有5000多个hash slot。hash slot让node的增加和移除很简单,增加一个master,就将其他master的hash slot移动部分过去,减少一个master,就将它的hash slot移动到其他master上去,移动hash slot的成本是非常低的。
②、hash环和hash slot是一样的道理,三个master把hash槽分成了三个部分。下面的hash slot是有很多的槽,我这里只是简单的画下。
③、这里还有一个机制:就是故障转移机制,如果槽所在的master挂掉了,会实现槽的转移,这就是redis集群能够做到高可用和故障转移的原理。这个比hash环设计的好一些,并且做到了槽的转移。槽的转移是很快速的,因为在一个集群中。一般 的槽是连续的,不是断开的。槽的分配尽量是均匀的。这里不会有热点的问题。因为一个master有5000个槽。