【问题标题】:Randomising database for insert用于插入的随机数据库
【发布时间】: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


【解决方案1】:

当使用 MD5 来确定分片时,没有冲突的风险:如果发生冲突,那么它只会在同一个分片中结束。 MD5 不是该分片中的密钥(因此这是消除冲突风险的地方)。

这种分片方式的主要问题是分片的数量是固定的,所以最终性能可能是个问题(重新分配一个运行环境并不容易,所以在这种设计中你仍然依赖于更快的机器如果增长超过预期)。

【讨论】:

  • 还值得注意的是,当 MD5-ing 字符串数据发生冲突的可能性低到几乎不存在时,即使按照一般的哈希冲突标准。
猜你喜欢
  • 2013-05-29
  • 1970-01-01
  • 2011-01-30
  • 2011-06-03
  • 2014-01-24
  • 2015-08-15
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多