mysql的半同步模式

1.半同步模式原理

mysql的主备库通过binlog日志保持一致,主库本地执行完事务,binlog日志落盘后即返回给用户;备库通过拉取主库binlog日志来同步主库的操作。默认情况下,主库与备库并没有严格的同步,因此存在一定的概率备库与主库的数据是不对等的。半同步特性的出现,就是为了保证在任何时刻主备数据一致的问题。相对于异步复制,半同步复制要求执行的每一个事务,都要求至少有一个备库成功接收后,才返回给用户。实现原理也很简单,主库本地执行完毕后,等待备库的响应消息(包含最新备库接收到的binlog(file,pos)),接收到备库响应消息后,再返回给用户,这样一个事务才算真正完成。在主库实例上,有一个专门的线程(ack_receiver)接收备库的响应消息,并以通知机制告知主库备库已经接收的日志,可以继续执行。

2.启用半同步模式

[root@mysql1 ~]# vim /etc/my.cnf配置完后要重新启动服务
[root@mysql1 ~]#/etc/init.d/mysqld restart

进入mysql:

#安装半同步插件
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';#打开半同步功能
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;#查看半同步功能状态
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     |
| 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     |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

slave端开启半同步功能:
[root@mysql1 ~]# vim /etc/my.cnf配置完后要重新启动服务
[root@mysql1 ~]#/etc/init.d/mysqld restart

进入mysql:

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.01 sec)mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;
Query OK, 0 rows affected (0.00 sec)mysql> STOP SLAVE IO_THREAD; #重启io线程,半同步才能生效
Query OK, 0 rows affected (0.00 sec)mysql> START SLAVE IO_THREAD; ##重启io线程,半同步才能生效
Query OK, 0 rows affected (0.00 sec)mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.01 sec)mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.00 sec)
3.测试
master端写入数据
mysql> insert into lee.userlist values ('xixi','123123');
Query OK, 1 row affected (0.01 sec)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             | 2     |
| Rpl_semi_sync_master_no_times              | 0     |  
| Rpl_semi_sync_master_no_tx                 | 0     |      #未同步数据0笔
| Rpl_semi_sync_master_status                | ON    |      #表示半同步复制启用中
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 981   |
| Rpl_semi_sync_master_tx_wait_time          | 981   |
| Rpl_semi_sync_master_tx_waits              | 1     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 1     |        #已同步数据1笔
+--------------------------------------------+-------+
模拟故障:
#在slave端10、20端都断开slave服务连接mysql> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)#在master端插入数据mysql> insert into lee.userlist values ('xixi','123123');
Query OK, 1 row affected (10.00 sec)                       #10秒超时,会卡住十秒钟然后从同步 转为异步,再插入数据mysql> SHOW STATUS LIKE 'Rpl_semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     |      连接人数变为0
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 2     |
| 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      | 981   |
| Rpl_semi_sync_master_tx_wait_time          | 981   |
| Rpl_semi_sync_master_tx_waits              | 1     |      #主服务器等待从服务器确认事务的次 数
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 1     |    #主服务器成功提交事务并得到从服务器 确认的次数
+--------------------------------------------+-------+
14 rows in set (0.00 sec)
4.gitd模式

注:当主服务器从宕机状态恢复时,从库会根据GTID顺序接收并应用来自主服务器的事务

配置参数时在master和slave都配置

参数:gtid_mode=ON   

           enforce-gtid-consistency=ON

1.基于 GTID 的主从复制方式的出现,主要是用于替换传统的日志点 复制方式。通过GTID 可以保证每个主库提交的事务在集群中都有 唯一 的一个事务 ID。


2.强化了数据库主从的一致性和故障恢复数据的容错能力,在主库宕机发生主从切换 的情况下,GTID 方式可以让其他从库自动找到新主库复制的位置。


3.而且 GTID 可以忽略已经执行过的事务,减少了数据发生错误的概率。


4.一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致;


5.GTID用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。而是使用MASTER_AUTO_POSTION=1的方式开始复制;


6.在GTID中【slave】端的binlog是必须开启的,目的是记录执行过的GTID(强制)。

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

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

相关文章

Python 生成随机的国内 ip

示例代码: import randomdef generate_random_cn_ip():# 中国大陆IP范围start_ip "36.54.0.0"end_ip "123.255.255.254"# 将IP地址转换为整数start_ip_num int(start_ip.replace(".", ""))end_ip_num int(end_ip.rep…

Python日志重复?这里有终极解决方案!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 日志重复的常见原因📝 解决重复日志的策略📝 具体示例📝 日志重复问题的其他解决办法⚓️ 相关链接 ⚓️📖 介绍 📖 你是否曾经在调试Python程序时,发现同样的日志信息出现了两次甚至更多?这不仅…

前端框架vue3中的条件渲染(v-show,v-if,v-else-if,v-else)

目录 v-show: 需求&#xff1a; v-if 区别与v-show&#xff1a; v-if和v-show的选择&#xff1a; v-else-if和v-else 联合使用&#xff1a; v-show: 部分代码如图&#xff1a; <body><div id"root"><div ><h1>n的值为{{n}}</h1>…

新学期第一课

文章目录 一、加入课程QQ群&#xff08;一&#xff09;班级QQ群&#xff08;二&#xff09;入群要求 二、加入学习通班级群&#xff08;一&#xff09;学习通班级群&#xff08;二&#xff09;手势签到 三、使用思维导图工具&#xff08;一&#xff09;安装XMind&#xff08;二…

【QT | 开发环境搭建】Linux系统(Ubuntu 18.04) 安装 QT 5.12.12 开发环境

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 2024-08-29 …

Kotaemon:开源的RAG UI

检索增强生成 (RAG) 已成为一种改变游戏规则的方法&#xff0c;可增强大型语言模型的功能。Kotaemon 是由 Cinnamon 开发的开源项目&#xff0c;它站在这项创新的最前沿&#xff0c;提供了一个简洁、可定制且功能丰富的基于 RAG 的用户界面&#xff0c;用于与文档聊天。 Kotae…

史记——我与历史的缘妙

究天人之际&#xff0c;通古今之变&#xff0c;成一家之言。 注解&#xff1a;这句话出自司马迁《史记》之《报任安书》。意思是通过“史实”现象揭示本质,探究自然现象和人类社会之间的相依相对关系。通晓从古到今的社会的各种发展演变,进而寻找历代王朝兴衰成败之道理。通过…

Mysql剖析(三)----MySql的事务详解

事务&#xff08;Transaction&#xff09;&#xff1a;一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中的各种数据项的一个程序执行单元&#xff08;unit&#xff09;。事务通常由高级数据库操纵语言或编程语言(如SQL、C或Java)书写的用户程序的执行所引…

设施农业气象站

设施农业气象站的主要作用是为农业生产提供准确的气象数据和预测信息&#xff0c;以帮助农民科学决策和管理农业生产活动。具体作用包括&#xff1a; 提供准确的气象数据&#xff1a;设施农业气象站可以收集并记录气温、湿度、风速、降水量等多种气象信息&#xff0c;并确保数据…

探索存储世界:TF卡与SD卡的奥秘

在这个数字化时代&#xff0c;数据存储变得至关重要。TF卡&#xff08;TransFlash卡&#xff09;和SD卡&#xff08;Secure Digital卡&#xff09;作为两种常见的存储介质&#xff0c;它们在我们的日常生活中扮演着重要角色。MK米客方德将带您深入了解TF卡的基本概念&#xff0…

Python全网最全基础课程笔记-(一)基础入门

本专栏系列为Pythong基础系列&#xff0c;每天都会更新新的内容&#xff0c;搜罗全网资源以及自己在学习和工作过程中的一些总结&#xff0c;可以说是非常详细和全面。 以至于为什么要写的这么详细&#xff1a;自己也是学过Python的&#xff0c;很多新手只是简单的过一篇语法&a…

如何从 AWS CodeCommit 迁移到极狐GitLab?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;可以私有化部署&#xff0c;对中文的支持非常友好&#xff0c;是专为中国程序员和企业推出的企业级一体化 DevOps 平台&#xff0c;一键就能安装成功。安装详情可以查看官网指南。 本文将分享如何从 AWS CodeCommit 服务无缝迁…

Gartner首次发布AI代码助手魔力象限,阿里云进入挑战者象限,通义灵码产品能力全面领先

8月29日消息&#xff0c;国际市场研究机构Gartner发布业界首个AI代码助手魔力象限&#xff0c;全球共12家企业入围&#xff0c;阿里云成为唯一进入挑战者象限的中国科技公司。通义灵码在产品功能和市场应用等方面表现优秀&#xff0c;获得权威机构认可。 该报告从技术创新性、产…

webpack--处理资源

在webpack.config.js中进行配置 const path require(path) module.exports {// 入口entry: ./src/main.js,// 输出output: {// 文件的输出路径path: path.resolve(__dirname, dist),// 入口文件打包输出的文件名filename: js/main.js,// 自动清空上次打包结果 原理&#xff…

Vidda电视X Ultra等加入能效补贴,京东天猫可买量大管饱

近日&#xff0c;“能效补贴”成为热门话题。打算给家里更换一台大电视的朋友要留意了&#xff0c;Vidda旗下多款巨屏电视都已支持此次补贴政策&#xff0c;京东和天猫均可下单享受补贴。 据「TMT星球」了解&#xff0c;Vidda是海信旗下的年轻科技潮牌&#xff0c;Vidda电视一…

BugKu练习记录:小山丘的秘密

题目&#xff1a; hill能有什么秘密呢 bugku{PLGTGBQHM} 其中A1&#xff0c;flag全为小写hill解密&#xff0c;a1&#xff0c;所以z0&#xff0c;字母表为zabcdefghijklmnopqrstuvwxy&#xff0c;根据图片上的棋子数得到对应的字母&#xff0c;分别是abczadefz&#xff0c;用工…

驱动开发系列14 - Linux Graphics Wayland 详解

目录 一:概述 二:操作系统如何支持 Wayland 三:显卡驱动如何支持 Wayland 四:Wayland 协议介绍 一:概述 Wayland 是一种通信协议,规定了显示服务器与其客户端之间的通信,以及该协议的 C 语言库实现。使用 Wayland 协议的显示服务器称为 Wayland 合成器,因…

Vue的冷门内置指令:优化与性能提升的利器

在Vue.js的广阔生态中&#xff0c;开发者们常常聚焦于那些耳熟能详的内置指令&#xff0c;如v-for用于循环渲染列表&#xff0c;v-if和v-else-if用于条件渲染等。然而&#xff0c;Vue还提供了一系列较为冷门但功能强大的内置指令&#xff0c;它们在某些特定场景下能够显著提升应…

Element-plus组件库基础组件使用

文章目录 按钮图标输入框表格表单对话框文件上传布局容器ElMessage消息提示MessageBox 消息提示框Pagination分页样式表单校验 记录vue3项目使用element-Plus&#xff0c;开发中常用的一些样式 下面这些组件是写增删改查是经常用到的&#xff0c;学习了这个写增删改查会好很多。…

实战docker第一天——windows安装docker,测试,并解决被墙办法

Docker 是一个开源的容器化平台&#xff0c;它允许开发者将应用程序及其所有依赖项打包在一个名为“容器”的单独环境中&#xff0c;从而确保应用程序在任何环境下都能一致地运行。以下是 Docker 的一些核心概念及其意义&#xff1a; 容器化&#xff1a;Docker 通过将应用程序及…