首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >切分是否需要一致的散列?

切分是否需要一致的散列?
EN

Software Engineering用户
提问于 2021-02-09 20:34:59
回答 1查看 1K关注 0票数 3

我正在阅读有关数据库扩展的内容,并逐渐了解了分片技术。但我也读到了一致的哈希技术。那么实际的切分是如何实现的呢?我们是否像一致散列那样在环中安排节点,然后将服务器分配给环网,然后将数据分配给服务器?因为正如我所看到的,如果我的碎片数量在运行时发生了变化,而且如果没有一致的散列技术,那么它将给很多东西带来麻烦。有人能给我点光吗?

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2021-02-10 08:46:22

考虑将切分作为分布式哈希表或分布式范围表的一种形式。

现在,这取决于上面的切分是做哪一个。

对于分布式哈希表,对于添加的每一个新的数据段,它都会对数据进行散列,并基于该哈希将数据定向到该机器/机器集以保持持久性。

当一个查询传入时,它会发送到所有服务器,并将结果组合在一起,并且根据查询的复杂程度,可能会发生一些后处理(因为每台机器都必须是过度选择性的,因为查询数据可能被分割到两个碎片中),然后才会发送回用户。

在这个方案中,您不需要完美的散列,因为每个数据库都是被询问的。但是,您可能希望优化一些查询,比如select * from X where id = '123'。如果您没有完美的散列,您必须问所有的切分问题,因为虽然散列现在可能不会指向它们,但当数据被添加时,它可能会指向它们。

对于分布式范围表,对于添加的每一条新数据,都会根据其所处区域的哪个部分将其发送到机器/机器集。例如,使用这种方法,1-15 ->碎片A 16-22 ->碎片B. shard可能会变得不平衡,并且有一个后台进程将大碎片分割成较小的碎片,并将一部分重新定位到一组利用率较低的机器上,这并不少见。在这个意义上,一组机器可能负责范围的许多子部分。

当一个查询出现时,它被分解成更简单的查询,而这些简单的查询只指向那些机器--如何可能有匹配的数据。但是,这些机器可能不是将结果发送回协调器,而是相互发送结果,这样就可以在适当的碎片上运行下一个子查询。最后,最终查询数据可以直接流回用户。

在此方案中,我不会将分区函数称为Hash。对于那些作为分区的一部分的属性,如果它确实存在的话,那么就有可能识别值/S可能存在的确切的碎片/S。但是对于那些不在分区中的属性,必须检查所有碎片。

当然,现实生活中的数据库比这个复杂得多。这只是一个床上时间的故事,以帮助理解正在发生的事情。一个真正的系统必须在管理事务、同步、网络等的同时做到这一点,而且速度要快。

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/422079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档