Percona XtraDB Cluster集群线程模型

简介:

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

目录
打赏
0
0
0
0
42
分享
相关文章
Redis的线程模型
Redis采用单线程模型确保操作的原子性,每次只执行一个操作,避免并发冲突。它通过MULTI/EXEC事务机制、Lua脚本和复合指令(如MSET、GETSET等)保证多个操作要么全成功,要么全失败,确保数据一致性。Redis事务在EXEC前失败则不执行任何操作,EXEC后失败不影响其他操作。Pipeline虽高效但不具备原子性,适合非热点时段的数据调整。Redis 7引入Function功能,支持函数复用,简化复杂业务逻辑。总结来说,Redis的单线程模型简单高效,适用于高并发场景,但仍需合理选择指令执行方式以发挥其性能优势。
58 6
MySQL底层概述—3.InnoDB线程模型
InnoDB存储引擎采用多线程模型,包含多个后台线程以处理不同任务。主要线程包括:IO Thread负责读写数据页和日志;Purge Thread回收已提交事务的undo日志;Page Cleaner Thread刷新脏页并清理redo日志;Master Thread调度其他线程,定时刷新脏页、回收undo日志、写入redo日志和合并写缓冲。各线程协同工作,确保数据一致性和高效性能。
MySQL底层概述—3.InnoDB线程模型
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
剖析 Redis List 消息队列的三种消费线程模型
Redis 列表(List)是一种简单的字符串列表,它的底层实现是一个双向链表。 生产环境,很多公司都将 Redis 列表应用于轻量级消息队列 。这篇文章,我们聊聊如何使用 List 命令实现消息队列的功能以及剖析消费者线程模型 。
163 20
剖析 Redis List 消息队列的三种消费线程模型
|
6月前
|
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
69 1
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
本文解释了Redis为什么采用单线程模型,以及为什么Redis单线程模型的效率和速度依然可以非常高,主要原因包括Redis操作主要访问内存、核心操作简单、单线程避免了线程竞争开销,以及使用了IO多路复用机制epoll。
125 0
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
STA模型、同步上下文和多线程、异步调度
【10月更文挑战第19天】本文介绍了 STA 模型、同步上下文和多线程、异步调度的概念及其优缺点。STA 模型适用于单线程环境,确保资源访问的顺序性;同步上下文和多线程提高了程序的并发性和响应性,但增加了复杂性;异步调度提升了程序的响应性和资源利用率,但也带来了编程复杂性和错误处理的挑战。选择合适的模型需根据具体应用场景和需求进行权衡。
116 0
【多线程-从零开始-捌】阻塞队列,消费者生产者模型
【多线程-从零开始-捌】阻塞队列,消费者生产者模型
94 0
开发与运维线程问题之Go语言的goroutine基于线程模型实现如何解决
开发与运维线程问题之Go语言的goroutine基于线程模型实现如何解决
86 3
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等