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