16.2.2 复制实施详细信息

MySQL 复制功能是使用三个线程实现的,一个在复制源服务器上,另一个在副本服务器上:

  • Binlog 转储线程. 源创建一个线程,以在副本连接时将二进制日志内容发送到副本。该线程可以在源上的SHOW PROCESSLIST输出中标识为Binlog Dump线程。

二进制日志转储线程获取源的二进制日志上的锁,以读取要发送到副本的每个事件。读取事件后,即使在将事件发送到副本之前,也会释放锁定。

  • 复制 I/O 线程. 在副本服务器上发出START SLAVE语句时,副本将创建一个 I/O 线程,该线程连接到源并要求它发送记录在其二进制日志中的更新。

复制 I/O 线程读取源的Binlog Dump线程发送的更新(请参见上一项),并将它们复制到组成副本的中继日志的本地文件中。

该线程的状态在显示从站状态的输出中显示为Slave_IO_running,在SHOW STATUS的输出中显示为Slave_running

  • 复制 SQL 线程. 副本创建一个 SQL 线程以读取由复制 I/O 线程写入的中继日志,并执行其中包含的事件。

在前面的描述中,每个源/副本连接有三个线程。具有多个副本的源为每个当前连接的副本创建一个二进制日志转储线程,并且每个副本都有自己的复制 I/O 和 SQL 线程。

副本使用两个线程将读取更新从源中分离出来并执行为独立的任务。因此,如果语句执行缓慢,则读取语句的任务不会减慢。例如,如果复制服务器已经运行了一段时间,那么即使复制 SQL 线程滞后了,复制服务器启动时,其复制 I/O 线程仍可以从源中快速获取所有二进制日志内容。如果副本在复制 SQL 线程执行所有提取的语句之前停止,则 I/O 线程至少已提取所有内容,以便在副本的中继日志中本地存储该语句的安全副本,以备下次使用时执行。副本开始。

SHOW PROCESSLIST语句提供的信息告诉您有关复制的源和副本上发生了什么。有关源状态的信息,请参见第 8.14.5 节“复制源线程状态”。有关副本状态,请参见第 8.14.6 节“复制副本 I/O 线程状态”第 8.14.7 节“复制副本 SQL 线程状态”

以下示例说明了三个线程如何显示在SHOW PROCESSLIST的输出中。

在源服务器上,SHOW PROCESSLIST的输出如下所示:

mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
     Id: 2
   User: root
   Host: localhost:32931
     db: NULL
Command: Binlog Dump
   Time: 94
  State: Has sent all binlog to slave; waiting for binlog to
         be updated
   Info: NULL

在这里,线程 2 是为连接的副本服务的Binlog Dump复制线程。 State信息指示所有未完成的更新已发送到副本,并且源正在 await 更多更新发生。如果在复制源服务器上看不到Binlog Dump线程,则 table 明复制未在运行;也就是说,当前没有副本被连接。

在副本服务器上,SHOW PROCESSLIST的输出如下所示:

mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
     Id: 10
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 11
  State: Waiting for master to send event
   Info: NULL
*************************** 2. row ***************************
     Id: 11
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 11
  State: Has read all relay log; waiting for the slave I/O
         thread to update it
   Info: NULL

State信息 table 示线程 10 是与源进行通信的 I/O 线程,线程 11 是正在处理中继日志中存储的更新的 SQL 线程。在运行SHOW PROCESSLIST时,两个线程均处于空闲状态,正在 await 进一步的更新。

Time列中的值可以显示将副本与源进行比较的时间。参见第 A.14 节“ MySQL 5.7 FAQ:复制”。如果源端经过了足够的时间而Binlog Dump线程上没有活动,则源确定副本已不再连接。对于任何其他 Client 端连接,此超时取决于net_write_timeoutnet_retry_count的值;有关这些的更多信息,请参见第 5.1.7 节“服务器系统变量”

显示从站状态语句提供有关副本服务器上复制处理的其他信息。参见第 16.1.7.1 节“检查复制状态”