RDS Read Replica Slave 上的 Mysqldump 慢了 50 倍

Mysqldump on RDS Read Replica Slave is 50x slower

我在 amazon RDS 上创建了 MySQL 数据库的只读副本。

执行以下命令时,在主服务器上执行速度非常快(半秒),但在从服务器上需要 30 秒左右。超级烦人,因为我想摆脱奴隶,这样我就不会减慢主人的速度。

mysqldump --set-gtid-purged=OFF -h myDomain.com -u dev -pmyPassword mySchema > out.sql

需要考虑三个问题。

最重要的是,由于传统的MySQL client/server 有线协议的限制,当 运行 距离数据库较远时,mysqldump 表现不佳,这不允许流水线化一系列命令。

mysqldump 实用程序不使用任何魔法来生成转储文件 -- 它向服务器发出 SQL 语句,并获取这些查询的结果以生成其输出。

因此,数据库中的每个对象(模式、table、视图、存储的 function/procedure、事件)至少需要一次往返,有时甚至不止一次。

对于每个 table,mysqldump 首先发出 SHOW CREATE TABLE t1; 然后 SELECT * FROM t1; ...所以 100 毫秒的往返时间意味着提取转储文件150 tables 意味着 150 × 2 × 0.100 = 30 秒被机器 运行ning mysqldump 和服务器之间的距离浪费了——即使table完全是空的。

不是建议,但您可以看看 mydumper,它声称能够使用多个数据库连接创建备份,在并行化,这可以通过并行化转储过程来帮助调解在命令传递给服务器和 return 传递给客户端时浪费的周期。我不知道这个代码库的质量,但像这样的东西可能会有所帮助。


接下来,您几乎总是想对 mysqldump 使用 --compress 选项。与您的假设相反,此 不会 压缩备份文件。使用此选项时生成的备份文件是相同的,但是当此功能被激活时,服务器压缩它在线路上发送到 mysqldump 的数据,并且 mysqldump 在写出之前再次解压缩数据-- 所以这个选项几乎总是会加快进程,除非机器 运行ning mysqldump 和数据库服务器通过低延迟、高带宽网络连接。由于生成的文件是相同的,因此使用此选项时不存在兼容性问题。


最后,您需要注意新创建的 RDS 服务器的一个问题,以免它影响您的基准测试。当您创建 RDS 副本时,它最初使用来自上游主实例快照的数据作为种子。在幕后,这是主硬盘驱动器的 EBS 快照,新的数据库实例由从该快照恢复的 EBS 卷支持。 EBS 卷是从快照延迟加载的,因此它们有记录在案的首次接触惩罚。此问题可能会对第一次完整备份的性能产生重大影响,但之后应该不会有任何有意义的影响。