返回顶部
首页 > 资讯 > 数据库 >MySQL中slave端Retrieved_Gtid_Set读取改进的示例分析
  • 585
分享到

MySQL中slave端Retrieved_Gtid_Set读取改进的示例分析

2024-04-02 19:04:59 585人浏览 安东尼
摘要

小编给大家分享一下Mysql中slave端Retrieved_Gtid_Set读取改进的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起

小编给大家分享一下Mysql中slave端Retrieved_Gtid_Set读取改进的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一、问题由来

今天朋友问我这样一个问题@K.I.S.S,在官方文档中有这样一段描述:

When using GTIDs, the slave tells the master which transactions it has already received, executed, or both. To compute this set, it reads 
the global value of gtid_executed and the value of the Retrieved_gtid_set column from SHOW SLAVE STATUS. The GTID of the last transmitted 
transaction is included in Retrieved_gtid_set only when the full transaction is received. The slave computes the following set:
UNION(@@global.gtid_executed, Retrieved_gtid_set)
Prior to mysql 5.7.5, the GTID of the last transmitted transaction was included in Retrieved_gtid_set even if the transaction was only 
partially transmitted, and the last received GTID was subtracted from this set. (Bug #17943188) Thus, the slave computed the following set: UNION(@@global.gtid_executed, Retrieved_gtid_set - last_received_GTID)

问为什么要减去last_received_GTID。

二、查看Bug #17943188的commit

对于这个问题我先查看了一下这个bug到底修复了什么问题如下:

 BUG#17943188 SHOW SLAVE STATUS/RETRIEVED_GTID_SET MAY HAVE PARTIAL TRX OR MISS COMPLETE TRX
    
    Problem:
    =======
    
    The SHOW SLAVE STATUS command contains the column RETRIEVED_GTID_SET.
    This is supposed to contain the set of GTIDs that exist in the relay
    log. However, the field is updated when the slave receiver thread
    (I/O thread) receives a Gtid_log_event, which happens at the beginning
    of the transaction.
    
    If the I/O thread gets disconnected in the middle of a transaction,
    RETRIEVED_GTID_SET can contain a GTID for a transaction that is only
    partially received in the relay log. This transaction will
    subsequently be rolled back, so it is wrong to pretend that the
    transaction is there.
    
    Typical fail-over alGorithms use RETRIEVED_GTID_SET to determine which
    slave has received the most transactions to promote the slave to a
    master. This is true for e.g. the mysqlfailover utility.
    
    When RETRIEVED_GTID_SET can contain partially transmitted transactions,
    the fail-over utility can choose the wrong slave to promote. This can
    lead to data corruption later.
    
    This means that even if semi-sync is enabled, transactions that have
    been acknowledged by one slave can be lost.
    
    Fix:
    ===
    
    It was implemented a transaction boundaries parser that will give
    infORMation about transaction boundaries of an event stream based on
    the event types and their queries (when they are Query_log_event).
    
    As events are queued by the I/O thread, it feeds the Master_info
    transaction boundary parser. The slave I/O recovery also uses the
    transaction parser to determine if a given GTID can be added to the
    Retrieved_Gtid_Set or not.
    
    When the event parser is in GTID state because a Gtid_log_event was
    queued, the event's GTID isn't added to the retrieved list yet.
    It is stored in an auxiliary GTID variable.
    
    After flushing an event into the relay log, the IO thread verifies if the transaction parser is not inside a transaction anymore (meaning
    that the last event of the transaction has been flushed).
    
    If transaction parser is outside a transaction, the I/O thread
    verifies if a GTID was stored in the start of the transaction, adding
    it to the retrieved list, ensuring that all the transaction has arrived and was flushed to the relay log.
    
    Also, before this patch, after the I/O thread flushed a single received
    event into the relaylog, it was possible to rotate the relaylog if the
    current relaylog file size exceeded max_binlog_size/max_relaylog_size.
    After this patch, when GTIDs are enabled we only allow this rotation by
    size if the transaction parser is not in the middle of a transaction.
    
    Note: The current patch removed the changes for BUG#17280176, as it also dealt with similar problem in a different way.

大概就是说对于某些I/O线程并没有完整传输的Gtid事物记录到了RETRIEVED_GTID_SET中这会导致比较严重问题,因为某些监控工具根据这个来判断是否切换之类的,因此我们加入了一个事物边界分析器来判断事物是否完整传输,如果完整传输才记录到RETRIEVED_GTID_SET中这是5.7.5过后加入的。总的说来为了进行两个问题的修复:

  • 1、最后一个gtid 事物是否完整。

  • 2、跨越多个relay log的binlog 得到正确的gtid集合

三、修改了什么

其实修改得非常多,不一一列举,有兴趣可以自己看看commit 9dab9dad975d09b8f37f33bf3c522d36fdf1d0f9,这里列举几个我看了的地方。

1、在 MYSQL_BIN_LOG::init_gtid_sets加入了如下逻辑

 if (is_relay_log)
    {   rit--;//回退一个文件 因为前面为rit++做操作  exp:1<2<3<{4}<5<6<7  --->   1<2<3<4<{5}<6<7   trx_parser->reset();
      gtid_partial_trx->clear();

      DBUG_PRINT("info", ("Iterating forwards through relay logs, " "updating the Retrieved_Gtid_Set and updating " "IO thread trx parser before start.")); for (it= find(filename_list.begin(), filename_list.end(), *rit);
           it != filename_list.end(); it++)//从匹配的位置继续向后 { const char *filename= it->c_str();
        DBUG_PRINT("info", ("filename='%s'", filename)); if (read_gtids_and_update_trx_parser_from_relaylog(filename, all_gtids, true, trx_parser,
                                                           gtid_partial_trx))
        {
          error= 1; goto end;
        }
      }
    }
  }

其实这一块也说明了解决的什么问题,我们发现一个事物的binlog event 在relay log中是可以跨文件的。而在bin log中是不能跨文件的。仅仅判断最后一个gtid priv event 是不正确的。因此需要这样修改。

2、其次加入了边界分析器Transaction_boundary_parser类

这个类是完全新加入的,这里是其中的一些状态:

num enum_event_boundary_type {
    EVENT_BOUNDARY_TYPE_ERROR= -1,  EVENT_BOUNDARY_TYPE_GTID= 0,  EVENT_BOUNDARY_TYPE_BEGIN_TRX= 1,  EVENT_BOUNDARY_TYPE_END_TRX= 2,  EVENT_BOUNDARY_TYPE_END_XA_TRX= 3,  EVENT_BOUNDARY_TYPE_PRE_STATEMENT= 4,  EVENT_BOUNDARY_TYPE_STATEMENT= 5,  EVENT_BOUNDARY_TYPE_IGNORE= 6 };  enum enum_event_parser_state {  EVENT_PARSER_NONE,  EVENT_PARSER_GTID,  EVENT_PARSER_DDL,  EVENT_PARSER_DML,  EVENT_PARSER_ERROR
  };

3、read_gtids_and_update_trx_parser_from_relaylog函数新增

这个函数是完全新加入的就是为了完成所说的功能,在read_gtids_and_update_trx_parser_from_relaylog中我看到对文件所有event进行了读取,并且用switch进行了不同event类型的处理,但是具体没有细看。但是最后看到对于对于是否加入retrieve gtid的判断如下:

  if (trx_parser->is_not_inside_transaction())
      { if (!gtid_partial_trx->is_empty())
        {
          DBUG_PRINT("info", ("Adding Gtid to Retrieved_Gtid_Set as the " "transaction was completed at " "relaylog file '%s': Gtid(%d, %lld).",
                              filename, gtid_partial_trx->sidno,
                              gtid_partial_trx->gno));
          retrieved_gtids->_add_gtid(gtid_partial_trx->sidno,
                                     gtid_partial_trx->gno);
          gtid_partial_trx->clear();
        }
      }

四、初始化的时候retrieve gtid到底如何计算

实际上就在现在看来应该就是读取 relay_log的最后一个gtid事物(gtid event或者gtid priv event)同时需要判断此gtid事物是否完整。对于官方文档给出的UNION(@@global.gtid_executed, Retrieved_gtid_set - last_received_GTID),个人觉得这里的 last_received_GTID应该是经过判断的,如果完整则不减,如果不完整则减去。

以上是“MySQL中slave端Retrieved_Gtid_Set读取改进的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中slave端Retrieved_Gtid_Set读取改进的示例分析

本文链接: https://www.lsjlt.com/news/62483.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL中slave端Retrieved_Gtid_Set读取改进的示例分析
    小编给大家分享一下MySQL中slave端Retrieved_Gtid_Set读取改进的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起...
    99+
    2024-04-02
  • MySQL中Slave库恢复的示例分析
    这篇文章主要介绍了MySQL中Slave库恢复的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。状况描述:登录一个MySQL数据库sl...
    99+
    2024-04-02
  • PHP中文件读取的示例分析
    这篇文章主要介绍PHP中文件读取的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.两个函数的语法:  fread()fread    ( reso...
    99+
    2023-06-14
  • HTML5中FileReader分布读取文件的示例分析
    这篇文章给大家分享的是有关HTML5中FileReader分布读取文件的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。先上效果图先介绍一下H5中FileReader的一些...
    99+
    2024-04-02
  • MySQL中幻读及消除的示例分析
    小编给大家分享一下MySQL中幻读及消除的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!事务隔离级别MySQL有四级事务隔离级别:读未提交 READ-UN...
    99+
    2023-06-14
  • JavaScript中JSON转为Python可读取的示例分析
    这篇文章将为大家详细讲解有关JavaScript中JSON转为Python可读取的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题再现数据是通过 JS 代码传递的,大致格式(仅 作举例说明 ,方...
    99+
    2023-06-28
  • MySQL中增删改查语法的示例分析
    这篇文章给大家分享的是有关MySQL中增删改查语法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。普通的单表更新或删除sql大家肯定滚瓜烂熟,但你有用过连表更新或删除的s...
    99+
    2024-04-02
  • pytorch读取自制数据集的示例分析
    小编给大家分享一下pytorch读取自制数据集的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!问题1问题描述:TypeError: default_col...
    99+
    2023-06-15
  • pandas文件读取和保存的示例分析
    这篇文章将为大家详细讲解有关pandas文件读取和保存的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、Excel 文件的读取(read_excel)pd.read_excel(io, ...
    99+
    2023-06-27
  • ​JavaScript进行数值取整的示例分析
    这篇文章主要介绍JavaScript进行数值取整的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!js取整数的方法:1、通过“Math.trunc()”方法去除数字的小数部分,保留整数部分;2、通过“Math....
    99+
    2023-06-06
  • 级联slave中延迟计算和query event exe time获取方法的示例分析
    这篇文章主要为大家展示了“级联slave中延迟计算和query event exe time获取方法的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“级联...
    99+
    2024-04-02
  • MySQL中Mysqld_multi的示例分析
    这篇文章将为大家详细讲解有关MySQL中Mysqld_multi的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Mysqld_multi多实例  &nb...
    99+
    2024-04-02
  • MYSQL中Profile的示例分析
    这篇文章主要介绍MYSQL中Profile的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MYSQL--Profile分析在分析一条SQL语句的时候,发现在SQL语句的末尾或...
    99+
    2024-04-02
  • MySQL中binlog的示例分析
    这篇文章主要介绍MySQL中binlog的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、binlog简介binlog即binary log,二进制日志文件。它记录了数据库所有执行的DDL和DML语句(除了...
    99+
    2023-06-15
  • mysql中between的示例分析
    这篇文章将为大家详细讲解有关mysql中between的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mysql between的边界范围between 的范围是包含两边的边界值eg: id be...
    99+
    2023-06-15
  • mysql中MVVC的示例分析
    这篇文章将为大家详细讲解有关mysql中MVVC的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mysql中MVVC的示例分析1、作用放弃简单地行级锁,可视为行级锁的变种,提升并发性能。在很多情况...
    99+
    2023-06-15
  • Hive中Map端JOIN的示例分析
    小编给大家分享一下Hive中Map端JOIN的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Map端JOINmap端join适用于当一张表很小(可以存在内...
    99+
    2023-06-04
  • jQuery ajax读取本地json文件的示例分析
    这篇文章主要介绍了jQuery ajax读取本地json文件的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。json文件{ &nbs...
    99+
    2024-04-02
  • mysql引擎大量更改的示例分析
    小编给大家分享一下mysql引擎大量更改的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、对mysql命令语句修改ALTER TABLE&nb...
    99+
    2023-06-20
  • MySQL半一致性读原理的示例分析
    小编给大家分享一下MySQL半一致性读原理的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 1、什么是半一致性读A t...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作