writeset参数配置探索——究竟在哪个角色上配置参数?

关于writeset,一直以来我都是所有节点同时配置下面参数:

binlog_transaction_dependency_tracking=WRITESET
transaction_write_set_extraction=xxhash64

但是这几天在尝试整理的时候,突然发现writeset的概念并不是想象中的那么清晰,
也想要验证一下老师提到的结论:

  • 从group commit进化的角度、及writeset的hash表原理来看,参数应该设置在master
  • 从结论2的角度来看,参数应该设置在slave

为此,做了一个实验,分别在两个角色上配置以上2个参数,来验证究竟哪一边设置才是有效的。

IP port role info 192.168.188.81 3316 node1 master 192.168.188.82 3316 node2 slave1 192.168.188.83 3316 node3 slave2 1主2从, MySQL版本8.0.19

  • slave配置writeset:binlog_transaction_dependency_tracking=WRITESET & transaction_write_set_extraction=xxhash64
  • master只配置:binlog_group_commit_sync_delay & binlog_group_commit_sync_no_delay_count

配置参数

master:
binlog_group_commit_sync_delay       =100
binlog_group_commit_sync_no_delay_count = 10

gtid_mode                           =on
enforce_gtid_consistency            =on
binlog_format                       =row
skip_slave_start                     =1
master_info_repository               =table
relay_log_info_repository            =table
slave:
binlog_transaction_dependency_tracking=WRITESET
transaction_write_set_extraction=xxhash64

skip_slave_start                     =1
master_info_repository               =table
relay_log_info_repository            =table
slave_parallel_type                  =logical_clock
slave_parallel_workers               =4
#slave-preserve-commit-order         =ON

验证实验

  • 为方便查看,slave上先切换日志
root@slave1 [kk]>flush logs;
Query OK, 0 rows affected (0.05 sec)
  • 在master上创建1张表,并插入数据
root@master [kk]>flush logs;
Query OK, 0 rows affected (0.05 sec)

root@master [kk]>create table k3 (id int auto_increment primary key , dtl varchar(20) default 'a');
Query OK, 0 rows affected (0.05 sec)

root@master [kk]>insert into k3(dtl) values ('a');
Query OK, 1 row affected (0.02 sec)

root@master [kk]>insert into k3(dtl) values ('b');
Query OK, 1 row affected (0.01 sec)

root@master [kk]>insert into k3(dtl) values ('c');
Query OK, 1 row affected (0.01 sec)

root@master [kk]>insert into k3(dtl) values ('d');
Query OK, 1 row affected (0.02 sec)
  • 解析master的binlog,可以看到,master的binlog上每一个事务都是自成一组(每一个事务一个last_committed)
[root@ms81 logs]# mysqlbinlog -vvv --base64-output=decode-rows mysql-bin.000006 |grep last_committed
#200514 11:09:58 server id 813316  end_log_pos 272 CRC32 0xa8811d1b     GTID    last_committed=0        sequence_number=1       rbr_only=no     original_committed_timestamp=1589425798790755immediate_commit_timestamp=1589425798790755      transaction_length=242
#200514 11:10:05 server id 813316  end_log_pos 516 CRC32 0x8f66cd2f     GTID    last_committed=1        sequence_number=2       rbr_only=yes    original_committed_timestamp=1589425805035310immediate_commit_timestamp=1589425805035310      transaction_length=335
#200514 11:10:06 server id 813316  end_log_pos 851 CRC32 0x909932ba     GTID    last_committed=2        sequence_number=3       rbr_only=yes    original_committed_timestamp=1589425806709355immediate_commit_timestamp=1589425806709355      transaction_length=335
#200514 11:10:08 server id 813316  end_log_pos 1186 CRC32 0x50c4e104    GTID    last_committed=3        sequence_number=4       rbr_only=yes    original_committed_timestamp=1589425808607557immediate_commit_timestamp=1589425808607557      transaction_length=335
#200514 11:10:10 server id 813316  end_log_pos 1521 CRC32 0xf074c523    GTID    last_committed=4        sequence_number=5       rbr_only=yes    original_committed_timestamp=1589425810449588immediate_commit_timestamp=1589425810449588      transaction_length=335
  • 然后去slave上解析binlog,可以看到,slave的binlog上这几个insert的事务成为了一组(几个事务在一个last_committed中)
[root@ms82 logs]# mysqlbinlog -vvv --base64-output=decode-rows mysql-bin.000003 |grep last_committed
#200514 11:09:58 server id 813316  end_log_pos 279 CRC32 0xbf39f999     GTID    last_committed=0        sequence_number=1       rbr_only=no     original_committed_timestamp=1589425798790755immediate_commit_timestamp=1589425798840582      transaction_length=249
#200514 11:10:05 server id 813316  end_log_pos 530 CRC32 0x7e0b2634     GTID    last_committed=1        sequence_number=2       rbr_only=yes    original_committed_timestamp=1589425805035310immediate_commit_timestamp=1589425805046566      transaction_length=337
#200514 11:10:06 server id 813316  end_log_pos 867 CRC32 0x79b980e9     GTID    last_committed=1        sequence_number=3       rbr_only=yes    original_committed_timestamp=1589425806709355immediate_commit_timestamp=1589425806723726      transaction_length=337
#200514 11:10:08 server id 813316  end_log_pos 1204 CRC32 0x09b728d3    GTID    last_committed=1        sequence_number=4       rbr_only=yes    original_committed_timestamp=1589425808607557immediate_commit_timestamp=1589425808616207      transaction_length=337
#200514 11:10:10 server id 813316  end_log_pos 1541 CRC32 0x499da890    GTID    last_committed=1        sequence_number=5       rbr_only=yes    original_committed_timestamp=1589425810449588immediate_commit_timestamp=1589425810459612      transaction_length=337
  • 查看一下master的配置,虽然my.cnf中没配置binlog_transaction_dependency_tracking参数,但是该参数在8.0中默认设置为COMMIT_ORDER
root@localhost [kk]>show global variables like '%tracking%';
+----------------------------------------+--------------+
| Variable_name                          | Value        |
+----------------------------------------+--------------+
| binlog_transaction_dependency_tracking | COMMIT_ORDER |
+----------------------------------------+--------------+
1 row in set (0.02 sec)

实验一的结论

根据实验一的现象,套用复制流程可推测为:
1. master生成串行事务日志到binlog,
2. 通过复制结构将binlog拉取到slave,称为relay log
3. slave会按照master的binlog内容(relay log)进行apply
4. apply后再写入到slave的binlog
那么slave的binlog能说明slave是怎么应用的relay log么? 还是因为slave配置了writeset,所以slave生成的binlog中发生了write-set?

  • slave 不配置writeset:binlog_transaction_dependency_tracking=WRITESET & transaction_write_set_extraction=xxhash64
  • master增加配置:binlog_transaction_dependency_tracking=WRITESET & transaction_write_set_extraction=xxhash64

配置参数,并重启实例

master:
binlog_transaction_dependency_tracking=WRITESET
transaction_write_set_extraction=xxhash64

binlog_group_commit_sync_delay       =100
binlog_group_commit_sync_no_delay_count = 10

gtid_mode                           =on
enforce_gtid_consistency            =on
binlog_format                       =row
skip_slave_start                     =1
master_info_repository               =table
relay_log_info_repository            =table
slave:
#binlog_transaction_dependency_tracking=WRITESET  #注释掉
#transaction_write_set_extraction=xxhash64   #注释掉

skip_slave_start                     =1
master_info_repository               =table
relay_log_info_repository            =table
slave_parallel_type                  =logical_clock
slave_parallel_workers               =4
#slave-preserve-commit-order         =ON

验证实验

  • 还是为方便查看,slave上先切换日志
root@slave1 [kk]>flush logs;
Query OK, 0 rows affected (0.05 sec)
  • 在master上创建1张表,并插入数据
root@master [(none)]>flush logs;
Query OK, 0 rows affected (0.03 sec)

root@master [kk]>create table k4 (id int auto_increment primary key , dtl varchar(20) default 'a');
Query OK, 0 rows affected (0.05 sec)

root@master [kk]>insert into k4(dtl) values ('a');
Query OK, 1 row affected (0.02 sec)

root@master [kk]>insert into k4(dtl) values ('b');
Query OK, 1 row affected (0.01 sec)

root@master [kk]>insert into k4(dtl) values ('c');
Query OK, 1 row affected (0.01 sec)

root@master [kk]>insert into k4(dtl) values ('d');
Query OK, 1 row affected (0.01 sec)

  • 解析master的binlog,可以看到,master上insert事务组成了一组(具有相同的last_committed)
[root@ms81 logs]# mysqlbinlog -vvv --base64-output=decode-rows mysql-bin.000008 |grep last_committed
#200514 11:25:55 server id 813316  end_log_pos 272 CRC32 0x1a3b45da     GTID    last_committed=0        sequence_number=1       rbr_only=no     original_committed_timestamp=1589426755949559immediate_commit_timestamp=1589426755949559      transaction_length=242
#200514 11:26:06 server id 813316  end_log_pos 516 CRC32 0x9f51382b     GTID    last_committed=1        sequence_number=2       rbr_only=yes    original_committed_timestamp=1589426766237292immediate_commit_timestamp=1589426766237292      transaction_length=335
#200514 11:26:08 server id 813316  end_log_pos 851 CRC32 0xb02fc356     GTID    last_committed=1        sequence_number=3       rbr_only=yes    original_committed_timestamp=1589426768166475immediate_commit_timestamp=1589426768166475      transaction_length=335
#200514 11:26:09 server id 813316  end_log_pos 1186 CRC32 0x615fb932    GTID    last_committed=1        sequence_number=4       rbr_only=yes    original_committed_timestamp=1589426769816765immediate_commit_timestamp=1589426769816765      transaction_length=335
#200514 11:26:12 server id 813316  end_log_pos 1521 CRC32 0x13bceeb8    GTID    last_committed=1        sequence_number=5       rbr_only=yes    original_committed_timestamp=1589426772153679immediate_commit_timestamp=1589426772153679      transaction_length=335

看来writeset在主库上影响了binlog的内容了,接下来看一下slave的binlog

  • 然后去slave上解析binlog,可以看到,slave上这几个insert的事务各自成了一组
[root@ms82 logs]# mysqlbinlog -vvv --base64-output=decode-rows mysql-bin.000005 |grep last_committed
#200514 11:25:55 server id 813316  end_log_pos 279 CRC32 0x96a31487     GTID    last_committed=0        sequence_number=1       rbr_only=no     original_committed_timestamp=1589426755949559immediate_commit_timestamp=1589426755999296      transaction_length=249
#200514 11:26:06 server id 813316  end_log_pos 530 CRC32 0x54711cb2     GTID    last_committed=1        sequence_number=2       rbr_only=yes    original_committed_timestamp=1589426766237292immediate_commit_timestamp=1589426766253024      transaction_length=337
#200514 11:26:08 server id 813316  end_log_pos 867 CRC32 0xf20ad235     GTID    last_committed=2        sequence_number=3       rbr_only=yes    original_committed_timestamp=1589426768166475immediate_commit_timestamp=1589426768176639      transaction_length=337
#200514 11:26:09 server id 813316  end_log_pos 1204 CRC32 0xa3b00643    GTID    last_committed=3        sequence_number=4       rbr_only=yes    original_committed_timestamp=1589426769816765immediate_commit_timestamp=1589426769825978      transaction_length=337
#200514 11:26:12 server id 813316  end_log_pos 1541 CRC32 0xce0fd88f    GTID    last_committed=4        sequence_number=5       rbr_only=yes    original_committed_timestamp=1589426772153679immediate_commit_timestamp=1589426772164468      transaction_length=337

此时slave的参数binlog_transaction_dependency_tracking为默认值

root@slave1 [(none)]>show global variables like '%tracking%';
+----------------------------------------+--------------+
| Variable_name                          | Value        |
+----------------------------------------+--------------+
| binlog_transaction_dependency_tracking | COMMIT_ORDER |
+----------------------------------------+--------------+
1 row in set (0.01 sec)

实验二结论

根据实验二的现象,套用复制流程可推测为:
1. master生成串行事务,writeset特性将事务按照write-set进行分组,写到binlog中
2. 通过复制结构将binlog拉取到slave,称为relay log
3. slave会按照master的binlog内容(relay log)进行apply
4. apply后再写入到slave的binlog

参考官方文档,我倾向于认为,slave应用relay log时是按照master的writeset分组进行并行apply的。
那么,目前的实验结论就与前面的结论2相悖了。

The source of dependency information that the master uses to determine which transactions can be executed in parallel by the slave’s multithreaded applier. This variable can take one of the three values described in the following list:

  • COMMIT_ORDER: Dependency information is generated from the master’s commit timestamps. This is the default. This mode is also used for any transactions without write sets, even if this variable’s is WRITESET or WRITESET_SESSION; this is also the case for transactions updating tables without primary keys and transactions updating tables having foreign key constraints.
  • WRITESET: Dependency information is generated from the master’s write set, and any transactions which write different tuples can be parallelized.
  • WRITESET_SESSION: Dependency information is generated from the master’s write set, but no two updates from the same session can be reordered.

Original: https://www.cnblogs.com/konggg/p/13571603.html
Author: 孔个个
Title: writeset参数配置探索——究竟在哪个角色上配置参数?

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621868/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL学习笔记

    MySQL学习笔记 解决MYSQL中文乱码问题 一、乱码的原因: 1、 client客户端的编码不是utf8 2、server端的编码不是utf8 3、database数据库的编码…

    数据库 2023年5月24日
    0120
  • 【MySQL】笔记(3)— 连接查询;子查询;union;limit;

    一.连接查询: 1.1、什么是连接查询?在实际开发中,大多数情况下并不是从单个表中查询数据,而是通常通过多个表的联合查询来获得最终结果。 [En] In the actual de…

    数据库 2023年5月24日
    080
  • leetcode 144. Binary Tree Preorder Traversal 二叉树展开为链表(中等)

    一、题目大意 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root = [1,null,2,3]输出:[1,2,3] 示例 2: 输入:root…

    数据库 2023年6月16日
    093
  • 每个开发人员都应该关注的7个优秀的GitHub仓库

    1. FreeCodeCamp 2. Developer Roadmap 3. Awesome 4. Build Your Own X 5. Git Ignore 6. Syste…

    数据库 2023年6月11日
    0103
  • MySQL 回表

    MySQL 回表 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。 一、简述 回表,顾名思义就是回到表中,也就是先通过普通索引扫描出数据所在的行,再通过行主键ID 取出索引中未包含…

    数据库 2023年5月24日
    090
  • 奶奶常说,黑白照片看的不清晰,还好我会Python,分分钟给她变成彩色的~

    咳咳~ 其实是奶奶常说,艾欧尼亚昂扬不灭,正义将指引着我们! 好吧,并不是奶奶说,只是最近回家发现一些黑白老照片,看着不够清晰,然后实验了一波用Python把老照片变成彩色的。 代…

    数据库 2023年6月14日
    097
  • CentOS 安装 Docker CE

    CentOS 安装 Docker CE 警告:切勿在没有配置 Docker YUM 源的情况下直接使用 yum 命令安装 Docker. 准备工作 系统要求 Docker CE 支…

    数据库 2023年6月6日
    089
  • CompletableFuture的简单使用

    日常开发中,我们都会用到线程池,一般会用execute()和submit()方法提交任务。但是当你用过CompletableFuture之后,就会发现以前的线程池处理任务有多难用,…

    数据库 2023年6月14日
    095
  • 前端开发:如何正确地跨端

    导读:面对多种多样的跨端诉求,有哪些跨端方案?跨端的本质是什么?作为业务技术开发者,应该怎么做?本文分享阿里巴巴ICBU技术部在跨端开发上的一些思考,介绍了当前主流的跨端方案,以及…

    数据库 2023年6月14日
    095
  • SQLZOO练习7–Using NULL

    teacher表: iddeptnamephonemobile 101 1 Shrivell 2753 07986 555 1234 102 1 Throd 2754 07122 …

    数据库 2023年6月16日
    069
  • MySQL——基础查询与条件查询

    基础查询 /* 语法: select 查询列表 from 表名; 类似于:System.out.println(打印东西); 1、查询列表可以是:表中的字段、常量值、表达式、函数 …

    数据库 2023年5月24日
    0115
  • 5、基于EasyExcel的导入导出

    一、Apach POI处理Excel的方式: 传统Excel操作或者解析都是利用Apach POI进行操作,POI中处理Excel有以下几种方式: 1、HSSFWorkbook: …

    数据库 2023年6月6日
    0121
  • java 桥接方法

    1.桥接方法简介 桥接方法是jdk1.5引入泛型后,为使java泛型方法生成的字节码与jdk1.5版本之前的字节码兼容由编译器自动生成的。 可用 method.isBridge()…

    数据库 2023年6月16日
    0101
  • MySQL数据备份 mysqldump 详解

    MySQL数据备份流程 打开cmd窗口 通过命令进行数据备份与恢复; 需要在Windows的命令行窗口中进行; l 开始菜单,在运行中输入cmd回车; l 或者win+R,然后输入…

    数据库 2023年6月14日
    090
  • tomcat部署war包 首页面默认展示自己定义的页面

    将项目war包部署到tomcat的webapps后,http://localhost:8080 展示tomcat页面,http://localhost:8080/appName展示…

    数据库 2023年6月16日
    083
  • Java面试题(三)–虚拟机

    1 内存结构 1、简述一下JVM的内存结构?(高频) JVM在执行Java程序时,会把它管理的内存划分为若干个的区域,每个区域都有自己的用途和创建销毁时间。如下图所示,可以分为两大…

    数据库 2023年6月16日
    078
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球