首页 > 解决方案 > 分片Mysql数据库的最佳方法

问题描述

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

  1. 根据 userId 模数 n 操作将我的数据划分为 n 个分片。即如果我有 10 个分片 userId 1999 将被发送到 1999%10=9th 分片
    问题 - 这种方法的问题是,如果将来参考以前的分片数量增加将不会保持。

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

  3. 我可以在 Shard 1 中的 0-10000 等代码中维护静态映射,等等。
    问题-

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

所以,这些是我可以找到的三种方法,但都有一些问题。什么是对 MySQL 表进行分片的替代或更好的方法,可以弥补未来增加的分片和用户数量。

标签: mysqldatabaserelational-databasesharding

解决方案


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

  1. 将 UserId 散列为 4096 个值。
  2. 在包含分片编号的“字典”中查找该编号。

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

如果您添加一个分片,请将一些哈希数迁移到它 - 最好从繁忙的分片中迁移。

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

  • 报废一台机器
  • 升级操作系统(跨分片一个接一个)
  • 升级机器上的任何软件
  • 将一个庞大但不忙的哈希数迁移到一个旧的、缓慢的、具有大磁盘的分片。同样,将小型且繁忙的分片迁移到具有更多内核和更快磁盘的分片。

每个分片都可以是服务器的 HA 集群(Galera、Group replication 等),以实现可靠性和读取扩展。(分片给你写缩放。

需要有一种方法可以“迅速”地将字典分发给所有客户。

如果你有 3 个不同的 HA 分片中的每个散列,那么所有这些都可以很好地工作。为了稳健性,这三个中的每一个都位于地理位置。字典将有 4 列来说明副本的位置。第 4 个将在迁移期间使用。


推荐阅读