docker学习(九、分布式存储亿级数据知识)

docker学习(九、分布式存储亿级数据知识)


内容整体是以Redis做分布式为例的~~~先出理论,后出实践docker操作

docker搭建Redis集群相关知识:
docker学习(九、分布式存储亿级数据知识)
docker学习(十、搭建redis集群,三主三从)
docker学习(十一、Redis集群存储数据方式)
docker学习(十二、Redis主从容错迁移)
docker学习(十三、Redis主从扩容、缩容)

一、哈希取余分区

举个例子:目前有2亿条数据存储在Redis数据库中,使用分布式多台机器存储。
如果是3台机器构成的一个集群,用户每次读写都会根据公式hash(key)%N获取到要映射的机器位置。
在这里插入图片描述

优点:
简单粗暴,直接有效,只需要预估好数据规划好节点即可。通过hash算法让固定的一部分请求落到同一台服务器上,这样就起到了负载均衡+分而治之的效果了。
缺点:
扩容或者缩减的时候,节点会有所变化,映射关系需要重新计算。取模公式N也会变化,导致数据需要重新洗牌。

二、一致性哈希算法分区

一致性哈希算法将整个哈希空间(通常是一个圆环)划分为多个虚拟节点,并将这些虚拟节点映射到物理节点上。每个物理节点负责一定范围内的哈希空间。
将所有的存储节点排列在首位相接的Hash换上,每个Key在计算Hash后会在哈希环上顺时针查找最近的虚拟节点存放。而当节点加入或退出时仅影响节点在Hash环上顺时针相邻最近的节点
在这里插入图片描述

优点:

  • 容错性:假设节点B宕机,可以看到此时只有B被重定向到C。如果一台服务器不可用,则受影响的数据仅仅是此服务器到其换空间中前一台服务器(逆时针最近的一台)之间数据,其他不会受影响
  • 扩展性:增加一个节点X,例如在AB之间,那受到影响的只有A到X之间的数据,重新把A到X的数据录入到X上即可,不会导致hash取余全部数据重新洗牌。

总结起来就是加入和删除节点只影响哈希环顺时针方向的相邻节点,对其他节点无影响。

缺点:

  • Has环节点太少时,容易因为节点分布不均匀导致数据倾斜(被缓存的对象大部分集中在了某一台服务器上)问题。

数据的分布和节点位置有关,节点不均匀时,数据在进行存储时也可能达不到均匀分布的效果。

三、哈希槽分区(重点)

哈希槽实质是一个数组[0, 2 14 − 1 2^{14} -1 2141]形成的hash slot空间。
在这里插入图片描述

作用:
解决均匀分配问题,在数据和节点之间又加了一层,把这个层叫做哈希槽(slot),用于管理数据和节点之间的关系,现在相当于节点上放的是槽里放的是数据

  • 槽解决的是粒度问题,相当于把粒度变大,便于移动数据。
  • 哈希解决的是映射问题,使用key的哈希值来计算所在的槽,便于数据分配。

槽的个数:
一个集群只能有16384个槽,编号0~16383(0 ~ 2 14 − 1 2^{14} -1 2141)。

解决槽和节点的关系:
可以直接指定槽的编号分配给集群的某个主节点。

解决数据移动问题:
对key求哈希值,然后对16384取余,余数是几就落入对应的槽里。slot=CRC16(key)%16384。以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样移动数据问题就解决了。
在这里插入图片描述

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈年小趴菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值