【发布时间】:2016-05-24 19:08:06
【问题描述】:
最后,我最近一直在阅读以下关于 Pinterest 分片的博客文章,我认为其中有一些很棒的东西 https://engineering.pinterest.com/blog/sharding-pinterest-how-we-scaled-our-mysql-fleet
我不确定的是,如何最好地决定应该在哪里插入一个全新的用户。
因此,对于那些不知道或懒得阅读上述文章的人来说,Pinterest 有许多分片,每个分片上都有许多数据库。它们根据确定分片的 64 位移位、确定表的对象类型(用户、pin 等)以及相关对象的本地自动增量 id 生成对象的 ID。现在他们尝试将别针等放在与他们所在的“板”相同的数据库中。但是对于一个全新的对象,确定它所在的“碎片”的最佳方法是什么?
对于通过 Facebook 登录的用户,他们使用模数,例如
shard = md5(“1.2.3.4") % 4096 //4096 is the number of shards
但是,如果我有一个简单的电子邮件/密码注册表单,您认为在电子邮件地址上使用类似的方法可以计算出初始分片吗?我假设在这种情况下它必须是电子邮件,否则他们将无法知道要验证日志凭据的数据库。我也知道那个帖子是 2015 年的,所以不是太旧,计算能力也很快,但是有没有比在这里使用 md5 更好的选择?我知道发生冲突的可能性很小——尤其是当我们在这里讨论对电子邮件地址进行散列时,但是否值得使用不同的算法?我基本上对在这里确定分片并找出如何返回它的最佳方法感兴趣(因此我认为它必须是电子邮件地址)
希望这一切都有意义!
(p.s 没有将这个与 Pinterest 标签一起使用,因为它看起来只是针对 api 开发人员,但如果有人认为它可能会更好地“关注”这个问题,那么请随时添加它)
【问题讨论】:
-
@NorbertvanNobelen 谢谢,为我解决了很多问题,不知道为什么我自己没有想到这一点(其中一个时刻!)如果您将此作为答案发布,我会接受它
-
这是一个智力问题吗?或者您正在构建一个需要在一台服务器之外扩展的系统?
-
2015 -- 自世纪之交以来,CPU 并没有太大改进。数据库工具没有太大变化。过去几年中唯一的重大变化是 SSD 的广泛采用。
-
1 亿封电子邮件地址可以存储在单个服务器中——可能不需要分片。 (您有可能混淆“分片”和“分区”吗?)
-
不,是碎片。这更像是一个智力问题,我知道您可以在单个服务器上存储很多内容,但这是一篇有趣的文章,我试图更深入地了解一些更精细的细节。就在这种情况下,我认为如果由于某种原因发生冲突,电子邮件将作为密钥丢失,这显然是错误的,因为这意味着它们将位于同一台服务器上,并且电子邮件是独一无二的。当然,使用 % 时会有相同的分片 ID,这就是答案中指出的那样
标签: php mysql registration sharding