MySQL 的半同步模式

news2024/12/29 14:36:50

目录

1 半同步简介: 解决主从数据一致性问题

2 实现半同步模式实践操作

2.1 MASTER

2.2 SLAVE 1

2.3 SLAVE 2 

2.4 查看client链接状态 

2.5 SLAVE 服务器故障模拟

2.5.1 停止 SLAVE 的 IO_THREAD 

2.5.2 查看SLAVE 的IO线程是否关闭 

2.5.3 查看 MASTER 上 client 的连接状态

2.5.4 在MASTER端插入数据

2.5.5 MASTER 还能写入数据的原因


1 半同步简介: 解决主从数据一致性问题

MySQL 半同步复制是一种机制,旨在解决主从数据的一致性问题。它的主要目标是在主服务器提交事务之前等待至少一个从服务器确认收到了该事务的二进制日志事件。这样可以确保主服务器上的事务在从服务器上至少有一个副本,从而提高数据可靠性。

在默认情况下,MySQL的复制是异步的,这意味着主服务器及其从服务器是独立的。异步复制可以提供最佳的性能,因为主服务器在将更新的数据写入它的二进制日志(Binlog)文件中后,无需等待验证更新数据是否已经复制到从服务器中,就可以自由处理其它进入的事务处理请求。但这也同时带来了很高的风险,如果在主服务器或从服务器端发生故障,会造成主从数据的不一致,甚至在恢复时造成数据丢失。

从MySQL5.5开始引入了一种半同步复制功能,该功能可以确保主服务器和访问链中至少一台从服务器之间的数据一致性和冗余。在这种配置结构中,一台主服务器和其许多从服务器都进行了配置,这样在复制拓扑中,至少有一台从服务器在父主服务器进行事务处理前,必须确认更新已经收到并写入了其中继日志 (Relay Log)。当出现超时,源主服务器必须暂时切换到异步复制模式重新复制,直到至少有一台设置为半同步复制模式的从服务器及时收到信息。 继5.5半同步复制后,MySQL5.6又对其进行了优化和改进,其中有两个地方较为重要:

1> 在主从切换后,在传统的方式里,需要找到binlog和POS点,然后更改master指向,而在mysql5.6里,你无须再知道binlog和POS点,你只需要知道master的IP、端口,账号密码即可,因为同步复制是自动的,mysql通过内部机制GTID自动找点同步。 ​

2> 多线程复制,以前的版本,同步复制是单线程的,只能一个一个执行,在MySQL5.6里,可以做到多个库之间的多线程复制,但一个库里的表,多线程复制是无效的。

1.用户线程写入完成后master中的dump会把日志推送到slave

2.slave中的io线程接收后保存到relaylog中继日志

3.保存完成后slavemaster端返回ack

4.在未接受到slaveackmaster端时不做提交的,一直处于等待当收到ack后提交到存储引擎

5.5.6版本中用到的时after_commit模式,after_commit模式时先提交在等待ack返回后输出ok

2 实现半同步模式实践操作

2.1 MASTER

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
    -> FROM INFORMATION_SCHEMA.PLUGINS
    -> WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME          | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE        |
+----------------------+---------------+

[root@mysql-01 ~]# vim /etc/my.cnf 

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
log_bin=mysql-bin
server_id=10
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_master_enabled=1    # 增加模块 master 端自启动 


[root@mysql-01 ~]# systemctl restart mysqld


# 查看模块是否安装成功
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
    -> FROM INFORMATION_SCHEMA.PLUGINS
    -> WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME          | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE        |
+----------------------+---------------+

mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 10000      |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     |  -- (1) 表示当前有多少个从服务器客户端正在进行半同步复制。
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |  -- (2) 表示主服务器在等待从服务器确认时网络平均等待时间(毫秒)。这里的值为0,表示没有平均网络等待时间。
| Rpl_semi_sync_master_net_wait_time         | 0     |  -- (3) 表示主服务器在网络等待上的总时间(毫秒)。这里的值同样为0,表示没有总的网络等待时间。
| Rpl_semi_sync_master_net_waits             | 0     |  -- (4) 表示主服务器因网络原因等待的次数。这里的值为0,表示没有因网络原因导致的等待。
| Rpl_semi_sync_master_no_times              | 0     |  -- (5) 表示主服务器没有等待任何从服务器确认的次数。这里的值为0,表示所有事务都至少等待了一个从服务器的确认。
| Rpl_semi_sync_master_no_tx                 | 0     |  -- (6) 表示主服务器没有提交任何事务的次数。这里的值为0,表示所有事务都进行了半同步复制。
| Rpl_semi_sync_master_status                | ON    |  -- (7) 表示半同步复制当前是否启用。在这里,半同步复制是启用的。
| Rpl_semi_sync_master_timefunc_failures     | 0     |  -- (8) 表示由于时间函数失败而导致半同步复制失败的次数。这里的值为0,表示没有时间函数失败。
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |  -- (9) 表示主服务器在等待从服务器确认事务时的平均等待时间(毫秒)。这里的值为0,表示没有平均等待时间。
| Rpl_semi_sync_master_tx_wait_time          | 0     |  -- (10) 表示主服务器等待从服务器确认事务的总等待时间(毫秒)。这里的值为0,表示没有总的等待时间。
| Rpl_semi_sync_master_tx_waits              | 0     |  -- (11) 表示主服务器等待从服务器确认事务的次数。这里的值为0,表示没有等待时间。
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |  -- (12) 表示主服务器在等待从服务器确认时回溯binlog位置的次数。这里的值为0,表示没有回溯binlog位置。
| Rpl_semi_sync_master_wait_sessions         | 0     |  -- (13) 表示主服务器等待从服务器确认事务时涉及的会话数量。这里的值为0,表示没有等待会话。
| Rpl_semi_sync_master_yes_tx                | 0     |  -- (14) 表示主服务器成功提交事务并得到从服务器确认的次数。这里的值为0,表示没有事务成功提交并得到确认。
+--------------------------------------------+-------+

2.2 SLAVE 1

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

[root@mysql-02 ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server_id=20
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_slave_enabled=1

[root@mysql-02 ~]# systemctl restart mysqld

[root@mysql-02 ~]# mysql -uroot -pOpenlab123!

mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';  # 查看模块是否加载
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+

2.3 SLAVE 2 

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

[root@mysql-02 ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server_id=30
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_slave_enabled=1

[root@mysql-02 ~]# systemctl restart mysqld

[root@mysql-02 ~]# mysql -uroot -pOpenlab123!

mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';  # 查看模块是否加载
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+

2.4 查看client链接状态 

再次回到MASTER

[root@mysql-01 ~]# systemctl restart mysqld


mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 2     |  # 发现链接客户端变成了两个
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+--------------------------------------------+-------+

2.5 SLAVE 服务器故障模拟

2.5.1 停止 SLAVE 的 IO_THREAD 

# SLAVE 1
mysql> STOP SLAVE IO_THREAD;
mysql> SHOW SLAVE STATUS\G

# SLAVE 2 
mysql> STOP SLAVE IO_THREAD;
mysql> SHOW SLAVE STATUS\G

2.5.2 查看SLAVE 的IO线程是否关闭 

2.5.3 查看 MASTER 上 client 的连接状态

mysql> SHOW STATUS LIKE 'Rpl_semi%';

2.5.4 在MASTER端插入数据

mysql> insert into wawa values(7,'www.shuyan');
Query OK, 1 row affected (10.00 sec)

                                    # 会卡住十秒钟然后从同步转为异步,再插入数据
mysql> SELECT * FROM wawa;
+----+-----------------+
| id | name            |
+----+-----------------+
|  1 | wawa            |
|  2 | shuyan          |
|  3 | shuyan and wawa |
|  4 | shuyan--------  |
|  5 | shuyan.com      |
|  6 | 12333           |
|  7 | www.shuyan      |
+----+-----------------+

mysql> SHOW STATUS LIKE 'Rpl_semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 1     |
| Rpl_semi_sync_master_no_tx                 | 1     | # 一笔数据为同步
| Rpl_semi_sync_master_status                | OFF   | # 自动转为异步模式,等待slave恢复
| Rpl_semi_sync_master_timefunc_failures     | 0     | # 会自动恢复
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

2.5.5 MASTER 还能写入数据的原因

为什么还能写入呢?是因为他在超过超时时间的时候,模式由同步模式转为异步模式

开启从服务器的 IO_THREAD 线程

# SLAVE 1
mysql> start slave io_thread;
# SLAVE 2
mysql> start slave io_thread;


# 在SLAVE上发现数据已经同步过来了
mysql> select * from shuyan.wawa;
+----+-----------------+
| id | name            |
+----+-----------------+
|  1 | wawa            |
|  2 | shuyan          |
|  3 | shuyan and wawa |
|  4 | shuyan--------  |
|  5 | shuyan.com      |
|  6 | 12333           |
|  7 | www.shuyan      |
+----+-----------------+

在从服务器开启半同步复制时,主服务器会在等待从服务器响应之前设置一个超时时间。如果超过这个时间还没有收到从服务器的响应,主服务器会自动转换为异步模式。当从服务器恢复连接时,它会自动接收到主服务器在此期间插入的所有数据。

当从服务器IO_THREAD 线程 恢复连接时,从服务器会按照 GTID 的顺序接收并应用来自主服务器的事务。

当从服务器的 I/O 线程恢复连接时,它会查找 gtid_executed 列表中缺失的 GTID,并从相应的二进制日志文件和位置开始复制。这样,从服务器会按照 GTID 的顺序接收并应用来自主服务器的事务,从而保证数据的一致性和完整性

MySQL 半同步复制可以通过 GTID(全局事务标识符)来比对数据。当从服务器恢复连接时,它会根据 GTID 查找主服务器上尚未应用的事务,并自动接收到这些事务。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

专业视频编辑和制作软件Adobe Media Encoder(ME)win/mac下载安装和软件介绍

一、软件概述 1.1 软件简介 Adobe Media Encoder(ME)是由Adobe公司开发的一款专业视频编辑和制作软件,全称为Media Encoder,是Creative Cloud套件中的一个重要组件。Adobe ME以其强大的视频编码、转码、调整、剪辑、合成等功能&…

解决git checkout -b 拉取远端某分支到本地时报错

问题描述 日常开发场景中,经常会出现切分支的情况,所以git checkout 命令是非常高频的 git checkout -b feature/xxx默认情况下,这条命令是基于当前所在分支来开辟新分支feature/xxx 但是,还有一些情况,我们需要基于…

比Maven快2~10倍的编译工具mvnd简介与实战

概述 maven-mvnd,可简称(或缩写)mvnd,the Maven Daemon。Apache Maven团队借鉴Gradle和Takari后开发的更快的构建工具。mvnd内嵌Maven,开发者可无缝从Maven迁移到mvnd。 参考资料:GitHub。 mvnd中会启动…

C++ | Leetcode C++题解之第368题最大整除子集

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> largestDivisibleSubset(vector<int>& nums) {int len nums.size();sort(nums.begin(), nums.end());// 第 1 步&#xff1a;动态规划找出最大子集的个数、最大子集中的最大整数vect…

『基础』线性代数-1行列式

行列式是什么-运算规则 排列&#xff1a;不同的 n 元排列共有 n! 个 逆序&#xff1a;小数排在大数后面&#xff0c;叫逆序&#xff1b;一个排列中逆序的总和叫做这个排列的逆序数&#xff0c;记为 τ ( j 1 , . . . , j n ) \tau(j_1,...,j_n) τ(j1​,...,jn​) 逆序数的计…

MySQL笔记01: MySQL入门_1.2 MySQL下载安装与配置

2.2 MySQL下载安装与配置 2.2.1 MySQL下载 MySQL中文官网&#xff1a;https://www.mysql.com/cn/ MySQL英文官网&#xff1a;https://www.mysql.com/ MySQL官网下载地址&#xff1a;https://www.mysql.com/downloads/ &#xff08;1&#xff09;点击“MySQL Community (GPL) Do…

WPF—画刷(使用画刷实现背景颜色渐变效果)

WPF—画刷(使用画刷实现背景颜色渐变效果) 在WPF中我们可以使用画刷来对我们的页面做出各种炫丽的效果&#xff0c;列如渐变&#xff0c;渲染等&#xff0c; 下列就为大家分享2个渐变效果示例&#xff1a; 实例1(由内到外) <Grid><!--背景颜色渐变 画刷--><G…

【项目】微服务及时通讯系统:编写核心类

文章目录 前言1. 核心数据结构1.1 用户信息1.2 会话信息1.3 消息信息 2. 建立目录3. 编写代码3.1 用户信息3.2 会话信息3.3 消息信息3.4 工具函数 4. data.h 完整代码总结 前言 在构建现代微服务架构的即时通讯系统时&#xff0c;核心数据结构的设计是至关重要的。它们不仅决定…

聊一聊AI能够应用在哪些地方

AI大模型的应用场景极为广泛&#xff0c;涵盖了众多行业和领域&#xff0c;以下是一些主要的应用场景&#xff1a; 1. 自然语言处理&#xff08;NLP&#xff09; 对话系统&#xff1a;如智能客服、虚拟助手等&#xff0c;通过自然语言与用户进行交互&#xff0c;提供信息查询…

探索AI大模型量化前沿技术:引领智能计算新潮流

大型语言模型&#xff08;LLMs&#xff09;通常因为体积过大而无法在消费级硬件上运行。这些模型可能包含数十亿个参数&#xff0c;通常需要配备大量显存的GPU来加速推理过程。 因此越来越多的研究致力于通过改进训练、使用适配器等方法来缩小这些模型的体积。在这一领域中&am…

【CAN总线测试】——通讯相关诊断测试

从0开始学习CANoe使用 从0开始学习车载测试 相信时间的力量 星光不负赶路者&#xff0c;时光不负有心人。 目录 1.节点超时故障 2.Busoff故障码测试 3.Busoff 状态下超时故障监测测试 4.欠压故障测试 5.过压故障测试 1.节点超时故障 用例编号 TG4_TC1 测试目的 检测D…

从零开始搭建 LVS 高可用集群 (单机)

从零开始搭建 LVS 高可用集群 (单机) 背景 从零开始搭建 LVS 高性能集群 (DR模式) 从零开始搭建 KeepalaivedLvs 高可用集群 &#xff08;Aliyun部署&#xff09; 经过前面2篇关于lvs集群部署文章&#xff0c;相信跟着部署文档&#xff0c;实际部署过集群的大家对lvs服务有了…

【html+css 绚丽Loading】000015 九转轮回珠

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

Total Uninstall - 专业 Windows 卸载清理工具,让软件卸载更彻底

Total Uninstall 是一款专业的卸载清理工具&#xff0c;可帮助我们无残留卸载各类软件。 这款工具相当强大&#xff0c;卸载能做到彻底清除软件痕迹&#xff0c;同时具备软件分析、安装记录、系统清理、软件备份搬家等多种功能。 软件支持买前免费试用&#xff0c;感兴趣的朋友…

新疆旅游今年为什么这么火热?

今年新疆旅游火爆全网&#xff0c;不夸张的说&#xff0c;打开朋友圈&#xff0c;几乎一半人在新疆旅游、还有一半人在去新疆旅游的路上。 大家也纷纷在小红书上晒出新疆相关的笔记&#xff0c;覆盖旅游、美食、穿搭、养生、摄影等众多热门行业&#xff0c;相关话题多次登上小…

MySQL从入门到精通(第5-8章)

文章目录 5 排序与分页5.1 排序数据5.1.1 排序规则5.1.2 单列排序5.1.3 多列排序 5.2 分页5.2.1 实现规则5.2.2 拓展 6 多表查询6.1 笛卡尔积6.1.1 笛卡尔积&#xff08;或交叉连接&#xff09;的理解6.1.2 笛卡尔积可能存在的问题与解决 6.2 多表查询分类讲解6.2.1 等值连接与…

AI如何让销售更智能更精确?AI赋能销售的全流程深度解析

前言 随着人工智能&#xff08;AI&#xff09;技术的迅速发展&#xff0c;AI已经渗透到各个行业&#xff0c;尤其是在销售领域&#xff0c;AI正通过智能化外呼系统与CRM&#xff08;客户关系管理&#xff09;系统的结合&#xff0c;极大提升了企业的销售效率。在这篇文章中&am…

C++动态规划及九种背包问题

目录 目录 一&#xff0c;动态规划 一&#xff09;&#xff0c;动态规划的定义 二&#xff09;&#xff0c;动态规划其他的相关概念&#xff08;也是使用条件&#xff09; 1&#xff0c;重叠子问题 2&#xff0c; 最优子结构 3&#xff0c;无后效性 三&#xff09;&…

C++ 设计模式——观察者模式

观察者模式 观察者模式主要组成部分例一&#xff1a;工作流程第一步&#xff1a;定义观察者接口第二步&#xff1a;定义主题接口第三步&#xff1a;实现具体主题第四步&#xff1a;实现具体观察者第五步&#xff1a;主函数UML 图UML 图解析 例二&#xff1a;工作流程第一步&…

rocky linux配置说明

下载&#xff1a; 目前最新版的 v9.4 镜像 Download - Rocky Linux 可以在官网下载&#xff0c;不过挺慢的&#xff0c;可以试试阿里云的https://mirrors.aliyun.com/rockylinux/会稍快点 安装&#xff1a; 其步骤和centos基本一样&#xff0c;其中磁盘分区模式是gpt这个并未…