高层数据库分片的概念是有意义的,分割数据库节点,这样就没有一个节点负责所有持久数据。然而,我对“碎片”的构成有点困惑。它是跨分片复制整个表,还是通常只复制一个表?
例如,如果我们以 Twitter 为例,在最基本的层面上,我们需要一个用户和一个推文表。如果我们根据用户 ID 进行分片,有 10 个分片,则分片函数为 userID mod 10 === 分片位置
。但这对于 tweets 表意味着什么?是单独的(单个数据库表)还是每条推文都根据创建该推文的用户 ID 在 10 个表之间划分?
如果是后者,并且假设我们对用户 ID 以外的内容进行分片,例如推文创建的时间戳,那么我们如何知道在哪里查找与用户相关的信息/em> 如果所有表都根据推文创建时间(用户对此没有概念)进行分片?
最佳答案
分片是将数据分割到多个服务器上。如何拆分的选择非常关键,并且可能是显而易见的。
乍一看,按用户 ID 分割推文听起来是正确的。但还有什么其他的东西呢?是否有任何“分组”或者您关心谁“接收”每条推文?
照片共享网站可能最好根据用户 ID 进行拆分,用户照片的元信息也与用户位于同一服务器上。 (实际照片存放在哪里是另一个讨论。)但是你会如何处理那些设法上传一百万张照片的人呢?希望这不会破坏他所在的分片上的磁盘。
一个困惑的案例是电影。你们应该在电影上分开吗?评论?撰写评论的用户?流派?
当然,“mod 10”可以方便地说明用户位于哪个分片上。也就是说,直到您需要第 11 个碎片为止!我更喜欢“散列”和“字典”之间的折衷。首先执行 mod 4096,然后在“字典”中查找将 4096 个值映射到 10 个分片。然后,编写一个强大的工具将一组用户(均具有相同的 mod-4096 值)从一个分片移动到另一个分片。从长远来看,这个工具将非常方便地处理硬件升级、软件升级、王牌大小的高音扬声器或让其他人让路等。
如果您想进一步讨论分片推文,请提供涉及的主要表。另外,如果您需要的话,我对如何为推文发布唯一的 ID 有强烈的意见。 (有一些失败的方法可以做到这一点。)
关于mysql - 数据库分片如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47613435/