• 首页
  • css3教程
  • html5教程
  • vue手册
  • php手册
  • MySQL手册
  • redis手册
  • jQuery手册
  • 复制实现细节

    MySQL复制功能是通过三个线程实现的,一个在主服务器上,两个在从服务器上:

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

      二进制日志转储线程获取主机的二进制日志上的锁,以读取要发送到从属服务器的每个事件。读取事件后,即使在将事件发送到从站之前,也会释放锁定。

    • 从属I / O线程。START SLAVE从属服务器上发出一条语句时,从属服务器会创建一个I / O线程,该线程连接到主服务器并要求其发送记录在其二进制日志中的更新。

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

      该线程的状态显示为Slave_IO_running的输出SHOW SLAVE STATUS

    • 从SQL线程。从属服务器创建一个SQL线程以读取由从属I / O线程写入的中继日志,并执行其中包含的事件。

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

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

    SHOW PROCESSLIST语句提供的信息告诉您有关复制的主服务器和从属服务器上发生了什么。有关主状态的信息,请参见“复制主线程状态”。对于从属状态,请参见“复制从属I / O线程状态”和“复制从属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信息表明所有未完成的更新已发送到从属服务器,而主服务器正在等待更多更新发生。如果Binlog Dump在主服务器上看不到线程,则表明复制未在运行;也就是说,当前没有从站连接。

    在从属服务器上,来自的输出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信息表示线程10是与主服务器进行通信的I / O线程,线程11是正在处理中继日志中存储的更新的SQL线程。在SHOW PROCESSLIST运行时,两个线程均处于空闲状态,等待进一步的更新。

    Time列中的值可以显示从属设备与主设备之间的比较时间。请参见第A.14节“ MySQL 8.0 FAQ:复制”。如果主服务器端经过了足够的时间而Binlog Dump线程上没有活动,则主服务器确定不再连接从服务器。对于任何其他客户端连接,这样做的超时取决于的值net_write_timeoutnet_retry_count;有关这些的更多信息,请参见“服务器系统变量”。

    SHOW SLAVE STATUS语句提供有关从属服务器上复制处理的其他信息。请参见“检查复制状态”。

    上篇:复制格式

    下篇:复制通道