mysql 8.0 复制 io_thread 无法跟上

mysql 8.0 复制 io_thread 无法跟上

我们创建了一个新的 MySQL 8.0 集群。我们的服务器正在运行 ubuntu 18.04。
我们正在运行percona-server-server 8.0.18-9-1.bionic amd64

然而,我们存在的问题是,从属设备无法跟上主设备的步伐(io_thread)。

我们的新集群包含一个主集群和一个从集群。

服务器具有以下规格: https://www.hetzner.com/dedicated-rootserver/ex52

Sysctl 设置:https://pastebin.com/wuZZAWqW

MySQL 从服务器变量:https://pastebin.com/0tJcCnbR

如果我们测试网络连接,速度可以达到 1 Gbps。因此网络应该不是问题。

写入磁盘和从磁盘读取(nvme ssd)的速度非常快。当我们使用 dd 进行测试时,速度超过了 1Gbps。

CPU 较低。IO 等待较低。但是,我们的从属设备无法跟上主设备的速度。

示例:我们将新的时区数据导入到主数据中:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql

执行此命令需要1.6秒(加载 mysql_tzinfo_to_sql 命令输出的 +/- 150k 行。)

但是,如果我们检查从服务器,它只是不断地加载……似乎 io_thread 在从主服务器检索 binlog 数据时遇到了麻烦。数据进来了,但速度太慢了。

从属服务器的 sql 线程可以跟上。所以这不是问题。我们甚至尝试使用变量设置多个工作程序slave_parallel_workers,但这没有任何区别。

导入tz数据库之前的主状态:

mysql> show master status\G
*************************** 1. row ***************************
             File: mysql-bin.000007
         Position: 11732690
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 4c16dd91-62ac-11ea-bacb-96000043b9a4:1-460
1 row in set (0.00 sec)

导入tz数据库前的从属状态:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: xxx
                  Master_User: replicator
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000007
          Read_Master_Log_Pos: 11732690
               Relay_Log_File: mysql-relay.000002
                Relay_Log_Pos: 11732864
        Relay_Master_Log_File: mysql-bin.000007
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           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: 11732690
              Relay_Log_Space: 11733068
              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: 1337
                  Master_UUID: 4c16dd91-62ac-11ea-bacb-96000043b9a4
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 4c16dd91-62ac-11ea-bacb-96000043b9a4:451-460
            Executed_Gtid_Set: 4c16dd91-62ac-11ea-bacb-96000043b9a4:1-460
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
1 row in set (0.00 sec)

如您所见,从属设备现在与主设备同步(从属设备与主设备上的Read_Master_Log_Pos相同)Position

在主服务器上导入 tz 数据库后:

主人状态

*************************** 1. row ***************************
             File: mysql-bin.000007
         Position: 17598938
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 4c16dd91-62ac-11ea-bacb-96000043b9a4:1-465
1 row in set (0.00 sec)

从属状态:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Queueing master event to the relay log
                  Master_Host: xxx
                  Master_User: replicator
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000007
          Read_Master_Log_Pos: 12077595
               Relay_Log_File: mysql-relay.000002
                Relay_Log_Pos: 11733556
        Relay_Master_Log_File: mysql-bin.000007
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           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: 11733382
              Relay_Log_Space: 12077973
              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: 1337
                  Master_UUID: 4c16dd91-62ac-11ea-bacb-96000043b9a4
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 4c16dd91-62ac-11ea-bacb-96000043b9a4:451-464
            Executed_Gtid_Set: 4c16dd91-62ac-11ea-bacb-96000043b9a4:1-464
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
1 row in set (0.00 sec)

正如您在变量中看到的Read_Master_Log_Pos,从属设备就在后面。

它带走了奴隶1分28秒执行相同的命令!!!

我们看到发生了以下情况:

  1. Master执行命令(非常快)
  2. 从属读取 binlog(Read_Master_Log_Pos增长非常缓慢)。Glances 显示网络吞吐量为 +/- 600kbps
  3. Read_Master_Log_Pos与主人相同时PositionRelay_Log_Pos奴隶的增加。
  4. 从属设备的 CPU 一秒钟左右跳到 100%
  5. 从属服务器现在包含与主服务器相同的数据。

我们已经仔细检查过,但我们的磁盘 I/O 速度没有问题(主服务器和从服务器均如此)。我们尝试启用数据压缩,但没有任何效果。我们再次测试了网络速度,速度非常快。

我们使用如下命令检查了 binlog:

mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000007 | more

我们在 bin 日志中没有看到任何奇怪的东西。

我们尝试了各种设置,例如:

innodb_flush_log_at_trx_commit=2
innodb_flush_log_at_timeout=1800
innodb_flush_log_at_trx_commit= 0
innodb_flush_method=O_DIRECT_NO_FSYNC
innodb_flush_method=O_DIRECT
innodb_io_capacity=2000
...

没什么区别。有人知道我们该如何解决这个问题吗?

答案1

终于找到问题了。sync_relay_log=1问题出在设置上。禁用此选项后,速度超级快。

我们现在正在研究如何在出现意外问题时最好地配置我们的服务器:

https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-unexpected-slave-halt.html

相关内容