提高 MySql 复制速度

提高 MySql 复制速度

我正在寻找有关如何提高 mysql 从属服务器复制速度的指示。它对于正常生产来说足够快,但如果由于某种原因而落后,则需要很长时间才能赶上。(如果服务器关闭或复制停止了几个小时等)

一些数据:

  • 数据库大概2TB,每天写入的binlog大概500GB。
  • 对于正常生产使用,从属滞后保持在 0 或 1 秒
  • 在尝试追赶的过程中,它以每秒 1 秒左右的速度接近掌握。(因此,追赶 10 小时需要 10 个小时)
  • 从服务器只是作为一台故障转移机器来重放数据,没有针对它运行的选择,并且如果主服务器死机,它应该能够取代主服务器(一切都很慢,但没关系)
  • 服务器位于同一物理网络中

怎样才能提高这个速度?

(是的,改进硬件是一种选择,但我们希望确保在花大钱之前检查过其他选择)

编辑:

回答@3molo 问题的一些数据:

  • 追赶时的带宽使用率:~2MB/s 到 10MB/s,我想应该没问题。
  • CPU 使用率低,但 io 等待率高(从属只有 2 个 CPU,追赶时 io 等待率约为 70% 到 85%)。所以这是否意味着瓶颈在磁盘上?
  • 内存使用量为 4GB 中的 1.5GB(其余部分为“缓存”)。所以我认为那里没有太大的潜力?(因为无论如何它只是写入负载(?))

如果瓶颈是磁盘(6 磁盘 raid 10 设置),除了增加 raid 之外还有其他选择吗?或者我们必须这样做吗?

答案1

在追赶进度的时候写下这些会很有趣:

  • 使用了多少带宽

  • CPU 利用率是多少(特别是 I/O 等待)

  • 内存使用情况

针对有关 i/o 等待过高的新信息;对于 innodb,可以做很多事情,请查看。我从 mysqlperformanceblog 学到了很多东西。以下是一些提示:

innodb_flush_method=O_DIRECT

“避免双重缓冲并减少交换压力,在大多数情况下,此设置可提高性能。不过,如果您没有电池备份的 RAID 缓存,请小心,因为写入 IO 可能会受到影响。”

innodb_flush_log_at_trx_commit = 2

“如果您不关心 ACID,并且可以在整个操作系统崩溃的情况下在最后一秒或两秒内丢失事务,请设置此值。它会产生巨大影响,尤其是对大量短写入事务。”

这些对我们来说确实很神奇,但缺点是你可能会丢失一秒钟的写入数据。这是因为你不是写入(刷新到磁盘)每条记录,而是每秒刷新一次。

您可以阅读更多内容: http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/

答案2

MySQL 复制速度非常快。它的主要限制是链路层,其次是硬件的其余部分。

就您而言,恢复复制可能会显示二进制日志或从属 IO 相当快地赶上进度。如果没有,请先改善您的链接。否则,如果是 SQL,您将受到服务器的物理限制,这将根据负载类型在磁盘 IO、RAM 和 CPU 之间有所不同。

答案3

I. 为信息文件添加小而简单的 IO 优化

sync_relay_log_info=5000000

sync_master_info=5000000

II. 使用多线程(结果可能会更糟)

从属并行工作者=10

log_slave_updates = 1 复制代码

从属保留提交顺序=1

从属并行类型=逻辑时钟

slave_pending_jobs_size_max=1047527424 # 不应小于你的 max_allowed_pa​​cket

  • 激活-重新启动

III. 如果有带宽问题,请尝试使用压缩

从属压缩协议=1

  • 用于激活“STOP SLAVE;START SLAVE;”

IV. 对于某些环境,要点是 - 中继日志文件上有大量 IO。

它甚至对一些 SSD 驱动器也造成了问题,当然对 HDD 来说更是致命的。

因此,我们只需将所有内容移至 RAM 即可获得几倍的性能提升。

  1. 制作 RAM 驱动器

例如在 /tmp 目录

编辑 /etc/fstab 使其包含类似以下内容:

tmpfs /tmp tmpfs 默认值,noatime,nodiratime,nosuid,nodev,模式=1777,大小=1500M 0 0

并初始化它

安装-o重新安装/tmp

  1. 添加至/etc/mysql/my.cnf

reply_log_space_limit=500M #保存小型 tmpfs 驱动器的所有日志文件的大小限制

max_relay_log_size=100M; # 需要至少比空间限制小两倍

中继日志 = /tmp/YOUR_HOSTNAME-relay-bin

master-info-文件 = /tmp/master.info

Relay-log-info-file = /tmp/relay-log.info

如果当前中继日志太大,则在添加新路径语句之前清除\调整大小

  1. 关闭从属

  2. 将 YOUR_HOSTNAME-relay-bin、master.info、relay-log.info 从当前位置(默认 /var/lib/mysql)移动到 /tmp

    • 不要忘记“chown mysql:mysql”该文件

您可能但可能不想长期使用这种方式,因为会导致进一步的重启和避免之后出现的错误的粗鲁方法(例如 slave-skip-errors = 1062,1032,1396)

  • 这是一种快速追赶落后案件的方法

  • 有时这是由于缺乏资源而唯一的方法

相关内容