如何最佳地对MySQL数据库进行分片

3
我有很多用户,需要将数据库分片为n个碎片。因此,我有以下选项来继续进行操作:
  1. 按照userId模数n的操作将我的数据划分为n个碎片。例如,如果我有10个碎片,userId 1999将被发送到第9个碎片,即1999%10=9。
    问题: 这种方法的问题在于,如果未来引用的碎片数量增加,则无法保持对先前的引用。
  2. 我可以维护一个包含UserId和ShardId的表
    问题: 如果我的用户在将来增加到数十亿,我将需要共享该映射表,这似乎不是一个好的解决方案。
  3. 我可以在代码中维护静态映射,例如Shard 1中的0-10000个用户等等。
    问题:

    • 随着碎片和用户数量的增加,需要更频繁地更改代码。
    • 如果某个特定的碎片中存在大量数据的特定用户,则难以分离出该碎片。

因此,这些都是我找到的三种方法,但都存在一些问题。有没有另一种或更好的方法来分片MySQL表,可以弥补未来增加的碎片和用户数量。


可能是MySQL分片方法?的重复问题。 - Raymond Nijland
如果我的用户未来增加到数十亿,我非常怀疑,但是做梦也是很好的。 - Raymond Nijland
最好的选择是将资金投入到MySQL Cluster中 https://www.mysql.com/products/cluster/ - Raymond Nijland
1个回答

3
我更喜欢方案1和方案2的混合方式:
  1. 将 UserId 哈希为 4096 个值之一。
  2. 在一个包含分片编号的“字典”中查找该数字。

如果一个分片变得太满,则将具有某些哈希数字的所有用户迁移到另一个分片。

如果您添加了一个分片,则将其中几个哈希数字迁移到它-最好是从繁忙的分片中迁移。

这将迫使您编写用于移动用户并使其强大的脚本。一旦完成,许多其他管理任务就会变得“简单”:

  • 退役一台机器
  • 升级操作系统(逐个在分片之间进行)
  • 升级机器上的任何软件
  • 将体积庞大但不繁忙的哈希数迁移到拥有大硬盘的旧、慢分片中。同样,将小而繁忙的哈希迁移到拥有更多核心和更快磁盘的分片中。

每个分片都可以是服务器的 HA 集群(例如 Galera、Group replication 等),既可靠又可读取缩放。 (分片提供写入缩放。)

需要一种方式将字典“及时”分发给所有客户端。

如果每个哈希在三个不同的分片中都有副本,则所有这些操作都将有效运行。每个副本都在地理位置上进行了复制以增强稳健性。字典将具有四列,以说明副本的位置。在迁移期间将使用第四列。


迁移是一项繁重的操作,在生产环境中是否更可取? - Akash Kumar
1
@AkashKumar - 更好的选择是什么?如果一个分片的磁盘已满,你必须采取一些行动,而那个行动将是一个“重操作”。我建议编写一个脚本来移动一小组用户来满足这个需求,以及许多其他需求。而且你可以专注于使它变得更加“轻量化”,例如使用第四列。 - Rick James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接