MySQL 的半同步模式

目录

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 mysqldmysql> 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.mzph.cn/web/51255.shtml

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

相关文章

在树莓派5上使用pytroch进行模型训练—全流程笔记

在树莓派上运行pytroch模型🚀 在完成了树莓派的一系列基础配置学习之后,按照规划,下一步要做的就是在树莓派上安装一个pytorch,尝试运行一下深度学习的模型,如果可以实现且准速度有一定保证的话,就可以作为…

使用Qt+Visual Stuidio写一个简单的音乐播放器(1)

1.使用QMediaPlayer播放音乐 第三步:在代码头部加上: #include <QtMultimedia/QMediaPlayer> // VS向.pro文件添加代码的方式 #pragma execution_character_set("utf-8") // qt支持显示中文 QMediaPlayer类是一个高级媒体播放类。它可以用来播放歌曲、电…

超分CAMixerSR 使用笔记

目录 超分CAMixerSR 笔记 自己改进的图例示例: 修改目录: 设置预训练模型: 超分CAMixerSR 笔记 自己改进的图例示例: 修改目录: codes/basicsr改为codes/basicsr_m 设置预训练模型: path:pretrain_network_g: F:\project\chaofen\CAMixerSR-main\pretrained_mode…

C++初学(14)

14.1、while循环 和for循环相比&#xff0c;while循环没有初始化和更新部分&#xff0c;它只有测试条件和循环体。 while(text-condition)body首先程序计算圆括号内的测试条件&#xff08;text-condition&#xff09;表达式。如果该表达式为ture&#xff0c;则执行循环体中的…

Docker快速上手

Docker 前言一、基本组成二、常用命令2.1 Docker服务2.2 image相关命令2.3 Container相关命令 三、Docker Volume 容器卷3.1 匿名挂载3.2 具名挂载 四、Docker 网络模式4.1 bridge桥接模式4.2 host主机模式4.3 None模式4.4 Container模式4.5 Customer模式 前言 本篇文章不再赘…

读软件开发安全之道:概念、设计与实施08密码学(下)

1. 对称加密 1.1. symmetric encryption 1.2. 使用各方共享的密钥来隐藏数据 1.2.1. 对称加密在本质上依赖共享密钥 1.3. 所有加密都是通过对明文进行转换&#xff0c;把明文消息&#xff08;或者原始消息&#xff09;变成无法识别的形式&#xff08;也称为密文&#xff09…

我的CSDN-----第128天创作纪念日

机缘 起初的我&#xff0c;是为了在学习代码的过程中通过写博客的方式来巩固自己的知识。后来在遇到不会的问题时可以在csdn上面查找&#xff0c;寻求一点思路&#xff0c;将学到的知识通过博客的方式呈现出来。 收获 每当发布一篇博客后&#xff0c;就会收到很多人的评论加关…

Adobe Animate (AN)软件安装,硬件配置(附安装包)

目录 一、Adobe An 软件简介 Adobe An 软件的特点 Adobe An 软件的优势 下载 二、Adobe An 软件安装 安装前的准备工作 安装过程中的注意事项 安装后的设置 三、Adobe An 软件使用 高级动画技巧 交互设计 优化与性能提升 四、Adobe An 软件快捷键 选择工具快捷键…

Linux 下命令行参数和环境变量

Linux 下命令行参数和环境变量 命令行参数为什么要有命令行参数谁可以做到结论 环境变量一些现象查看环境变量添加环境变量添加内存级环境变量永久有效 其他环境变量HOMEPWDSHELLHISTSIZE 自定义环境变量定义取消 本地变量整体理解环境变量环境变量的组织方式Linux 代码获取环境…

【机器人学】7-2.六自由度机器人自干涉检测-计算圆柱体的上下圆心坐标【附MATLAB代码】

目录 前言 机械臂几何参数 机器等效圆柱体坐标确定 MATLAB代码 前言 上一章介绍了机器人自干涉检测的总体算法&#xff0c;提出了算法的三个核心&#xff1a; 一 根据机械臂的几何数据以及DH参数&#xff0c;确定机械臂等效的圆柱体的上下圆心坐标。 二 将一个圆柱体旋转到…

vue.js - 看板娘 Live2d

文中的资源文件在这里&#xff1a;我的资源中&#xff0c;打好包了已经&#xff0c;地址&#xff1a;live2d资源 1、在项目的 src/assets 文件夹中&#xff0c;添加 live2d 的资源文件 2、在 src/components 文件中&#xff0c;编写 live2d的index.vue组件 3、在 App.vue 中…

【重点】人工智能大语言模型技术发展研究报告2024|附下载

人工智能作为引领新一轮科技产业革命的战略性技术和新质生产力重要驱动力&#xff0c;正在引发经济、社会、文化等领域的变革和重塑。 2023 年以来&#xff0c;以ChatGPT、GPT-4 为代表的大模型技术的出台&#xff0c;因其强大的内容生成及多轮对话能力&#xff0c;引发全球新…

MYSQL————数据库的约束

1.约束类型 1.not null&#xff1a;指示某列不能存储null值 2.unique&#xff1a;保证某列的每行必须有唯一值 3.default&#xff1a;规定没有给列赋值时的默认值 4.primary key&#xff1a;not null和unique的结合。确保某列&#xff08;或两个或多个列的结合&#xff09;有唯…

聊聊最近很火的后端即服务

最近&#xff0c;你可能经常听到“后端即服务”&#xff08;Backend as a Service, BaaS&#xff09;这个词。不论是在技术论坛上&#xff0c;还是在开发者社区&#xff0c;BaaS都成了大家讨论的热点。究竟是什么让这个概念如此火爆&#xff1f;今天我们就来聊聊这个话题&#…

TCP粘包和抓包

在 TCP 套接字中&#xff0c;发送和接收缓冲区用于暂存数据&#xff0c;以确保数据的可靠传输。具体来说&#xff0c;TCP 的 socket 收发缓冲区的主要特点和概念如下&#xff1a; 1. 发送缓冲区&#xff08;Send Buffer&#xff09; 定义: 发送缓冲区用于存储待发送的数据。应…

大模型从入门到精通——词向量及知识库介绍

词向量及知识库介绍 1.词向量 1.1 什么是词向量 词向量是一种将单词表示为实数向量的方式。每个单词通过一个高维向量来表示&#xff0c;向量的每一维都是一个实数&#xff0c;这些向量通常位于一个高维空间中。词向量的目标是将语义相似的单词映射到相邻的向量空间中&#…

自定义@ResponseBody以及SpringMVC总结

文章目录 1.需求分析2.目录3.自定义ResponseBody注解4.MonsterController.java5.Monster.java 实现序列化接口6.引入jackson7.Adapter.java 如果有ResponseBody注解就返回json8.测试9.SpringMVC执行流程 1.需求分析 2.目录 3.自定义ResponseBody注解 package com.sunxiansheng…

24暑假算法刷题 | Day39 | 动态规划 VII | LeetCode 198. 打家劫舍,213. 打家劫舍 II,337. 打家劫舍 III

目录 198. 打家劫舍题目描述题解 213. 打家劫舍 II题目描述题解 337. 打家劫舍 III题目描述题解 打家劫舍的一天 &#x1f608; 198. 打家劫舍 点此跳转题目链接 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷…

(贪心) LeetCode 135. 分发糖果

原题链接 一. 题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。 相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xf…

OpenCV与AI深度学习 | 基于改进YOLOv8的景区行人检测算法

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;基于改进YOLOv8的景区行人检测算法 作者&#xff1a;贵向泉&#xff0c;刘世清&#xff0c;李立等 来源&#xff1a;《计算机工程》期刊 编…