我们创建了一个新的 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秒执行相同的命令!!!
我们看到发生了以下情况:
- Master执行命令(非常快)
- 从属读取 binlog(
Read_Master_Log_Pos
增长非常缓慢)。Glances 显示网络吞吐量为 +/- 600kbps - 当
Read_Master_Log_Pos
与主人相同时Position
,Relay_Log_Pos
奴隶的增加。 - 从属设备的 CPU 一秒钟左右跳到 100%
- 从属服务器现在包含与主服务器相同的数据。
我们已经仔细检查过,但我们的磁盘 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