麒麟v10 上部署 TiDB v5.1.2 生产环境优化实践
789
2023-05-30
MySQL数据库主从技术GTID大揭秘
一、概述
1.1 GTID的概念
GTID(全局事务标识符)是mysql MySQL-5.6.5开始支持的新特性之一,全局事务标识符不仅在源(主)服务器上是唯一的,而且在给定复制设置中的所有服务器都是唯一的。正因为这样一个特性使得mysql的主从复制变得更加简单且一致性更高。它与源(主)服务器上提交的每个事务相关联,由服务器ID+事务ID组合而成。
GTID = source_id:transaction_id,中间由“:”分隔,source_id用于标识原服务器,通常指server_uuid,由于GTID会传递到slave,所以也可以理解为源ID。transaction_id为当前服务器上已提交事务的一个序列号,通常从1开始自增长的序列,一个数值对应一个事务。
查看本机的server_uuid方法如下:
mysql> show variables like '%uuid%'; +---------------+--------------------------------------+ | Variable_name | Value | +---------------+--------------------------------------+ | server_uuid | f3d0a8b5-a657-11eb-a6e5-000c29dbd935 | +---------------+--------------------------------------+ 1 row in set (0.01 sec)
1.2 GTID的工作原理
1、当一个事务在主库端执行并提交时,会产生一个GTID并记录到binlog日志中。
2、binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID,如果有说明该GTID的事务已经执行,slave会忽略。如果没有记录,slave会执行该GTID的事务,在执行前会检查其他session持有该GTID,确保该GTID的事务不会被重复执行,并记录该GTID到自身的binlog。
4、在解析过程中会判断是否有主键,如果没有就用二级索引,再没有就走全表扫描。
1.3 mysql.gtid_exected表
GTID存储在mysql的 gtid_executed的表中。该表供mysql服务器内部使用,该表中的一行代表的每个GTID或GTID集合,以及该集合的开始和结束事务ID;对于仅引用单个GTID的行,最后两个值相同。
在mysql.gtid_executed安装或升级My***时,使用create table 类似于以下所示的语句创建该表(如果尚不存在):
CREATE TABLE gtid_executed ( source_uuid CHAR(36) NOT NULL, interval_start BIGINT(20) NOT NULL, interval_end BIGINT(20) NOT NULL, PRIMARY KEY (source_uuid, interval_start) )
注意:与其他MySQL系统表一样,请勿尝试自己创建或修改该表。
GTID仅当gtid_mode is ON or ON_PERMISSIVE时,GTID才会存储在gtid_executed的表中,GTID的存储与mysql是否启用二进制日志紧密相关。
如果禁用了二进制日志记录(log_binis OFF),或者如果 log_slave_updates禁用了二进制日志记录,则服务器将属于每个事务的GTID与该事务一起存储在表中。此外,该表会以用户可配置的速率定期压缩。这种情况仅适用于禁用了二进制日志记录或副本更新日志记录的副本。它不适用于复制源服务器,因为必须在源上启用二进制日志记录才能进行复制。如果启用了二进制日志记录(log_bin是 ON),则每当旋转二进制日志或关闭服务器时,服务器都会将写入前一个二进制日志的所有事务的GTID写入mysql.gtid_executed表中。这种情况适用于复制源服务器或启用了二进制日志记录的副本。如果服务器意外停止,则当前二进制日志文件中的GTID集不会保存在 mysql.gtid_executed表中。恢复期间,这些GTID从二进制日志文件添加到表中。例外的是重新启动服务器时未启用二进制日志记录。在这种情况下,服务器无法访问二进制日志文件以恢复GTID,因此无法启动复制。
启用二进制日志记录后,该 mysql.gtid_executed表将不保存所有已执行事务的GTID的完整记录。该信息由gtid_executed系统变量的全局值提供 。始终使用 @@GLOBAL.gtid_executed,它在每次提交后都会更新,以表示MySQL服务器的GTID状态,而不查询 mysql.gtid_executed表。
1.4 mysql.gtid_executed表压缩
随着时间的流逝, mysql.gtid_executed表中可能会出现很多行,表会越来越大,为了节省空间,MySQL服务器mysql.gtid_executed通过用横跨事务标识符整个间隔的一行替换每行这样的行来定期压缩 表,如下所示:
+--------------------------------------+----------------+--------------+ | source_uuid | interval_start | interval_end | |--------------------------------------+----------------+--------------| | 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 37 | 43 | ...
您可以通过设置
该mysql.gtid_executed表的压缩由名为的专用前台线程执行
二、GTID复制的优缺点
2.1 GTID优势
1、更简单的实现failover,不用以前那样在需要找log_file和log_pos。 2、更简单的搭建主从复制。 3、比传统的复制更加安全。 4、GTID是连续的没有空洞的,保证数据的一致性,零丢失。
2.2 GTID的限制
【编辑推荐】
几天狂增 1.1 万 Star!谷歌这个脚本工具必须推荐一波老板偷偷监控了我的微信聊天......微软Windows 10 KB5003173 更新安装失败,原因是没有新版 Edge 浏览器面试官:如何理解UDP 和 TCP? 区别? 应用场景?扬开源之帆,借官方认证考试之势,在NGINX领域脱颖而出
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。