用于插入的随机化数据库

Randomising database for insert

晚上好,我最近一直在阅读以下关于 Pinterest 分片的博客 post,我认为其中有一些很棒的东西 https://engineering.pinterest.com/blog/sharding-pinterest-how-we-scaled-our-mysql-fleet

不过我不确定的是,如何最好地决定应该插入全新用户的位置。

所以对于那些不知道或懒得阅读上述文章的人来说,Pinterest 有许多分片,每个分片都有多个数据库。他们基于确定分片的 64 位移位生成对象 ID,确定对象类型(用户、pin 等)以确定 table 和相关对象的本地自动递增 ID。现在他们试图将别针等放在与他们所在的 'board' 相同的数据库中。但是对于一个全新的对象,确定它所依赖的 'shard' 的最佳方法是什么?

对于通过 Facebook 登录的用户,他们使用模数,例如

shard = md5(“1.2.3.4") % 4096 //4096 is the number of shards

但是如果我有一个简单的 email/password 注册表,您认为对电子邮件地址使用类似的方法是否可以计算出初始分片?我假设在这种情况下必须是电子邮件,否则他们将无法知道要根据哪个数据库验证日志记录凭据。我也知道 post 是从 2015 年开始的,所以不太旧并且计算能力发展很快,但是有没有比在这里使用 md5 更好的选择?我知道发生冲突的可能性很小——尤其是当我们只是在这里谈论对电子邮件地址进行哈希处理时,但是否值得使用不同的算法?我基本上对在这里确定分片并弄清楚如何返回它的最佳方法感兴趣(因此我认为它必须是电子邮件地址)

希望这一切都有意义!

(p.s 没有将此与 Pinterest 标签一起使用,因为它看起来只适用于 api 开发人员,但如果有人认为它可能会变得更好 'eyes' 在这个问题上然后随意添加它)

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

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