[英]Best way to shard Mysql database
我有大量的用户,因此需要将数据库分片为n个分片。 因此,要进行此操作,我有以下选择-
将我的数据划分为n个分片,基于userId模数n操作。 即如果我有10个分片,则userId 1999将发送到1999%10 =第9个分片
问题 -这种方法的问题是,如果将来参考以前的分片数量增加,将无法维持。
我可以使用UserId和ShardId维护一个表
问题-如果我的用户将来增加到数十亿,我将需要共享此映射表,这似乎不是一个好的解决方案。
我可以在碎片1等中的0-10000之类的代码中维护静态映射。
问题-
因此,这是我可以找到的三种方法,但是都存在一些问题。 分片MySQL表的替代方法或更好的方法是,将来可以补偿增加的分片和用户数量。
我更喜欢1和2的混合体:
如果一个分片太满,则将具有某个哈希值的所有用户迁移到另一个分片。
如果添加了分片,请向其迁移一些哈希数-最好从繁忙的分片开始。
这迫使您编写用于移动用户的脚本,并使其健壮。 一旦有了这些,许多其他管理任务就会变得“简单”:
每个分片可以是服务器的HA群集(Galera,组复制等),以实现可靠性和读取扩展。 (着色使您可以进行写缩放。
将需要一种将词典“立即”分发给所有客户端的方法。
例如,如果您为HA分配了3个不同的分片中的每个散列,则所有这些工作都很好。 3个中的每个都将位于地理位置以提高鲁棒性。 该词典将有4列来说明副本的位置。 迁移期间将使用第4个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.