MySQL复制-从属服务器持续落后于主服务器


12

我将MySQL-5.1.50与主从复制设置一起使用。

大多数情况下,从服务器落后于主机。

当我运行时show processlist;,没有查询花费很长时间。我也启用slow_log了。但是,它找不到任何运行缓慢的查询。

从服务器不断发出警报,提示复制时间比主服务器落后几秒钟。有时,延迟时间会增加。

我如何诊断问题的原因?

我需要紧急帮助,因为此问题在过去20天内一直持续存在。


Answers:


20

Seconds_Behind_Master真的很喜欢通过时间旅行来查看过去。

这样想:

  • 太阳与地球相距93,000,000英里
  • 光速为186,000英里/秒
  • 简单划分表明,太阳的光到达地球大约需要500秒(8分20秒)
  • 当您看着太阳时,您实际上看不到太阳。您会看到20秒前8分钟的位置。

同样,主服务器似乎正在同时处理许多查询。

您回头看从站,运行SHOW SLAVE STATUS\G,结果为200 Seconds_Behind_Master。该数字如何计算?从站的时钟时间(UNIX_TIMESTAMP(NOW())-查询的TIMESTAMP完成并记录在主站的二进制日志中的时间。

除了,还有另一项指标可供考虑Seconds_Behind_Master。该指标称为Relay_Log_Space。这表示从站上所有中继文件的所有字节之和。默认情况下,最大的单个中继日志限制为1GB。如果Relay_Log_Space小于1GB,则表明在主服务器上并行执行了许多长时间运行的查询。不幸的是,由于Replication的SQL线程具有单线程性质,因此查询在一个后面执行。

例如,假设您在主服务器上具有以下情况:

  • 慢查询日志已启用
  • 在主服务器上并行执行20个查询
  • 每个查询用时3秒
  • 每个查询都以相同的时间戳记录在主二进制日志中

当从站从其中继日志中读取这些查询并逐一处理它们时

  • 奴隶的时钟将移动
  • 20个查询中的每个查询的时间戳都是相同的
  • 差异将增加3秒才能完成查询
  • 这导致60秒 Seconds_Behind_Master

关于慢日志,long_query_time的默认值为10秒。如果您在中继日志中的所有查询少于10秒,则您将永远不会在慢查询日志中捕获任何内容。

对于主服务器和从属服务器,我都有以下建议

进一步的故障排除

如果要查看引起复制延迟的查询,请执行以下操作:

  • SHOW SLAVE STATUS\G
  • 从获取中继日志的名称 Relay_Log_File
  • STOP SLAVE;
  • START SLAVE;
  • 在OS中cd /var/lib/mysql或写入中继日志的任何地方
  • 将中继日志转储到文本文件

例如,让我们做 SHOW SLAVE STATUS\G

               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.64.51.149
                  Master_User: replicant
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000009
          Read_Master_Log_Pos: 1024035856
               Relay_Log_File: relay-bin.000030
                Relay_Log_Pos: 794732078
        Relay_Master_Log_File: mysql-bin.000009
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB: search_cache
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1024035856
              Relay_Log_Space: 794732271
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 106451149

如果我运行STOP SLAVE; START SLAVE;,则中继日志将关闭,并打开一个新的日志。但是,您想要relay-bin.000030

转储内容,如下所示:

cd /var/lib/mysql
mysqlbinlog relay-bin.000030 > /root/RelayLogQueries.txt
less /root/RelayLogQueries.txt

现在,您可以看到从站当前正在尝试处理的查询。您可以将这些查询用作调整的起点。


从v5.7开始,MySQL能够以多线程方式将更改应用于从属服务器。相关文档可以在这里找到:dev.mysql.com/doc/refman/5.7/en/replication-options-slave.html
也迪古

2

您使用哪种二进制日志格式?您正在使用ROW还是STATEMENT?
SHOW GLOBAL VARIABLES LIKE 'binlog_format';

如果您将ROW用作binlog格式,请确保所有表都具有主键或唯一键:
SELECT t.table_schema,t.table_name,engine FROM information_schema.tables t INNER JOIN information_schema .columns c on t.table_schema=c.table_schema and t.table_name=c.table_name and t.table_schema not in ('performance_schema','information_schema','mysql') GROUP BY t.table_schema,t.table_name HAVING sum(if(column_key in ('PRI','UNI'), 1,0)) =0;

如果在主服务器上执行例如一条delete语句以删除没有PK或唯一键的表上的100万条记录,则仅在主服务器侧进行一次全表扫描,而在从服务器上则不会。
当使用ROW binlog_format时,MySQL将行更改写入二进制日志(不是像STATEMENT binlog_format这样的语句),并且该更改将逐行应用于从属服务器的侧面,这意味着将进行一百万次全表扫描在从属服务器上仅反映主服务器上的一条删除语句,这会导致从属计算机滞后问题。


0

SHOW SLAVE STATUS中的seconds_behind_master值是主设备上的系统时间与从设备上的系统时间之差,该时间是在最初执行该事件时存储的,并记录在二进制日志中。

如果两个系统的时钟不同步,则落后于master的秒数将给出错误的值。


在MySQL 5.5及更早版本中,复制事件的执行在从属端是单线程的。“ SHOW FULL PROCESSLIST”中应该有两个线程以“系统用户”身份运行-一个正在接收来自主服务器的事件,另一个正在执行查询。如果从属计算机滞后,则该线程应显示当前正在执行的查询。看一看,然后查看您的磁盘/内存/ cpu统计信息以了解资源短缺情况。
Michael-sqlbot 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.