MySQL 复制功能是使用三个主线程实现的,一个在源服务器上,两个在副本服务器上:
二进制日志转储线程。 当副本连接时,源创建一个线程将二进制日志内容发送到副本。
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 线程。
副本使用两个线程将读取更新与源分离并将它们执行到独立的任务中。因此,如果应用它们的过程很慢,读取交易的任务不会减慢。例如,如果副本服务器有一段时间没有运行,它的 I/O 线程可以在副本启动时快速从源中获取所有二进制日志内容,即使 SQL 线程远远落后。如果副本在 SQL 线程执行完所有获取的语句之前停止,则 I/O 线程至少已获取所有内容,以便事务的安全副本本地存储在副本的中继日志中,以备下次执行副本开始。
slave_parallel_workers
您可以通过将系统变量设置为大于 0(默认值)的值来
为副本上的任务启用进一步并行化
。设置此系统变量后,副本会创建指定数量的工作线程来应用事务,以及一个协调器线程来管理它们。如果您使用多个复制通道,则每个通道都有此数量的线程。slave_parallel_workers
设置为大于 0 的值的副本称为多线程副本。
使用此设置,可以重试失败的事务。
NDB Cluster 目前不支持多线程副本,它会默默地忽略此变量的设置。有关更多信息,请参阅第 21.7.3 节,“NDB Cluster 复制中的已知问题”。