晚上所有,我最近一直在阅读以下有关Pinterest分片的博文,我认为那里有一些很棒的东西https://engineering.pinterest.com/blog/sharding-pinterest-how-we-scaled-our-mysql-fleet
我不确定的是,如何最好地决定应该在哪里插入新用户。
因此,对于那些不知道或不愿意阅读上述文章的人,Pinterest会有一些分片,每个分片上都有许多数据库。它们基于64位移位生成对象的ID,这些移位确定了一个碎片,对象的类型(用户,引脚等等)以确定表格以及相关对象的本地自动增量ID。现在,他们尝试将引脚等放在与' board'相同的数据库中。他们在。但对于一个全新的对象,决定“碎片”的最佳方法是什么?它继续存在?
对于通过Facebook登录的用户,他们使用模数,例如
shard = md5(“1.2.3.4") % 4096 //4096 is the number of shards
但是,如果我有一个简单的电子邮件/密码注册表单,你认为在电子邮件地址上使用类似的方法可以用于计算初始分片吗?我认为在这种情况下它必须是电子邮件,否则他们将无法知道用于验证日志记录凭据的数据库。另外我知道这篇文章是从2015年开始的,所以不会太老,计算能力也会迅速提升,但是在这里使用md5会有更好的选择吗?我知道碰撞的可能性很小 - 特别是因为我们只是在谈论在这里散列电子邮件地址,但是否值得使用不同的算法?我基本上对在这里确定分片的最佳方法感兴趣,并想知道如何回到它(因此我认为它必须是电子邮件地址)
希望这一切都有意义!
(ps并没有把它与Pinterest标签一起使用,因为它看起来只适用于api dev,但是如果有人认为它可能会变得更好而且眼睛就会出现问题那么随意添加它)
答案 0 :(得分:1)
使用MD5确定分片时,冲突没有风险:如果发生冲突,则它最终会在同一个分片中结束。 MD5不是该分片中的关键(因此这是移除碰撞风险的地方)。
此分片方法的主要问题是分片数量是固定的,因此最终性能可能是一个问题(重新分配运行环境并不容易,因此在此设计中,您仍然依赖于更快的机器如果有更多的增长,那么预期)。