java架构师培训-redis集群的认识

集群概念应该不陌生了,多台机器组成,用来解决像存储空间,查询速度,负载等提供一个或多个服务支持!

Redis集群是一个分布式的一种架构,支持横向扩展,也就是说之前咱们配置的LVS+keepalived需要配置好基础环境,然后加入到集群系统。现在的Redis分布式,是只需要把Redis这个集群配置到当前配置内就可以自动的去工作了~
java架构师培训

RedisCluster设计要点

在设计Redis集群时,考虑了分散和去中间件。也就是说,集群中的每个节点都是相等的关系并且相等,并且每个节点都存储自己的数据以及整个集群的状态。每个节点都连接到所有其他节点,并且这些连接保持活动状态,这确保了我们只需要连接到集群中的任何节点即可获取其他节点的数据。

那么redis是如何合理分配这些节点和数据的呢?

Redis集群不使用传统的一致性哈希来分发数据,而是使用另一种称为哈希槽的方法来分发数据。Redis集群默认分配16384个插槽。设置密钥时,我们将使用CRC16算法获取模以获取其所属的插槽,然后将此密钥分配给哈希插槽间隔中的节点。具体算法为:CRC16(key)%16384。

注意的是:必须要3个以后的主节点,否则在创建集群时会失败,我们在后续会实践到。

所以,我们假设现在有3个节点已经组成了集群,分别是:A,B,C三个节点,它们可以是一台机器上的三个端口,也可以是三台不同的服务器。那么,采用哈希槽(hashslot)的方式来分配16384  集群概念应该不陌生了,多台机器组成,用来解决像存储空间,查询速度,负载等提供一个或多个服务支持!

Redis集群是一个分布式的一种架构,支持横向扩展,也就是说之前咱们配置的LVS+keepalived需要配置好基础环境,然后加入到集群系统。现在的Redis分布式,是只需要把Redis这个集群配置到当前配置内就可以自动的去工作了~

RedisCluster设计要点

在设计Redis集群时,考虑了分散和去中间件。也就是说,集群中的每个节点都是相等的关系并且相等,并且每个节点都存储自己的数据以及整个集群的状态。每个节点都连接到所有其他节点,并且这些连接保持活动状态,这确保了我们只需要连接到集群中的任何节点即可获取其他节点的数据。

那么redis是如何合理分配这些节点和数据的呢?

Redis集群不使用传统的一致性哈希来分发数据,而是使用另一种称为哈希槽的方法来分发数据。Redis集群默认分配16384个插槽。设置密钥时,我们将使用CRC16算法获取模以获取其所属的插槽,然后将此密钥分配给哈希插槽间隔中的节点。具体算法为:CRC16(key)%16384。

注意的是:必须要3个以后的主节点,否则在创建集群时会失败,我们在后续会实践到。

所以,我们假设现在有3个节点已经组成了集群,分别是:A,B,C三个节点,它们可以是一台机器上的三个端口,也可以是三台不同的服务器。那么,采用哈希槽(hashslot)的方式来分配16384个slot的话,它们三个节点分别承担的slot区间是:

节点A覆盖0-5460;节点B覆盖5461-10922;节点C覆盖10923-16383.如下图所示:

那么,现在我想设置一个key,比如叫my_name:

setmy_namezhdya按照rediscluster的哈希槽算法:CRC16(‘my_name’)%16384=2412。那么就会把这个key的存储分配到A上了。

同样,当我连接到任何节点(A,B,C)并想要获取my_name的密钥时,我将使用此算法,然后在内部跳转至B节点以获取数据。

这种哈希槽分配方法既有优点也有缺点。优点是非常清楚。例如,我要添加一个节点D。redis群集的这种方法是从每个节点的前端到D占用一部分插槽。我将在下一个练习中进行实验。它将大致变成这样:

节点A涵盖1365-5460节点B涵盖6827-10922节点C涵盖12288-16383节点D涵盖0-1364,5461-6826、10923-12287对于删除节点也是如此。移动完成后,可以删除此节点。

所以rediscluster就是这样的一个形状:

架构原理图:

多个redis节点网络互联,数据共享。

所有的节点都是一主一从(可以是多个从),其中从不提供服务,仅作为备用(主一旦宕机,从马上顶替工作!)。

不支持同时处理多个键(如mset/mget),因为redis需要把键均匀分布在各个节点上,并发量很高的情况下同时创建键值会降低性能并导致不可预测的行为。

支持在线增加、删除节点。

客户端可以连任何一个主节点进行读写。

误区:

好多人会认为Redis集群上的数据都是一致的,大错特错!Redis上面的数据是共享式的,也就是Aserver有的Bserver不一定有。类似于Raid5,写入数据可能是A磁盘可能是B磁盘。你可以正常读取,但真正的存储位置你是不晓得在哪儿的!

推荐阅读:java架构师学习路线:分布式架构为什么需要数据中心

如果你想了解更多关于java架构师的专业知识,可以加入JAVA架构师交流群:1037935907,里面都是同行,有资源分享包括但不限于(分布式架构、高可扩展、高性能、高并 发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

猜你喜欢

转载自blog.csdn.net/weixin_49698883/article/details/113179894
今日推荐