分布式数据分区和Redis集群理论知识

网友投稿 1086 2022-10-13

分布式数据分区和Redis集群理论知识

分布式数据分区和Redis集群理论知识

一、分布式数据分区

1、为何需要使用Redis集群

单机Redis的并发量:QPS 10万/秒(命令操作) ;但业务若需要100万/秒呢数据量:机器配置瓶颈——单机内存为16-256G,但业务数量达500G

解决问题方法:使用分布式(集群)

2、分布式数据-数据分区

1、顺序分区和哈希分区

2、数据分布对比

二、哈希分布

节点取余分区一致性哈希分区虚拟槽分区

1、节点取余(舍弃):hash(key)%nodes

1、添加一个节点

添加前:

添加后:

2、建议使用成倍扩容

添加一个节点:

多倍扩容:

2、一致性哈希

每个节点分配一个token,一个顺时针的一个规则

添加节点影响范围小,只会它邻近的节点

1、一致性哈希的特点

客户端分片:哈希+顺时针(优化取余)节点伸缩:只影响临近节点,但是还是有数据迁移(流量不均,负载不均衡)翻倍伸缩:保证最小迁移数据和负载均衡

3、虚拟哈希(槽)分布

预设虚拟槽:每个槽映射一个数据子集,一般比节点数大

良好的哈希函数:例如CRC16

服务端管理节点、槽、数据:例如Redis cluster

1、Redis虚拟槽分配(16384个槽)

算法:CRC16(key) % 16384

三、Redis Cluster理论知识

Redis Cluster的设计要点

Redis Cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个 节点,就可以获取到其他节点的数据。

1、Redis如何合理分配这些节点和数据?

Redis Cluster没有使用传统的一致性哈希来分配数据,而是采用另外一种叫 做 哈希槽(hash slot) 的方式来分配的。 redis cluster 默认分配了16384个 slot ,当我 们 set 一个 key 时,会采用 CRC16 算法来 取模 得到所属的 slot ,然后将这个 key 分到哈希槽 区间的节点上,具体算法就是: CRC16(key) % 16384 。

注意的是:必须要3个以上的主节点,否则创建集群时会失败。

三个节点

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

节点A覆盖0-5460;节点B覆盖5461-10922;节点C覆盖10923-16383。

如下图所示:

key ,比如叫 my_name

set my_name linux

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

同样,当连接(A,B,C)任何一个节点想获取 my_name 这个 key 时,也会这样的算法,然后内部 跳转到B节点上获取数据。

添加一个节点

这种哈希槽的分配方式有好也有坏,好处就是很清晰,比如想新增一个节点 D, redis cluster 的这种做法是从各个节点的前面各拿取一部分 slot 到D上,会在接下来 的实践中实验。大致就会变成这样

节点A覆盖1365-5460节点B覆盖6827-10922节点C覆盖12288-16383节点D覆盖0-1364,5461-6826,10923-12287同样删除一个节点也是类似,移动完成后就可以删除这个节点了。

redis cluster 架构形成下面图

2、常用命令

1、集群

cluster info :打印集群的信息cluster nodes :列出集群当前已知的所有节点( node),以及这些节点的相关信息。

2、节点

cluster meet :将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。cluster forget :从集群中移除 node_id 指定的节点。cluster replicate :将当前节点设置为 node_id 指定的节点的从节点。cluster saveconfig :将节点的配置文件保存到硬盘里面。

3、槽(slot)

cluster addslots [slot ...] :将一个或多个槽( slot)指派( assign)给当前节点。cluster delslots [slot ...] :移除一个或多个槽对当前节点的指派。cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。cluster setslot node :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。cluster setslot migrating :将本节点的槽 slot 迁移到 node_id 指定的节点中。cluster setslot importing :从 node_id 指定的节点中导入槽 slot 到本节点。cluster setslot stable :取消对槽 slot 的导入( import)或者迁移( migrate)。

4、键

cluster keyslot :计算键 key 应该被放置在哪个槽上。cluster countkeysinslot :返回槽 slot 目前包含的键值对数量。cluster getkeysinslot :返回 count 个 slot 槽中的键 。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:如何阅读英文文献,有哪些高效的方法或者辅助工具?
下一篇:最新OCR开源神器来了!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~