MySQL高级11-后台进程

一、前言

MySQL的服务实现通过后台多个线程、内存池、文件交互来实现对外服务的,不同线程实现不同的资源操作,各个线程相互协助,共同来完成数据库的服务。MySQL常用的后台线程概括如下,分为Master Thread,IO Thread,Purge Thread,Page Cleaner Thread

二、Master Thread

在MySQL中,Master Thread(主线程)是一个重要的后台线程,负责处理复制和恢复相关的任务。它是MySQL Replication(MySQL复制)架构中的核心组件之一。
  Master Thread主要的责任包括:

  • 复制事件的写入:当有新的事务被提交到主数据库时,Master Thread负责将复制事件写入到二进制日志(Binary Log)中。这些复制事件是描述对主数据库进行的数据修改操作的逻辑记录。
  • 二进制日志文件的轮询:Master Thread负责轮询二进制日志文件,以确定是否有新的复制事件添加到日志中。它会定期检查是否需要创建新的二进制日志文件,以限制单个日志文件的大小。
  • 与从数据库进行通信:Master Thread与从数据库进行网络通信,将复制事件传输给从库。它将复制事件以事件流的形式发送给从数据库,确保从数据库可以获取到主库上所有的数据更改操作。
  • 复制相关的线程管理:Master Thread管理其他复制相关的线程,如IO Thread和SQL Thread。IO Thread负责从从库读取和处理复制请求,SQL Thread负责执行复制事件。
  • Master Thread在MySQL启动时启动,并一直运行在后台,直到MySQL关闭。它是MySQL复制架构中非常重要的一部分,保证了数据的可靠复制和同步
      对于复制环境中的故障排除和监控,理解和了解Master Thread的运行和行为非常重要。例如,可以通过检查Master Thread的状态和错误日志,来了解复制是否正常工作,以及是否存在任何问题或延迟。
      总结:Master Thread是MySQL中负责处理复制和恢复任务的重要后台线程,它负责将复制事件写入到二进制日志中,并与从数据库进行通信,确保数据的可靠复制和同步。了解Master Thread的运行和行为对于复制环境的故障排除和监控非常重要。

三、IO Thread

在MySQL中,IO Thread(输入/输出线程)是复制架构中的一个核心组件。它是负责与复制的从库进行通信的后台线程,负责从从库读取并处理复制请求。在InnoDB存储引擎中大量使用了AIO异步非阻塞来处理IO请求。
  IO Thread的主要任务包括:

  • 与从库建立连接:IO Thread负责与一个或多个从库建立连接,并保持与从库的持久连接。通过这些连接,从库可以向主库发送复制请求,请求复制主库中的数据。
  • 从从库读取复制事件:一旦与从库建立了连接,IO Thread会定期从从库读取复制事件。这些复制事件是由Master Thread将主库上的数据更改操作以二进制格式写入到二进制日志中,并通过IO Thread传输给从库的。
  • 处理复制事件:IO Thread读取复制事件后,会将这些事件发送给SQL Thread处理。SQL Thread将复制事件解析并执行相应的数据更改操作,保证从库中的数据与主库保持同步。

IO Thread是在MySQL启动时启动的,并一直运行在后台,直到MySQL关闭。它与Master Thread紧密合作,共同完成复制架构中主从之间的数据传输和同步。通过IO Thread,从库能够从主库获取数据更改并进行复制,确保从库和主库之间的数据保持一致性。

IO Thread 主要负责下面IO请求的回调

使用指令: show engine innodb status; 可以查看

总结:IO Thread是MySQL复制架构中的核心组件,负责与从库建立连接,并处理从库的复制请求。它从主库读取复制事件,并将这些事件发送给SQL Thread进行处理。IO Thread在MySQL启动时启动,与Master Thread紧密合作,实现主从数据库之间的数据传输和同步。了解IO Thread的运行和行为对于复制环境的监控和故障排除非常重要。

四、Purge Thread

在MySQL中,Purge Thread(清理线程)是复制架构中的一个重要组件。它负责删除不再需要的二进制日志文件,以释放磁盘空间并维护二进制日志的大小。

Purge Thread的主要任务包括:

  • 删除过期的二进制日志:当从库成功复制了主库上的数据更改后,它会通知主库上的Purge Thread,以删除已经不再需要的二进制日志。这些已经复制到从库并且不再需要的二进制日志会占用宝贵的磁盘空间。Purge Thread会根据从库的状态信息,删除这些过期的二进制日志,并释放磁盘空间。
  • 维护二进制日志的大小:Purge Thread还负责维护和管理二进制日志的大小。它会检查当前的二进制日志文件是否已经达到了指定的大小限制。如果已经达到了限制,Purge Thread会关闭当前的二进制日志文件,并开始写入新的日志文件。旧的日志文件将被重命名和压缩,以节省磁盘空间。

Purge Thread是在MySQL启动时启动的,并一直运行在后台,直到MySQL关闭。它会定期检查并删除不再需要的二进制日志文件,以及维护二进制日志的大小。通过这些操作,在复制过程中保持磁盘空间的有效利用,并防止二进制日志文件无限增长。

总结:Purge Thread是MySQL复制架构中的一个组件,负责删除不再需要的二进制日志文件,并维护二进制日志的大小。它会根据从库的状态信息,删除已经复制到从库并且不再需要的二进制日志,并释放磁盘空间。此外,Purge Thread还会检查并维护二进制日志的大小,以防止它们无限增长。了解Purge Thread的运行和行为对于复制环境的监控和故障排除非常重要。

五、Page cleaner thread

在MySQL中,Page Cleaner Thread是InnoDB存储引擎的一个重要后台线程,用于管理和维护脏页(已被修改但尚未写入磁盘的页)的刷新工作。它在InnoDB存储引擎启动时自动启动,并持续运行以处理脏页的刷新需求。

Page cleaner thread的主要职责包括:

  • 扫描脏页:Page Cleaner Thread周期性地扫描InnoDB缓冲池,检查其中的脏页。脏页是指已被修改的页面,它们的内容需要被刷新到磁盘上的数据文件中,以确保数据的持久性。
  • 脏页刷新:当找到脏页时,Page Cleaner Thread会将这些脏页的数据写回到对应的数据文件中,使其变成干净页。这个过程称为脏页刷新。
  • 决定刷新速率:根据系统的负载情况和磁盘IO能力,Page Cleaner Thread会根据需要自动调整脏页刷新的速率,以避免对系统性能造成过大的负担。

Page Cleaner Thread的存在和正常运行对于保证数据库的数据持久性和性能起着重要作用。如果Page Cleaner Thread无法及时刷新脏页,会导致脏页积压在内存中,可能导致缓冲池不足,影响数据库性能。因此,在监控和优化MySQL性能时,需要关注Page Cleaner Thread的运行状况以及相关配置参数的调整。