小程序三方平台开发: 解析小程序开发的未来趋势和机遇
1160
2022-10-13
分布式数据分区和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
3、槽(slot)
cluster addslots
4、键
cluster keyslot
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~