分片Mysql数据库的最佳方法

时间:2019-05-08 13:25:54

标签: mysql database relational-database sharding

我有大量的用户,因此需要将数据库分片为n个分片。因此,要进行此操作,我有以下选项-

  1. 将我的数据划分为n个分片,基于userId模数n操作。也就是说,如果我有10个分片,则userId 1999将发送到1999%10 =第9个分片
    问题- 这种方法的问题在于,如果将来无法参考以前增加的分片数量,将无法维持。

  2. 我可以维护带有UserId和ShardId的表
    问题- 如果将来我的用户增加到数十亿,我将需要共享此映射表,这似乎不是一个好的解决方案。

  3. 我可以在碎片1等中使用0-10000之类的代码维护静态映射。
    问题-

    • 随着分片的增加,需要更频繁地更改用户代码。
    • 如果分片中的任何特定用户拥有大量数据,将很难分离出分片。

因此,这是我可以找到的三种方法,但是都存在一些问题。分片MySQL表的替代方法或更好的方法是,可以在将来增加分片和用户数量的情况下进行补偿。

1 个答案:

答案 0 :(得分:1)

我更喜欢1和2的混合体。

  1. 将UserId哈希为4096个值。
  2. 在其中包含分片数字的“词典”中查找该数字。

如果一个分片太满,请将所有具有哈希值的用户迁移到另一个分片上。

如果添加了分片,请向其迁移一些哈希值-最好从繁忙的分片开始。

这迫使您编写用于移动用户的脚本,并使其健壮。一旦有了这些,许多其他管理任务就会变得“简单”:

  • 退休机器
  • 升级操作系统(跨分片一个)
  • 升级计算机上的任何软件
  • 将散列号迁移到大磁盘但不忙的旧的,缓慢的,分片的磁盘上。同样,将忙碌的小型迁移到具有更多核心和更快磁盘的分片。

每个分片可以是服务器的HA群集(Galera,组复制等),以提高可靠性和读取规模。 (着色使您可以进行写缩放。

将需要一种将字典“立即”分发给所有客户端的方法。

例如,如果您具有用于HA的3个不同分片中的每个哈希,那么所有这些方法都可以很好地工作。 3个中的每个都将位于地理位置以提高鲁棒性。该词典将有4列来说明副本的位置。迁移期间将使用第4个。

相关问题