提高MySql复制速度

我正在寻找如何提高一个mysql奴隶的复制速度的指针。 正常生产速度足够快,但由于某种原因,需要很长时间才能赶上。 (如果服务器被closures或复制停止了几个小时等)

一些数据:

  • 数据库大概是2TB,每天写的binlog大概是500GB。
  • 对于正常的生产使用奴隶滞后停留在0或1秒
  • 当试图追赶它接近每秒约1秒掌握。 (所以赶上10个小时需要10个小时)
  • 从站只是将数据重放为故障转移机器,没有select运行它,它应该能够取代主人,如果他死了(我们所有的东西都慢,但那是可以的)
  • 服务器在同一个物理networking中

可以做些什么来提高速度?

(是的,改善硬件是一种select,但我们希望确保在花费大量资金之前检查其他选项)

编辑:

一些数据回应@ 3molo问题:

  • 带宽使用,赶上:〜2MB / s到10MB / s,没有问题,我猜。
  • CPU使用率低,io等待时间长(从服务器只有2个CPU,占用率高达70%到85%,所以这意味着磁盘的瓶颈?
  • 内存使用量为4GB(其余部分为“caching”)。 所以我没有看到那么多潜力? (因为它只是写入负载(?))

如果瓶颈是磁盘(6磁盘RAID 10设置)除了增加RAID还有其他的select,或者我们必须去?

在赶上的时候写下这些会很有趣:

  • 使用多less带宽

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

  • 内存使用率

为了响应关于I / O等待的新信息, 对于innodb可以做很多事情,看看。 我从mysqlperformanceblog学到了很多东西。 这里有一些提示:

innodb_flush_method = O_DIRECT

“避免双重缓冲,减less交换压力,在大多数情况下,这个设置可以提高性能,但是如果没有电池备份RAIDcaching,那么写入IO可能会受到影响。

的innodb_flush_log_at_trx_commit = 2

“如果你不关心ACID,并且在完全OS崩溃的情况下可以放松最后一两秒的事务,那么设置这个值就会产生很大的影响,尤其是对于很多短的写事务来说。

那些人为我们做了WONDERS,但是缺点是你可能会丢失一些书面数据。 这是因为不是写每个logging(刷新到磁盘),而是每秒刷新一次。

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

MySQL复制速度很快,速度非常快。 它的主要限制是链路层,然后是其余的硬​​件。

在你的情况下,恢复复制可能会很快显示二进制日志或slave IO的赶上。 如果没有,请先改善您的链接。 否则,如果是SQL,那么服务器的物理限制将会根据负载的types而有所不同,在磁盘IO,RAM和CPU之间会有所不同。

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

sync_relay_log_info = 5000000

sync_master_info = 5000000

II。 使用multithreading(可能会导致更糟糕的结果)

slave_parallel_workers = 10

log_slave_updates = 1

slave_preserve_commit_order = 1

slave_parallel_type = LOGICAL_CLOCK

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

  • 对于激活 – 重新启动

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

slave_compressed_protocol = 1

  • 激活“STOP SLAVE; START SLAVE;”

IV。 对于某些环境来说,重要的是 – 中继日志文件上有很大的IO。

它甚至使一些SSD驱动器的问题,并导致它是一个硬盘的杀手。

所以,我们把所有的内存移动到内存中,并获得几倍的性能提升。

  1. 制作一个RAM驱动器

例如在/ tmp目录

编辑/ etc / fstab有类似的东西:

tmpfs / tmp tmpfs defaults,noatime,nodiratime,nosuid,nodev,mode = 1777,size = 1500M 0 0

并初始化它

mount -o remount / tmp

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

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

max_relay_log_size = 100M; #需要至lessless于空间限制的两倍

relay-log = / tmp / YOUR_HOSTNAME-relay-bin

master-info-file = /tmp/master.info

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

在添加新path语句之前,清除当前中继日志的大小并调整其大小

  1. 关机从机

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

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

由于进一步的重新启动和粗鲁的方法,以避免错误后,你可能会但可能不想长期使用这种方式(如slave-skip-errors = 1062,1032,1396)

  • 这是一个快速追赶离散案件的方法

  • 有时候这是缺乏资源的唯一途径