gpt4 book ai didi

mysql - 使用 MySQL/InnoDB 重新平衡表分片

转载 作者:可可西里 更新时间:2023-11-01 06:33:01 25 4
gpt4 key购买 nike

我有一个巨大的 InnoDB 表(>1TB,>1B 行),我想对其进行分片:我想从那个大表中创建多个较小的独立表。

怎么做?

我已经尝试过的:

  • 通过从原始表中选择行并将它们插入分区来将行移动到分区。这需要很长时间,并且在操作期间保持行同步很困难(但似乎可以使用触发器,只要分区在同一台服务器上)。我还没有找到现成的工具来执行此操作。
  • 复制整个表,然后删除不属于分区的行。仍然很慢,特别是考虑到表格的大小。显然,这就是 MySQL Fabric 所做的。

随机的疯狂想法:

  • 离线拆分.idb文件,并将其导入服务器,但我不知道是否存在能够执行此操作的工具。

显示创建表:

CREATE TABLE `Huge` (
`account_id` int(11) NOT NULL,
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`foo` varchar(255) NOT NULL,
`bar` int(11) NOT NULL,
`baz` char(2) NOT NULL,
PRIMARY KEY (`account_id`,`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;

分片键为 account_id。主键当前为 (account_id,id),因此行按 account_id 聚类。

是否有任何工具可以自动执行此任务?有更好的方法吗?

最佳答案

“分片”是将数据(通常是一张表)拆分到多个服务器。 “分区”是在同一 服务器上将一个表拆分为多个子表。你在做什么? Fabric 进行分片。您对 .ibd 的评论暗示您正在考虑分区。

假设您要PARTITION 一个巨大的表,我需要先问为什么。这是一个严肃的问题,因为大多数(我的意思是大多数)人认为分区会神奇地产生一些好处,而实际上它不会。我相信有only 4 use cases for partitioning .您的情况是否属于其中任何一个?

另一方面,如果您想要分片,请提供 SHOW CREATE TABLE 并讨论您将在哪个列上分片。

编辑(明确目标后)

我希望你没有明确的FOREIGN KEYs;它们不适用于分区或分片。

`id` bigint(20) NOT NULL AUTO_INCREMENT,
UNIQUE KEY `id` (`id`)

有两个方面的问题。

  • 不需要使idUNIQUEAUTO_INCREMENT 的唯一要求是它是某个索引中的第一列。所以这会减轻系统的负担:

    索引(id)

  • AUTO_INCREMENT 确实适用于PARTITIONed 表,但不适用于分片表。您需要评估 id 的用途。要么它只在一个分片内是唯一的就可以,那么就没有真正的问题。如果 id 需要在所有分片中都是唯一的,那就更难了。可能唯一的解决方案是拥有一种从某些中央服务器获取 ID 的技术。但是,这会导致单点故障和瓶颈。如果您需要朝那个方向发展,我可以就如何避免这些缺点提出建议。

如何迁移到最终的分片系统?

我不建议离题到 PARTITIONing,从长远来看它不会真正有帮助。 REORGANIZE PARTITION 的成本很高——复制所有行,包括提取的行和剩余的行。 编辑:如果您确实使用了分区,请使用 pt-online-schema-change 以最短的停机时间进行拆分。

相反,我建议完善一种工具,将一个 account_id 从一个分片迁移到另一个分片。这必须是自定义代码,因为可能还有其他表(以及表之间的引用)会受到将帐户移动到不同服务器的影响。从长远来看,这对于负载平衡、硬件升级、软件升级,甚至模式更改都是有用的。当您需要更改某些内容时,使用新的操作系统/版本/模式/任何内容创建一个新的分片,并将用户迁移到它。

这个工具的简单方法是

  1. 为那个帐户“阻止”写入
  2. 将记录复制到新分片
  3. 更改看门人以了解该帐户现在位于新分片上
  4. 解锁写入
  5. 最终(和 gradually )DELETE 旧分片上的行

如果帐户“小”,这不是什么大问题。但是,如果您需要最短的停机时间(写入受阻),那么我们可以讨论更复杂的方法。

(如果您没有猜到,我已经“去过那里,做过那件事”。)

关于mysql - 使用 MySQL/InnoDB 重新平衡表分片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31076437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com