Percona XtraDB集群创建一组线程来为其操作提供服务,这些线程与现有的MySQL线程无关。有三个主要线程组:
一、Applier线程
Applier线程应用从其他节点接收的写入集。写消息直接通过gcv_recv_thread。
使用wsrep_slave_threads变量控制线程的数量。默认值是1,这意味着至少有一个wsrep applier线程存在来处理请求。
Applier线程等待一个事件,一旦它捕获到事件,它就使用普通的从应用线程路径应用它,并用wsrep-customization中继日志信息应用路径。这些线程与从属工作线程类似(但不完全相同)。
使用“ Apply and Commit Monitor ” 可以实现协调。一个事务通过两个重要的状态:APPLY和COMMIT。每个事务都向自己申请的监控器进行注册,其申请顺序已经定义。 因此,在应用此事务之前,应用所有具有小于此事务序号的序号(seqno)的事务。 commit也是这样做的(last_left> = trx_.depends_seqno())。
二、回滚线程
只有一个回滚线程在发生冲突时执行回滚。
并行执行的事务可能会发生冲突并可能需要回滚。
Applier事务总是优先于本地事务。这很自然,因为Applier事务已被群集接受,并且一些节点可能已经应用了它们。本地冲突交易仍然有一个回滚窗口。
所有需要回滚的事务都被添加到回滚队列中,并通知回滚线程。回滚线程然后迭代队列并执行回滚操作。
如果事务在节点上处于活动状态,并且节点从群集组接收到与本地活动事务冲突的事务写入集,则此类本地事务始终被视为受影响事务以回滚。
出现冲突时,事务处于提交状态或执行阶段。执行阶段的本地事务被强行kill,以等待Applier事务被允许继续进行。提交阶段的本地事务失败并出现认证错误。
三、其他线程
1、服务线程
此线程在启动时创建并用于执行辅助服务。它有两个主要功能:
在高速缓存的写入集被清除到所述级别后,它释放GCache缓冲区。
它通知群集组各个节点已提交到此级别的事务。每个节点都维护有关集群中其他节点的一些基本状态信息。收到该消息后,信息将在此本地元数据中更新。
2、接收线程
该gcs_recv_thread线程是第一个查看组中收到的所有消息的线程。
它会尝试根据收到的每条消息分配操作。它将这些消息添加到中央FIFO队列中,然后由Applier线程处理。消息可以包含不同的操作,如状态更改,配置更新,流量控制等。
一个重要的操作是处理一个写集,它实际上是将事务应用于数据库对象。
3、Gcomm连接线程
gcomm连接线程GCommConn::run_fn 用于协调低层组通信活动。把它想象成一个用于沟通的黑匣子。
4、基于动作的线程
除上述之外,还有一些线程是按需创建。SST为捐助者和joiner创建线程(最终派生出一个子进程来托管所需的SST脚本),IST创建接收者和异步发送者线程,PageStore创建后台线程以删除创建的文件。
如果启用校验和并且复制的写入集足够大,则校验和将作为单独线程的一部分完成。
四、参考链接
https://www.percona.com/doc/percona-xtradb-cluster/LATEST/manual/threading_model.html