暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

17.2.1 Replication Implementation Details

原创 由迪 2020-03-03
902

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

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

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

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

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

该线程的状态被示出为 Slave_IO_running在输出 SHOW SLAVE STATUS或作为 Slave_running在的输出SHOW STATUS。

从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信息表明所有未完成的更新已发送到从属服务器,而主服务器正在等待更多更新发生。如果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 5.6 FAQ:复制”。如果主服务器端经过了足够的时间而Binlog Dump线程上没有活动,则主服务器确定不再连接从服务器。对于任何其他客户端连接,这样做的超时取决于的值 net_write_timeout和 net_retry_count; 有关这些的更多信息,请参见第5.1.7节“服务器系统变量”。

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论