MGR同步复制验证

一 group_replication_consistency不同值含义介绍

官网地址:

MySQL :: MySQL 8.0 Reference Manual :: 20.9.1 Group Replication System Variables

eventual

Both RO and RW transactions do not wait for preceding transactions to be applied before executing. This was the behavior of Group Replication before this variable was added. A RW transaction does not wait for other members to apply a transaction. This means that a transaction could be externalized on one member before the others. This also means that in the event of a primary failover, the new primary can accept new RO and RW transactions before the previous primary transactions are all applied. RO transactions could result in outdated values, RW transactions could result in a rollback due to conflicts.

RO和RW事务在执行之前都不等待前面的事务应用完成(即,事务直接执行,不等待积压事务应用完成)。这是group_replication_consistency变量的默认值(也是8.0.14版本引入该系统变量之前组复制的默认行为)。RW事务不等待其他成员应用事务。意味着设置该值的成员中的事务可以先于其他成员外部化。还意味着,在发生主节点故障转移时,新的主节点主库事务被应用之前就可以接受新的RO和RW事务,这可能造成新的RO事务读取到陈旧的数据(因为之前旧主要节点中的最新数据还未同步到新的主节点)、新的RW事务可能由于冲突导致回滚(冲突认证检测会发现新的RW事务可能与来自旧主要节点的积压RW事务发生冲突)

BEFORE_ON_PRIMARY_FAILOVER

New RO or RW transactions with a newly elected primary that is applying backlog from the old primary are held (not applied) until any backlog has been applied. This ensures that when a primary failover happens, intentionally or not, clients always see the latest value on the primary. This guarantees consistency, but means that clients must be able to handle the delay in the event that a backlog is being applied. Usually this delay should be minimal, but does depend on the size of the backlog.

新RO或RW事务在新当选的主节点应用完成来自旧的主节点的积压事务之前,会被保持(不应用,类似于处在等待状态,积压事务被应用完成之后,才会处理新的RO和RW事务)。这确保当主要节点故障转移发生时,客户端总是能查询到主节点的最新值这保证了一致性,但意味着客户端必须能够在应用囤积的情况下处理延迟通常这种延迟很小,但是实际延迟时间的长短取决于积压事务的大小。

before

A RW transaction waits for all preceding transactions to complete before being applied. A RO transaction waits for all preceding transactions to complete before being executed. This ensures that this transaction reads the latest value by only affecting the latency of the transaction. This reduces the overhead of synchronization on every RW transaction, by ensuring synchronization is used only on RO transactions. This consistency level also includes the consistency guarantees provided by BEFORE_ON_PRIMARY_FAILOVER.

RW事务在应用(applied)之前会等待所有前面的事务(积压事务)完成。RO事务在执行(executed)之前会等待所有前面的事务(积压事务)完成。这样使得事务仅通过牺牲响应延迟就可以确保读取到最新的值。

通过确保同步仅用于RO事务,这减少了每个RW事务的同步开销。此一致性级别还包括BEFORE_ON_PRIMARY_FAILOVER提供的一致性保证。

/*

实际上,只是确保了RO事务上的同步,对于RW事务来说,只是等待了它之前积压的事务完成,并不会等待它在所有的其他组成员上完成应用。

*/

after

A RW transaction waits until its changes have been applied to all of the other members. This value has no effect on RO transactions. This mode ensures that when a transaction is committed on the local member, any subsequent transaction reads the written value or a more recent value on any group member. Use this mode with a group that is used for predominantly RO operations to ensure that applied RW transactions are applied everywhere once they commit. This could be used by your application to ensure that subsequent reads fetch the latest data which includes the latest writes. This reduces the overhead of synchronization on every RO transaction, by ensuring synchronization is used only on RW transactions. This consistency level also includes the consistency guarantees provided by BEFORE_ON_PRIMARY_FAILOVER.

一个RW事务需要等待其在所有节点上的应用成功,才能执行成功。“AFTER”不影响RO事务。该级别确保了一个读写事务在本地提交成功后,后续的操作不管在哪个节点都能看到最新的数据。通过确保同步仅用于RW事务,这减少了每个RO事务的同步开销。此一致性级别还包括BEFORE_ON_PRIMARY_FAILOVER提供的一致性保证

before and after

A RW transaction waits for 1) all preceding transactions to complete before being applied and 2) until its changes have been applied on other members. A RO transaction waits for all preceding transactions to complete before execution takes place. This consistency level also includes the consistency guarantees provided by BEFORE_ON_PRIMARY_FAILOVER.

RW事务等待1)所有之前的事务在应用之前完成,2)直到其更改已应用于其他成员。RO事务在执行之前等待所有先前的事务完成。此一致性级别还包括BEFORE_ON_PRIMARY_FAILOVER提供的一致性保证。

二 同步复制验证

这里是在单主环境下进行的测试。

2.1 准备工作

① 设置每个节点的group_replication_consistency

#以设置为eventual为例

在主从上设置group_replication_consistency

set global group_replication_consistency=EVENTUAL;

② 调小每个节点的wait_timeout参数,方便验证模拟,以便阻塞时快速报错,而不是一直等待,也kill不掉。

set global wait_timeout=20;

set global interactive_timeout=20;

/*

超时后会报类似如下错误:

3797 - Error while waiting for group transactions commit on group_replication_consistency= 'BEFORE'.

*/

③ 新打开一个会话,确认变量是否修改成功

show variables like '%consistency%';

show variables like '%wait_timeout%';

show variables like '%interactive_timeout%';

2.2 开始验证

2.3.1 验证eventual

节点1-会话1

节点2-会话1

 lock table t1 read;

insert into t1 values (1); //执行成功,不会产生等待

 select * from t1; //执行成功,返回结果为节点1-会话1插入前的状态说明节点2读到的是老数据,说明是异步复制

 unlock tables; 

 select * from t1; //执行成功,返回结果为节点1插入后的状态说明此时数据才同步过来。

2.3.2 验证before

set global group_replication_consistency='before';

show variables like '%group_replication_consistency%';

2.3.2.1 验证lock table模拟延迟
2.3.2.1.1 验证从库RO

节点1-会话1

节点2-会话1

 lock table t1 read;

insert into t1 values (1); //执行成功,不会产生等待

select * from t1;  //阻塞,如果超过wait_timeout设置的时间,报错:ERROR: 3797: Error while waiting for group transactions commit on group_replication_consistency= 'BEFORE'。阻塞说明实现了读一致性,以免读到老数据,但是读性能差些。

select * from t2; //读一个没锁定的表也出现阻塞,说明RO事务会等待前面的事务应用完才能读取新事务。

这看起来比较影响读的性能呀。

 unlock tables; 

select * from t1; //执行成功,返回结果为插入后的状态

select * from t2; //执行成功

2.3.2.1.2 验证从库RW

前提:

主从t1表里有一条id为1的数据。

节点1-会话1

节点2-会话1

 set sql_log_bin=0;

set global super_read_only=off;

lock table t1 write;

insert into t1 values (11); //没有阻塞,立即插入成功

③ update t1 set id=id+10 where id=1; //出现阻塞,执行失败,报错:3797 - Error while waiting for group transactions commit on group_replication_consistency= 'BEFORE'.没有提示主键冲突。所以RW也需要等待先前的事务执行完才能执行事务

 unlock tables;  

select * from t1; //执行成功,返回结果为插入后的

2.3.2.2 验证delete大批数据

节点1-会话1

节点1-会话2

节点2-会话1

① delete from t1 ;//删除大批数据,这里删除五百万数据历时103秒

② select count(*) from t1; //在①delete过程中,多次执行该sql,前几次很快(2秒钟)执行完毕,t1数据量是删除前的数据量,但发现有时会阻塞,阻塞了74秒,进程状态是Executing hook on transaction begin,不阻塞后,显示查询结果为0,读到的是① delete后的数据量。

③ select * from t2; //① delete过程中,查询其他表,能正常查询

insert into t1(id) values(6000003); 

insert into t2(id) values(6); // ①执行期间,写入同一个表及其他表数据,都能正常写入

⑤select * from t1 where id=6000003;//①执行期间,在节点2上查询同一个表,出现阻塞

select * from t2;  //①执行期间,在节点2上查询其他表,能看到数据同步过来

2.3.3 验证after

set global group_replication_consistency='after';

show variables like '%group_replication_consistency%';

2.3.3.1 验证lock table模拟延迟
2.3.3.1.1 验证从库RO

节点1-会话1

节点2-会话1

节点2-会话2

 lock table t1 read;

insert into t1 values (1); //产生阻塞

select * from t1;  //在②阻塞期间,在节点2上执行查询sql,发现没阻塞,查询的是②插入之前的数据。

select * from t2; //查询一个没锁的表,没有阻塞,这里比before友好。

⑤ insert into t2(id) values(4); //在②阻塞期间,在其他表写入数据也出现阻塞,进程state是waiting for handler commit

unlock tables; //unlock后,节点1会话1的两个insert语句都立马执行成功

select * from t1; //返回结果为插入后的状态

2.3.3.1.2 验证从库RW

前提:

主从t1表里有一条id为1的数据。

节点1-会话1

节点2-会话1

 set sql_log_bin=0;

set global super_read_only=off;

lock table t1 write;

 insert into t1 values (11); //出现阻塞,超时没报错

insert into t1 values (11); //写成功

 insert into t2(id) values(5); //在②阻塞期间,在其他表写入数据也出现阻塞,进程state是waiting for handler commit

unlock tables;  //unlock后,节点1会话1的两个insert语句都立马执行成功,节点1会话1 insert 11没报主键冲突的错

select * from t1; //报错:

3796 - The option group_replication_consistency cannot be used on the current member state.发现节点2组复制停止,重启组复制,复制报主键冲突的错误。在节点2上删除11这条记录,再启动组复制,就正常了。

2.3.3.2 验证delete大批数据

验证after情况下delete一个五百万条数据大表延迟情况:

节点1-会话1

节点1-会话2

节点2-会话1

① delete from t1 ;//删除大批数据,这里删除五百万数据历时103秒

② select count(*) from t1; //在①delete过程中,多次执行该sql,t1数据量一直是删除前的数据量,直到① delete完毕,这里变成0条数据,说明是同步复制,节点2删除完,节点1才执行成功。

③ select * from t2; //查询其他表,能正常查询

insert into t1(id) values(6000003); 

insert into t2(id) values(6); // ①执行期间,写入同一个表及其他表数据,都能正常写入

⑤select * from t1 where id=6000003;

select * from t2;  //①执行期间以,在节点2上查询同一个表及其他表,没有阻塞,都能看到数据同步过来,说明after不会等待之前的事务执行完才执行新事务,不会影响其他事务写入数据。after读性能比before好,写性能没before好。

Lock table和delete大批数据区别:

在节点2上lock表,在节点1上不仅该表无法写入,其他表也无法写入。

如果节点2不lock表,只在节点1上删除大批数据,不会影响其他事务数据写入。

我测试的在节点2上stop group_replication,节点1上能正常写入数据。节点2启动后,节点1的数据能同步过来。

2.3.4 验证before and after

set global group_replication_consistency='BEFORE_AND_AFTER';

show variables like '%group_replication_consistency%';

节点1-会话1

节点2-会话1

节点2-会话2

 lock table t1 read;

insert into t1 values (1); //产生阻塞

select * from t1;  //节点1会话1 insert阻塞期间,在节点2上查询该表,出现阻塞现象,如果超过wait_timeout设置的时间,报错:ERROR: 3797: Error while waiting for group transactions commit on group_replication_consistency= 'BEFORE'

select * from t2; //读一个没锁定的表也出现阻塞,说明RO事务会等待前面的事务应用完才能读取新事务。

unlock tables; //节点1会话1 insert阻塞期间,执行这个也阻塞了

select * from t1; //节点1会话1 insert执行完之后,这里能查出数据了

验证了delete大批数据,在从库delete成功后,主库才提交。

三 如何选型

MySQL :: MySQL 8.0 Reference Manual :: 20.5.3.2 Configuring Transaction Consistency Guarantees

Scenario 1 you want to load balance your reads without worrying about stale reads, your group write operations are considerably fewer than your group read operations. In this case, you should choose AFTER.

Scenario 2 you have a data set that applies a lot of writes and you want to do occasional reads without having to worry about reading stale data. In this case, you should choose BEFORE.

Scenario 3 you want specific transactions in your workload to always read up-to-date data from the group, so that whenever that sensitive data is updated (such as credentials for a file or similar data) you want to enforce that reads always read the most up to date value. In this case, you should choose BEFORE.

Scenario 4 you have a group that has predominantly read-only (RO) data, you want your read-write (RW) transactions to be applied everywhere once they commit, so that subsequent reads are done on up-to-date data that includes your latest writes and you do not pay the synchronization on every RO transaction, but only on RW ones. In this case, you should choose AFTER.

Scenario 5 you have a group that has predominantly read-only data, you want your read-write (RW) transactions to always read up-to-date data from the group and to be applied everywhere once they commit, so that subsequent reads are done on up-to-date data that includes your latest write and you do not pay the synchronization on every read-only (RO) transaction, but only on RW ones. In this case, you should choose BEFORE_AND_AFTER.

读多写少,建议选择after。

写多读少,建议选择before。

希望始终读取最新的数据,建议选择before。

业务场景主要是只读的,您希望您的读写(RW)事务在提交后应用于所有节点,以便对包括您最近写入的最新数据进行后续读取,建议选择after。

业务场景主要是只读的,您希望您的读写(RW)事务始终读取最新数据,并在提交后应用于所有节点,以便对包括您的最新写入在内的最新数据进行后续读取,建议选择BEFORE_AND_AFTER。

--本篇文章参考自:

组复制常规操作-事务一致性保证 | 全方位认识 MySQL 8.0 Group Replication-CSDN博客

MySQL :: MySQL 8.0 Reference Manual :: 20.5.3.2 Configuring Transaction Consistency Guarantees

有关MySQL组复制的事务一致性参数理解 - 简书
MySQL :: MySQL 8.0 Reference Manual :: 20.9.1 Group Replication System Variables

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/610801.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

海外多语言盲盒系统开发:加快盲盒企业出海

近几年,全球都进入到了潮玩文化发展期,在这种时代背景下,盲盒迅速发展,与消费者建立了深厚的情感连接,市场规模逐渐扩大。目前,我国盲盒企业纷纷布局海外市场,纵观海外庞大的发展空间&#xff0…

MathType7.6最新免费汉化版安装包下载地址

MathType是一款由Design Science公司开发的数学公式编辑器,被广泛用于编辑论文、书籍、报刊、数学试卷、演示文件等,是编辑数学资料的得力工具。以下是对MathType软件的详细介绍: 安装免费版MathType和mathtype7.4产品密钥 MTWE691-011524-9…

基于docker安装flink

文章目录 环境准备Flinkdocker-compose方式二进制部署 KafkaMysql Flink 执行 SQL命令进入SQL客户端CLI执行SQL查询表格模式变更日志模式Tableau模式窗口计算 窗口计算滚动窗口demo滑动窗口 踩坑 环境准备 Flink docker-compose方式 version: "3" services:jobman…

乡村振兴与城乡融合发展:加强城乡间经济、文化、社会等方面的交流与合作,推动城乡一体化发展,实现美丽乡村共荣

目录 一、引言 二、乡村振兴与城乡融合发展的意义 三、城乡交流合作的现状与挑战 (一)现状 (二)挑战 四、加强城乡交流合作的策略与路径 (一)完善城乡交流合作机制 (二)推动…

electron-vite工具打包后通过内置配置文件动态修改接口地址实现方法

系列文章目录 electronvitevue3 快速入门教程 文章目录 系列文章目录前言一、实现过程二、代码演示1.resources/env.json2.App.vue3.main/index.js4.request.js5.安装后修改 前言 使用electron-vite 工具开发项目打包完后每次要改接口地址都要重新打包,对于多环境…

后端的一些科普文章

后端开发一般有4个方面 后端开发流程 1阶段 域名认证 是每一个计算机在网络上有一个ip地址,可以通过这个地址来访问102.305.122.5(举例), 但是这个公网ip地址,比较难记忆,所以大家使用域名来更好的记忆…

越秀城投·星汇城 | 看得再多,都不如实景现房更安心

对于大多数家庭而言,买房是人生大事。经历了前几年房企暴雷、楼盘停工烂尾的风波,“现房”成为买房人心中最安心的代名词。无需再等待,所见即所得。 越秀城投星汇城位于平度南部新城核芯片区,不仅享受区域发展的利好,…

ArcGIS10.2系列许可到期解决方案

本文手机码字,不排版了。 昨晚(2021\12\17)12点后,收到很多学员反馈 ArcGIS10.2系列软件突然崩溃。更有的,今天全单位崩溃。 ​ 提示许可15天内到期。之前大部分许可是到2021年1月1日的。 ​ 后续的版本许可都是永久的…

[Kubernetes] 云原生 Istio 介绍

文章目录 1.Istio 介绍2.Istio 特征3.Istio 与服务治理4.Istio与Kubernetes4.1 Istio是Kubernetes的好帮手4.2 Kubernetes是Istio的好基座 5.Istio与服务网格5.1 时代选择服务网格5.2 服务网格选择Istio 1.Istio 介绍 服务网格是一个独立的基础设施层,用来处理服务之…

FastReID使用教程、踩坑记录

近期在尝试使用FastReID,期间对FastReID架构、损失函数、数据集准备、模型训练/评估/可视化/特征向量输出、调试debug记录等进行记录。 FastReID架构理解 关于FastReID的介绍,可点击此链接前往查询。 ReID和FastReID架构 对于模型架构、损失函数、实验…

鸿蒙ArkUI-X跨平台开发电商应用

一、ArkUI-X 简介 ArkUI-X 是由 OpenHarmony TSC - 跨平台应用开发框架 TSG 所孵化的开源项目,使用ArkUI-X可以让开发者基于一套主代码, 就可以构建支持多平台的精美、高性能应用。目前支持OpenHarmony、HarmonyOS、Android、 iOS,后续会逐步增加更多平台支持。 ArKUI跨平台…

Smma-net:一种基于音频线索的目标说话人提取网络,具有谱图匹配和相互关注功能

SMMA-NET: AN AUDIO CLUE-BASED TARGET SPEAKER EXTRACTION NETWORK WITH SPECTROGRAM MATCHING AND MUTUAL ATTENTION 第二章 目标说话人提取之《Smma-net:一种基于音频线索的目标说话人提取网络,具有谱图匹配和相互关注功能》 文章目录 SMMA-NET: AN AUDIO CLUE-…

星途重启:244亿公里外的「旅行者1号」,修好了

2024年4月20日,旅行者1号工程团队时隔5个月,终于重新收到了来自47年前所发射的探测器传回的有效数据。 ▲收到数据当天,工程团队成员在NASA喷气动力实验室的会议室中欢呼。 01.关于旅行者1号 在当下5G和WIFI已经普及的时代,NASA喷…

力扣2105---给植物浇水II(Java、模拟、双指针)

题目描述: Alice 和 Bob 打算给花园里的 n 株植物浇水。植物排成一行,从左到右进行标记,编号从 0 到 n - 1 。其中,第 i 株植物的位置是 x i 。 每一株植物都需要浇特定量的水。Alice 和 Bob 每人有一个水罐,最初是…

debian testing (预计13版本)wps字体无法正常显示

背 景 本人使用debian办公,原来使用的是debian 12,由于“生命不息,折腾不止“,终于将稳定版的debian 12升级为testing. 结果发现,debian 12能够正常使用的wps存在部分字体无法正常显示,经研究发现,原来是w…

The Sandbox 与 Cuisinia 合作推出全新体验!

与 Cuisinia 一起吃 Voxel! 召唤所有美食家和游戏玩家!准备好在 Cuisinia x The Sandbox Moodie 挑战赛中挑逗你的味蕾,考验你的技能!加入我们的美味探险,品尝充满活力的泰国美食。 为什么选择 Cuisinia? …

图像锐化——非锐化掩膜USM和锐化掩膜SM(附代码)

非锐化掩膜 (USM) 和锐化掩膜 (SM) 都是常用的图像锐化技术。它们都可以通过增强图像的边缘信息来提高图像的清晰度。 目录 一、非锐化掩膜USM1.1 USM原理1.2 USM实现步骤1.3 优点1.4 代码 二、锐化掩膜SM2.1 SM原理2.2 SM实现步骤2.3 优点2.4 代码 三、锐化效果四、总结4.1 效…

vue 代码样式问题

部分电脑存在样式错乱问题&#xff0c;部分电脑样式正常。最后发现是样式写在 el-col 里面导致的。 注意&#xff1a;写样式不要放在 el-row 或者 el-row &#xff0c;导致部分电脑会出现莫名其妙的样式问题 <el-row class"detail"><el-col class"it…

在RK3588开发板使用FFMpeg 结合云服务器加SRS实现摄像头数据推流到云端拱其他设备查看

今天测试了一把在开发板把摄像头数据推流到云端服务器&#xff0c;然后给其他电脑通过val软件拉取显示摄像头画面&#xff0c;浅浅记录一下大概步骤 1.开发板端先下载ffmpeg apt install ffmpeg2.云服务器先安装SRS的库 云服务器我使用ubuntu系统&#xff0c;SRS是个什么东西&…

扫码查看文件是如何实现的?文件活码在线生成的方法

现在很多场景下会通过扫码的方式来查看文件&#xff0c;这种方式可以让更多的人同时通过扫码的方式来查看二维码&#xff0c;有利于文件的快速分享以及用户获取内容的个人体验&#xff0c;而且可以保护文件的安全性&#xff0c;那么如何制作文件二维码呢&#xff1f; 文件二维…
最新文章