欢送来到 GreatSQL社区分享的MySQL技术文章,如有疑难或想学习的内容,能够在下方评论区留言,看到后会进行解答
转载申明:以下文章来源于MySQL学习 ,作者八怪(高鹏)
一、两个重要的指标
这两个指标就是 replication_group_member_status 视图中的
- COUNT_TRANSACTIONS_IN_QUEUE :期待抵触验证的队列数量,实际上是进行pipeline解决的队列数量(外部示意m_transactions_waiting_certification),单位为事务数量。
- COUNT_TRANSACTIONS_REMOTE_IN_APPLIER_QUEUE:期待利用的队列数量(外部示意m_transactions_waiting_apply),单位为事务数量。
这两个值,特地是第二个咱们通常用于在单主模式下,作为判断是否提早的规范。本文就是来解释一下这两个指标具体的含意。
二、相干起源和broadcast线程
实际上这两个信息实际上次要是供流控应用的,次要来自本地节点和远端节点pipeline的信息。那么远端的信息是如何获取到的呢?实际上在咱们的MGR线程中有一个叫做Certifier_broadcast_thread::dispatcher的线程,这个线程发送本地的pipeline信息给远端节点。这个线程次要实现的工作蕴含:
30秒设置一次
设置send_transaction_identifiers = true,这个值次要用于在构建Pipeline_stats_member_message类型音讯的时候是否蕴含gtid信息。这些GTID信息次要是蕴含committed_transactions和last_conflict_free_transaction。这些信息同样会在replication_group_member_status中进行体现,也就是咱们看到的TRANSACTIONS_COMMITTED_ALL_MEMBERS和LAST_CONFLICT_FREE_TRANSACTION。
每秒进行 构建Pipeline_stats_member_message类型的音讯(type CT_PIPELINE_STATS_MEMBER_MESSAGE),并且发送给远端节点。其中蕴含了咱们上述的2个重要指标也就是m_transactions_waiting_certification/m_transactions_waiting_apply.
- COUNT_TRANSACTIONS_IN_QUEUE (m_transactions_waiting_certification) 实际上这是appler线程进行pipeline解决的队列数量,来自于applier_module->get_message_queue_size(),一旦解决实现就会写入到relay log,相应的队列也会出队。理论它的入队是xcom engine线程进行的push操作。一旦写入relay log后就会进行pop解决,队列数量也会缩小。参考Applier_module::applier_thread_handle处 applier线程解决的流程。因而并不是单主就不会有抵触验证队列,一样是有的,只是解决要快于多主,因为任何事务的event都须要进行pipeline解决,其中蕴含了抵触验证、GTID生成、写入relay log等操作。
- COUNT_TRANSACTIONS_REMOTE_IN_APPLIER_QUEUE(m_transactions_waiting_apply) 来自于m_transactions_waiting_apply.load(),这个值在Applier_handler::handle_event函数减少,当pipeline的Applier_handler解决实现,也就是写入了relay log后减少。这个值在hook group_replication_trans_before_commit处进行缩小,函数首先就会判断提交的事务是不是来自applier通道,如果是则进行缩小。当然如果是主库咱们事务提交是前台线程本人,而不是applier通道,所以不会影响这个值。
简略的写入relay log的逻辑和指标减少逻辑:error = channel_interface.queue_packet((const char *)p->payload, p->len); //写入 relay log 调用仍旧为queue event if (event->get_event_type() == binary_log::GTID_LOG_EVENT && local_member_info->get_recovery_status() == Group_member_info::MEMBER_ONLINE) { applier_module->get_pipeline_stats_member_collector() ->increment_transactions_waiting_apply(); //减少期待利用
当然本音讯中蕴含了所有replication_group_member_status的指标,这里简略列举如下:
m_transactions_certified.load() 这个值在认证最初进行更新,用于统计以后认证了多少工作,当然这里只是通过了 Certifier::certify的事务的个数,因而单主也会有这个值。 m_transactions_applied.load() 曾经利用的事务,这个值在hook group_replication_trans_before_commit处进行减少 首先就会判断提交的事务是不是来自applier通道,如果是则进行减少m_transactions_local.load() 本地事务的数量,这个值在hook group_replication_trans_before_commit处进行减少 在group_replication_trans_before_commit中会判断提交的事务到底是applier通道过的 sql线程还是前台session,如果是前台session则减少(cert_interface != nullptr) ? cert_interface->get_negative_certified(): 0 抵触认证操作失败的事务数量(cert_interface != nullptr) ? cert_interface->get_certification_info_size(): 0 抵触认证数据库的大小send_transaction_identifiers 30秒一次设置为true,是否发送了本地相干的GTID信息committed_transactions 全局提交的事务的gtid信息,这里这个信息30秒发送一次,次要来自于 为 CT_CERTIFICATION_MESSAGE 音讯后处理的所有节点执行 GTID事务的交加last_conflict_free_transaction 最初一次没有抵触的事务数量m_transactions_local_rollback.load() 因为抵触认证,本地须要回滚的事务数量mode 是否开启了流量管制
而后会依据是否开启流控进行综合各个节点的pipeline信息,进行流控指标的计算,如果一旦计算出须要进行流控解决,则事务须要在group_replication_trans_before_commit处进行流控期待。
每60秒进行
发送本节点的GTID_EXECUTED给远端节点,这个次要用于抵触验证数据库的清理和计算全局提交的GTID信息,发送类型为Gtid_Executed_Message,type为CT_CERTIFICATION_MESSAGE调用gcs_module->send_message(gtid_executed_message, true);发送音讯 因而replication_group_member_status中的GTID信息并不是很及时,有至多60秒,最多120秒的提早,然而其余信息还是比拟及时的,然而也不是实时同步的。
三、applier通道的pipeline
实际上这个次要是当xcom engine线程发送音讯给applier线程后,apllier线程会进行一些解决如下是远端节点收到事务信息后进行的pipeline解决:
这里的event_cataloger-->certification_handler-->applier_handler 进行的解决就是所谓的applier通道的pipeline。当然如果是本地事务,则不须要写入到relay log,然而其余流程还是须要的。
四、对于replication_group_member_status信息的装载
这部分信息次要装载逻辑如下:
ha_perfschema::rnd_next ->table_replication_group_member_stats::rnd_next 读取数据 ->table_replication_group_member_stats::make_row ->PFS_engine_table::read_row 获取值,这里就是相应的对应关系 ->table_replication_group_member_stats::read_row_values
其中 table_replication_group_member_stats::make_row就是读取咱们下面说的这些信息,而table_replication_group_member_stats::read_row_values则是转换为咱们DBA可见的模式。这两个指标如下:
case 3: /** transaction_in_queue */ set_field_ulonglong(f, m_row.trx_in_queue); break;... case 9: set_field_ulonglong(f, m_row.trx_remote_applier_queue);
其实也就是咱们下面说的m_transactions_waiting_certification和m_transactions_waiting_apply。然而咱们须要留神的是这里获取的时候分为了本地节点和远端节点。在get_group_member_stats有如下逻辑:
如果是本地UUID则 -> applier_module->get_local_pipeline_stats() 如果是远端UUID则 -> applier_module->get_flow_control_module()->get_pipeline_stats (member_info->get_gcs_member_id().get_member_id()))
而远端节点的信息正是来自于各个节点broadcast线程的发送。对于单主模式的主节点来讲:
- m_transactions_waiting_apply:失常状况下应该维持为0,因为本地事务不会写到relay log。非凡状况除外。
- m_transactions_waiting_certification:每个节点都能够不为0,因为过抵触验证和GTID生成是不能防止的。
具体逻辑在 Certification_handler::handle_transaction_id 中对本地事务和远端事务处理的分支上。
Enjoy GreatSQL :)
文章举荐:
GreatSQL MGR FAQ
https://mp.weixin.qq.com/s/J6...
万答#12,MGR整个集群挂掉后,如何能力主动选主,不必手动干涉
https://mp.weixin.qq.com/s/07...
『2021数据技术嘉年华·ON LINE』:《MySQL高可用架构演进及实际》
https://mp.weixin.qq.com/s/u7...
一条sql语句慢在哪之抓包剖析
https://mp.weixin.qq.com/s/AY...
万答#15,都有哪些状况可能导致MGR服务无奈启动
https://mp.weixin.qq.com/s/in...
技术分享 | 为什么MGR一致性模式不举荐AFTER
https://mp.weixin.qq.com/s/rN...
对于 GreatSQL
GreatSQL是由万里数据库保护的MySQL分支,专一于晋升MGR可靠性及性能,反对InnoDB并行查问个性,是实用于金融级利用的MySQL分支版本。
Gitee:
https://gitee.com/GreatSQL/Gr...
GitHub:
https://github.com/GreatSQL/G...
Bilibili:
https://space.bilibili.com/13...
微信&QQ群:
可搜寻增加GreatSQL社区助手微信好友,发送验证信息“加群”退出GreatSQL/MGR交换微信群
QQ群:533341697
微信小助手:wanlidbc
本文由博客一文多发平台 OpenWrite 公布!