Multi-Threaded Slave Statistics
https://www.percona.com/blog/multi-threaded-slave-statistics/
MySQL 5.6版本后,允许你在复制的时候使用并行。这个特性被叫做Multi-Threaded Slave (MTS),你可以通过修改slave_parallel_workers 参数值大于1来启用它。
最近,一些启用了MTS的客户咨询我一些打印在error log中新信息的意思。这些错误信息类似于以下样式。
[Note] Multi-threaded slave statistics for channel '': seconds elapsed = 123; events assigned = 57345; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 0 waited (count) when Workers occupied = 0 waited when Workers occupied = 0
MySQL手册中并没这些这些统计数据的相关信息。我已经申报了一个bug咨询Oracle来添加这些统计数据的信息到MySQL手册中。提交的bug为 #85747
在他们更新文档前,我们可以使用MySQL的代码来了解这些统计数据的意义。我们也可以明白这些统计数据打印到error log的频次。研究rpl_slave.cc文件,我们可以知道,当你启用MTS,而且你的log-warnings大于1(log-error-verbosity 大于 2 for MySQL 5.7),这个打印统计数据的时间是120s。这是一个硬编码的常量。代码如下:
/*
Statistics go to the error log every # of seconds when --log-warnings > 1
*/
const long mts_online_stat_period= 60 * 2;
那它意味着120s就打印一次MTS的统计数据到 MySQL error log吗(默认使用)?答案是否。
MTS以之前提到的间隔打印统计数据依据于你slave的活动等级。以下MySQL代码判断slave的活动等级,是否打印统计数据:
if (rli->is_parallel_exec() && rli->mts_events_assigned % 1024 == 1)
以上代码可知,你需要MTS 开启,然后用1024对mts_events_assigned取模等于1,来打印统计数据。
mts_events_assigned变量存储分配给并行队列的事件数。如果您正在复制低级别的事件,或者根本不进行复制,MySQL将不会在错误日志中打印统计信息。
另一种情况,如果你您的复制正在有高数量的事件,而且mts_events_assigned 变量值增加,直到该变量被1024取模余1,MySQL几乎每120秒在错误日志中打印一次mts统计信息
你可以找到这些统计信息的解释如下(从源码中获取的信息):
- Worker queues filled over overrun level: MTS 趋向于事件在并行worker的负载均衡,此外slave_parallel_workers 决定了worker的数量。这个统计数据展示了woker的饱和度等级。如果并行worker队列接近满,则会增加此计数器并延迟复制事件,以避免达到工作队列的限制。
- Waited due to a Worker queue full: 当协调线程由于工作队列过满而必须等待时,此统计信息会增加。
- Waited due to the total size: 此统计信息显示协调线程由于达到工作队列中可用于容纳未应用事件的内存限制而休眠的次数。如果此统计信息在MySQL错误日志中打印时不断增加,则应将slave_pending_jobs_size_max变量调整为更高的值,以避免协调线程等待时间。
- Waited at clock conflicts: 在事务之间可能存在依赖关系的情况下,此统计信息显示与逻辑时间戳冲突检测和解决相对应的等待时间。
- Waited (count) when used occupied: 一个计数器,记录协调员有多少次看到worker被“足够”的任务填满。足够的定义取决于调度程序的类型(每个数据库或基于时钟)。
- Waited when workers occupied: 这些统计数据用于计算存在worker线程可用时,协调线程的等待时间,并且仅适用于提交时钟的调度。
总结
多线程从服务器是一个令人兴奋的功能,它允许您更快地复制事件,并与主实例保持同步。通过将日志警告变量更改为大于1的值,您可以从从属错误日志文件中获取有关多线程性能的信息。
翻译《原》:复制现成工作饱和度的指标,但是这个mts_events_assigned本质是个计数器,凑够120个,然后看凑够用了多久。如果事务很少,凑够1024个花了5分钟,还是会有该note。因此只在频繁报有该note时应该增加worker来处理。