我正在阅读有关数据库扩展的内容,并逐渐了解了分片技术。但我也读到了一致的哈希技术。那么实际的切分是如何实现的呢?我们是否像一致散列那样在环中安排节点,然后将服务器分配给环网,然后将数据分配给服务器?因为正如我所看到的,如果我的碎片数量在运行时发生了变化,而且如果没有一致的散列技术,那么它将给很多东西带来麻烦。有人能给我点光吗?
发布于 2021-02-10 08:46:22
考虑将切分作为分布式哈希表或分布式范围表的一种形式。
现在,这取决于上面的切分是做哪一个。
对于分布式哈希表,对于添加的每一个新的数据段,它都会对数据进行散列,并基于该哈希将数据定向到该机器/机器集以保持持久性。
当一个查询传入时,它会发送到所有服务器,并将结果组合在一起,并且根据查询的复杂程度,可能会发生一些后处理(因为每台机器都必须是过度选择性的,因为查询数据可能被分割到两个碎片中),然后才会发送回用户。
在这个方案中,您不需要完美的散列,因为每个数据库都是被询问的。但是,您可能希望优化一些查询,比如select * from X where id = '123'。如果您没有完美的散列,您必须问所有的切分问题,因为虽然散列现在可能不会指向它们,但当数据被添加时,它可能会指向它们。
对于分布式范围表,对于添加的每一条新数据,都会根据其所处区域的哪个部分将其发送到机器/机器集。例如,使用这种方法,1-15 ->碎片A 16-22 ->碎片B. shard可能会变得不平衡,并且有一个后台进程将大碎片分割成较小的碎片,并将一部分重新定位到一组利用率较低的机器上,这并不少见。在这个意义上,一组机器可能负责范围的许多子部分。
当一个查询出现时,它被分解成更简单的查询,而这些简单的查询只指向那些机器--如何可能有匹配的数据。但是,这些机器可能不是将结果发送回协调器,而是相互发送结果,这样就可以在适当的碎片上运行下一个子查询。最后,最终查询数据可以直接流回用户。
在此方案中,我不会将分区函数称为Hash。对于那些作为分区的一部分的属性,如果它确实存在的话,那么就有可能识别值/S可能存在的确切的碎片/S。但是对于那些不在分区中的属性,必须检查所有碎片。
当然,现实生活中的数据库比这个复杂得多。这只是一个床上时间的故事,以帮助理解正在发生的事情。一个真正的系统必须在管理事务、同步、网络等的同时做到这一点,而且速度要快。
https://softwareengineering.stackexchange.com/questions/422079
复制相似问题