MySQL 复制功能使用三个主线程实现,一个在 master 服务器上,两个在 slave上:
-
Binary log 转储线程。 当 slave 连接时到 master,master 创建一个线程将二进制日志内容发送到 slave 。该线程可以在 master 的 MySQL命令行中执行
SHOW PROCESSLIST
命令,输出中标识为Binlog Dump
线程。二进制日志转储线程获取 master 二进制日志的锁,用于读取要发送到 slave 的每个事件。一旦事件被读取,锁就会被释放,甚至在事件被发送到 slave 之前。
-
Replication I/O 线程。 当在 slave 服务器上发出一条
START SLAVE
语句时, slave 会创建一个 I/O 线程,该线程连接到 master 并要求它发送记录在其二进制日志中的更新。slave 的复制 I/O 线程读取 master
Binlog Dump
线程发送的更新 (请参阅上一项)并将它们复制到包含中继日志的本地文件。在 slave 上执行
SHOW SLAVE STATUS
语句的输出中,该线程的状态显示为:Slave_IO_running
。 -
Replication SQL 线程。 slave 创建一个 SQL 线程来读取由 Replication I/O 线程写入的中继日志并执行其中包含的事务。
每个 master / slave 连接有三个主线程。具有多个 slave 的 master 为每个当前连接的 slave 创建一个二进制日志转储线程,每个 slave 都有自己的复制 I/O 和 SQL 线程。
slave 使用两个线程将读取更新与 master 分开,并将它们执行到独立的任务中。因此,如果应用它们的过程很慢,读取事务的任务不会减慢。例如,如果 slave 服务器有一段时间没有运行,它的 I/O 线程可以在 slave 启动时快速从 master 中获取所有二进制日志内容,即使 SQL 线程远远落后。如果 slave 在 SQL 线程执行完所有获取的语句之前停止,则 I/O 线程至少获取了所有内容,以便将事务的安全 slave 本地存储在 slave 的中继日志中,以备下次执行 slave 开始。
您可以通过将slave_parallel_workers
系统变量设置为大于 0 的值(默认值)来为 slave 上的任务启用进一步的并行化 。设置此系统变量后, slave 将创建指定数量的工作线程来应用事务,以及一个协调器线程来管理它们。如果您使用多个复制通道,则每个通道都有此数量的线程。与 slave slave_parallel_workers
设置为一个值大于0被称为一个多线程的复制品。通过此设置,可以重试失败的事务。