数据库分片如何工作?

时间:2017-12-02 22:48:07

标签: mysql database sharding

高级别的DB分片概念是有意义的,分割数据库节点,因此没有一个负责所有持久数据。但是我对#34;碎片"的构成有点困惑。它是否跨分片重复整个表,或者通常只是一个表?

例如,如果我们以twitter为例,在最基本的层面上我们需要一个用户和一个推文表。如果我们根据用户ID进行分片,使用10个分片,则会导致分片函数为userID mod 10 === shard location。但是这对推文表意味着什么呢?这是单独的(单个数据库表)还是然后根据创建推文的用户ID,在10个表之间划分的每条推文?

如果是后者,并说我们在其他而不是用户ID上进行分片,那么推文创建时间戳,我们如何知道在哪里查找与用户相关的信息< / em>如果根据推文创建时间(用户没有概念)对所有表进行分片?

1 个答案:

答案 0 :(得分:1)

Sharding正在跨多个服务器拆分数据。选择如何拆分非常关键,可能显而易见。

乍一看,用户ID分割推文听起来是正确的。但还有什么其他的东西?有没有&#34;分组&#34;或者你关心谁&#34;收到&#34;每条推文?

照片共享网站最好在Userid上拆分,用户照片的元信息也与用户在同一台​​服务器上。 (实际照片的实际位置是另一个讨论。)但是如果有人设法上传了一百万张照片,你会怎么做?希望在他所使用的任何一个碎片上不会炸掉磁盘。

一个凌乱的案例是电影。你应该拆分电影吗?评论?写评论的用户?流派?

当然,&#34; mod 10&#34;方便说出用户所在的分片。也就是说,直到你需要第11个碎片!我更喜欢在&#34;哈希&#34;之间做出妥协。和&#34;字典&#34;。首先做mod 4096,然后在字典中查找&#39;将4096个值映射到10个分片。然后,编写一个强大的工具,将一组用户(都具有相同的mod-4096值)从一个分片移动到另一个分片。从长远来看,这个工具将非常方便地处理硬件升级,软件升级,特朗普大小的推特,或者让其他人不在他们的路上等等。

如果您想进一步讨论分片推文,请提供所涉及的主要表格。另外,如果你需要的话,我对你如何为推文发出独特的ID有强烈的意见。 (有惨败的方法。)