mysql - 分片Mysql数据库的最佳方法
问题描述
我有大量的用户,所以我需要在 n 个分片中分片数据库。因此,要继续进行此操作,我有以下选项-
根据 userId 模数 n 操作将我的数据划分为 n 个分片。即如果我有 10 个分片 userId 1999 将被发送到 1999%10=9th 分片
问题 - 这种方法的问题是,如果将来参考以前的分片数量增加将不会保持。我可以使用 UserId 和 ShardId 维护一个表
问题- 如果我的用户将来增加到数十亿,我将需要共享这个映射表,这似乎不是一个好的解决方案。我可以在 Shard 1 中的 0-10000 等代码中维护静态映射,等等。
问题-- 随着分片的增加,用户代码需要更频繁地更改。
- 如果分片中的任何特定用户拥有大量数据,则很难将分片分离出来。
所以,这些是我可以找到的三种方法,但都有一些问题。什么是对 MySQL 表进行分片的替代或更好的方法,可以弥补未来增加的分片和用户数量。
解决方案
我更喜欢 1 和 2 的混合体:
- 将 UserId 散列为 4096 个值。
- 在包含分片编号的“字典”中查找该编号。
如果一个分片太满,将所有具有某个哈希值的用户迁移到另一个分片。
如果您添加一个分片,请将一些哈希数迁移到它 - 最好从繁忙的分片中迁移。
这迫使您为移动用户编写脚本,并使其健壮。一旦你有了它,很多其他的管理任务就变得“简单”了:
- 报废一台机器
- 升级操作系统(跨分片一个接一个)
- 升级机器上的任何软件
- 将一个庞大但不忙的哈希数迁移到一个旧的、缓慢的、具有大磁盘的分片。同样,将小型且繁忙的分片迁移到具有更多内核和更快磁盘的分片。
每个分片都可以是服务器的 HA 集群(Galera、Group replication 等),以实现可靠性和读取扩展。(分片给你写缩放。
需要有一种方法可以“迅速”地将字典分发给所有客户。
如果你有 3 个不同的 HA 分片中的每个散列,那么所有这些都可以很好地工作。为了稳健性,这三个中的每一个都位于地理位置。字典将有 4 列来说明副本的位置。第 4 个将在迁移期间使用。
推荐阅读
- java - Java的“lookAt”正则表达式函数?
- firebase - Firebase Rest Api Orderby 子项值
- javascript - 在 React Native 中将导航传递给 App.js
- ios - React Native pod 安装失败
- azure - Azure devops RestAPI System.Description
- html - 容器未水平居中
- c# - 我需要将 hangfire 记录到与 nlog 不同的 SQL 表
- r - quosures、unquoting、mutate 和 ifelse
- python - 运行代码时具有集合对象时间延迟的多线程代码
- google-chrome - 登录后如何配置 Spring Security 以使用 https 重定向?