十三、MySQL基于GTID的半同步复制

目录

一、MySQL半同步复制

一、三种复制方式比较

1、异步复制

2、同步复制

3、半同步复制

4、半同步复制比较

5、半同步复制的特点

二、搭建半同步复制

1、如果不清楚Plugin的目录,用如下查找:

2、所有数据库服务器,安装半同步插件(semisync_master.so,semisync_slave.so)

3、检查是否安装成功

4、查看半同步相关信息

5、修改my.cnf文件,配置主从半同步复制

6、依次重启mysql的服务(master、slave1 、slave2)

7、查看半同步相关信息

8、监控(查看)半同步复制状态

9、测试

该操作必须在实现基于GTID的主从复制的基础上进行,详细请查看:十、MySQL主从架构配置-CSDN博客

一、MySQL半同步复制

一、三种复制方式比较

1、异步复制

        这是mysql默认的复制模式,异步复制是指主库写binlog、从库I/O线程读binlog并写入relaylog、从库sql线程重放事务。这三步之间是异步的。异步复制的优点是主库不需要关心备库的状态,主库不保证事务被传输到从库,如果主库崩溃,某些事务可能还未发送到从库,切换后可能导致事务的丢失。其优点是可以有更高的吞吐量,缺点是不能保持数据实时一致,不适合要求主从数据一致性要求高的应用场景。

2、同步复制

        同步复制的模式下,主库在提交事务前,必须确认事务在所有的备库上都已经完成提交,即主库是最后一个提交的。在提交前需要将事务传递给从库并完成重放、提交等一系列动作,其优点是任何时候主备库都是一致的。主库的崩溃不会丢失事务,缺点是由于主库需要等待备库先提交事务,吞吐量低。

3、半同步复制

        MySQL5.5 引入半同步复制,半同步复制介于异步复制和同步复制之间。主库在提交事务时先等待,必须确认至少一个从库收到了事件(从库将事件写入relaylog,不需要重放和提交,并向主库发送一个确认信息ACK),主库收到信息后才正式commit.

4、半同步复制比较

  1. 与同步复制相比,半同步复制速度快很多,因为他只需要至少1个从库确认写入relaylog,并不需要完成在从库上的事务提交。
  2. 与异步复制相比,半同步复制更安全,因为主库在提交时,事务至少已经存在2个地方(主库的binlog和从库的relaylog)。
  3. 由于半同步复制在提交事务前,需要从库返回确认信息,所以这里涉及到网络的往返通信开销,因此,半同步复制只适合在网络条件较好的且距离不远的环境部署,否则可能因为网络延迟大幅降低主库性能。

5、半同步复制的特点

  1. 从库在连接主库时需要表明它是否支持半同步复制。
  2. 如果主库启用了半同步复制,且有一个支持半同步复制的从库,则主库上事务提交将等待至少一个从库确认已收到事务,或者知道发生超时。
  3. 默认只有在将事务写入其中继日志并刷新到磁盘后,主库才会提交事务(也可以配置成提交后等待确认)。
  4. 如果没有任何从库确认事务的情况下发生超时,则主库将退化为异步复制。当至少有一个半同步从库赶上时,主库恢复半同步复制。退化与恢复过程都是自动的。
  5. 必须在主库和从库上都启用半同步复制,否则使用异步复制。

二、搭建半同步复制

        为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA的同时建议配置成mysql的半同步复制。

MHA配置详见:十一、MYSQL 基于MHA的高可用集群-CSDN博客

注意

        mysql半同步复制是以插件形式实现的,插件由Google提供,具体位/usr/lib64/mysql/plugin/下,一个是master用的semisync_master.so,一个是slave用的semisync_slave.so,要使用半同步复制,要在主从分别安装相应的插件,并且通过参数来控制半同步复制。

使用半同步需要满足的条件:

  • 服务器要支持动态加载。参数have_dynamic_loading要设置为True(MySQL8.0默认就是True)。

检查是否支持:

mysql> show variables like '%have_dynamic%';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| have_dynamic_loading | YES   |
+----------------------+-------+
1 row in set (0.01 sec)
  • 已经完成基础异步复制的配置

具体配置:

1、如果不清楚Plugin的目录,用如下查找:

mysql> show variables like '%plugin_dir%';
+---------------+--------------------------+
| Variable_name | Value                    |
+---------------+--------------------------+
| plugin_dir    | /usr/lib64/mysql/plugin/ |
+---------------+--------------------------+
1 row in set (0.02 sec)

mysql> 

2、所有数据库服务器,安装半同步插件(semisync_master.so,semisync_slave.so)

mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.02 sec)
MySQL 8.0.26以上版本执行下面命令:我的是mysql  Ver 8.0.16  再此不做演示
mysql> install plugin rpl_semi_sync_source soname 'semisync_source.so';

mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.00 sec)
MySQL 8.0.26以上版本执行下面命令:我的是mysql  Ver 8.0.16  再此不做演示
mysql> install plugin rpl_semi_sync_replica soname 'semisync_replica.so';

3、检查是否安装成功

mysql> show plugins;
+---------------------------------+----------+--------------------+--------------------+---------+
| Name                            | Status   | Type               | Library            | License |
+---------------------------------+----------+--------------------+--------------------+---------+


| rpl_semi_sync_master            | ACTIVE   | REPLICATION        | semisync_master.so | GPL     |
| rpl_semi_sync_slave             | ACTIVE   | REPLICATION        | semisync_slave.so  | GPL     |
+---------------------------------+----------+--------------------+--------------------+---------+
46 rows in set (0.00 sec)
或者使用:select * from information_schema.plugins\G;

4、查看半同步相关信息

mysql> show status like 'rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | OFF   |
+-----------------------------+-------+
1 row in set (0.01 sec)
或者
mysql> show variables like '%rpl_semi_sync%';  详解见下方
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | OFF        |
| 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 |
| rpl_semi_sync_slave_enabled               | OFF        |
| rpl_semi_sync_slave_trace_level           | 32         |
+-------------------------------------------+------------+
8 rows in set (0.01 sec)
从上面信息可以看到 半同步复制的插件已经安装,只是没有启用,所以是OFF状态。

5、修改my.cnf文件,配置主从半同步复制

master 主机上
[root@rabbitmq_1 etc]# vim my.cnf
[mysqld]

rpl_semi_sync_master_enabled=1  #1表示启用,0表示关闭
rpl_semi_sync_master_timeout=10000
 #毫秒单位,该参数主服务器等待确认消息10秒后,不在等待,变为异步方式。
rpl_semi_sync_slave_enabled=1

slave1 和slave2 上的my.cnf添加:
[root@rabbitmq_2 etc]# vim my.cnf
rpl_semi_sync_slave_enabled=1


# MySQL 8.0.26 版本以后 
slave 添加:
rpl_semi_sync_replica_enabled=1
然后:
stop slave io_thread; start slave thread;

然后在主库操作master添加:
rpl_semi_sync_source_enabled=1
rpl_semi_sync_source_timeout=10000
rpl_semi_sync_replica_enabled=1

-----在线开启
  

6、依次重启mysql的服务(master、slave1 、slave2)

[root@rabbitmq_1 etc]# systemctl restart mysqld.service
重启完成,先检查下主从复制是否有问题
登录从库,查看从库的状态是否为两个yes
             Slave_IO_Running: Connecting
            Slave_SQL_Running: Yes
这个是正在连接,过几秒在看 就yes了。
(root@localhost) [(none)]> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000131 |      515 |              |                  | d26ec757-adba-11ed-997d-000c297ca098:1-2 |
+------------------+----------+--------------+------------------+------------------------------------------+

7、查看半同步相关信息

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 |
| rpl_semi_sync_slave_enabled               | ON         |
| rpl_semi_sync_slave_trace_level           | 32         |
+-------------------------------------------+------------+
8 rows in set (0.00 sec)
可以看到半同步复制已经启用了(ON),搭建完成。
参数详解:
1、如果使用的是8.0.26以上的版本,参数中的'master'会被替换为'source','slave'会被替换为'replica',
rpl_semi_sync_master_enabled  #用来控制是否开启半同步复制,ON:开启,OFF:关闭
rpl_semi_sync_master_timeout  #主库等待从库ACK超时的时长,单位为毫秒,默认10000(10S)
rpl_semi_sync_master_trace_level #半同步复制时,主库的调试级别
rpl_semi_sync_master_wait_for_slave_count #主库需要收到多少个ACK才认为此次提交成功,否则就降级为异步复制,默认是1,即只要有1个从库确认即可提交。
rpl_semi_sync_master_wait_no_slave #为ON时(默认值),当状态变量Rpl_semi_sync_master_clients中的值小于rpl_semi_sync_master_wait_for_slave_count时(即从库数小于需要的最小确认数)Rpl_semi_sync_master_status依旧为ON,只有当事务提交后等待rpl_semi_sync_master_timeout超时后,Rpl_semi_sync_master_status才会变为OFF,即降级为异步复制;为OFF时,当状态变量Rpl_semi_sync_master_clients中的值小于rpl_semi_sync_master_wait_for_slave_count时,Rpl_semi_sync_master_status立即显示为OFF,即立即降级为异步复制。
rpl_semi_sync_master_wait_point  #控制主库上commit、接收ACK、返回控制给客户端的时间点。值为after_sync(默认)或after_commit。
    # after_sync:主库会等待从库的ACK后再提交事务,最后返还控制权给客户端。主库上所有会话同一时间看到提交的事务,如果发生failover,主从数据是一致的。
    # after_commit:主库会先提交事务,再等待ACK,最后返还控制权给客户端。主库会先提交,此时主库上其他会话可以看到已提交的事务,但执行事务的会话还未返还,依然在等待从库确认,如果从库因为崩溃没有处理这个事务,那么其他会话会在主从看到不一致的数据(主库事务提交了,从库的事务丢了)。

8、监控(查看)半同步复制状态

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     |
| Rpl_semi_sync_slave_status                 | OFF   |
+--------------------------------------------+-------+
15 rows in set (0.00 sec)
可以看到目前已经有2个slave服务器已经配置成了半同步模式。
参数详解:
Rpl_semi_sync_master_clients  #当前有多少个半同步从库连接到主库。
Rpl_semi_sync_master_net_avg_wait_time #主库等待从库回复的平均时间,以微秒为单位。此变量始终为0,不推荐使用,并且将在以后的版本中删除。
Rpl_semi_sync_master_net_wait_time  #主库等待从库回复的总时间,以微秒为单位。此变量始终为0,不推荐使用,并且将在以后的版本中删除。
Rpl_semi_sync_master_net_waits #主库等待从库回复的总次数。
 Rpl_semi_sync_master_no_times #主库关闭半同步复制的次数。
 Rpl_semi_sync_master_no_tx  #从库未成功确认的事务数。
 Rpl_semi_sync_master_status   #为ON时表示使用半同步复制,为OFF时表示异步复制。
 Rpl_semi_sync_master_tx_avg_wait_time:#主库等待一个事务的平均时间,以微秒为单位。
 Rpl_semi_sync_master_yes_tx:#从库成功确认的事务数。

9、测试

mysql> show databases;
+------------------------+
| Database               |
+------------------------+
| information_schema     |
| mysql                  |
| newtaxcontrol          |
| newtaxcontrol-activiti |
| newtaxcontrol-server   |
| newtaxcontrol-weixin   |
| online_invoice         |
| performance_schema     |
| sys                    |
| tax-disk               |
| tax-invoice            |
| taxctrldb              |
+------------------------+
12 rows in set (0.00 sec)
1、创建一个数据库
mysql> create database asd;
Query OK, 1 row affected (0.00 sec)
2、查看半同步复制状态
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     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 610   |
| Rpl_semi_sync_master_tx_wait_time          | 610   |
| 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     |
| Rpl_semi_sync_slave_status                 | OFF   |
+--------------------------------------------+-------+
15 rows in set (0.00 sec)
3、删除刚才创建的数据库
mysql> drop database asd;
Query OK, 0 rows affected (0.01 sec)
4、再查看状态
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             | 4     |
| 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      | 513   |
| Rpl_semi_sync_master_tx_wait_time          | 1027  |
| Rpl_semi_sync_master_tx_waits              | 2     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 2     |
| Rpl_semi_sync_slave_status                 | OFF   |
+--------------------------------------------+-------+
15 rows in set (0.01 sec)

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

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

相关文章

【Go实现】实践GoF的23种设计模式:解释器模式

上一篇:【Go实现】实践GoF的23种设计模式:适配器模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Pattern–Go-Implementation 简介 解释器模式(Interpreter Pat…

【STM32嵌入式系统设计与开发】——6矩阵按键应用(4x4)

这里写目录标题 一、任务描述二、任务实施1、SingleKey工程文件夹创建2、函数编辑(1)主函数编辑(2)LED IO初始化函数(LED_Init())(3)开发板矩阵键盘IO初始化(ExpKeyBordInit())&…

JVM本地方法

本地方法接口 NAtive Method就是一个java调用非java代码的接口 本地方法栈(Native Method Statck) Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。 本地方法栈,也是线程私有的。 允许被实现成固定或…

Matlab|基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究

目录 1 主要内容 目标函数 计算步骤 节点系统 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序完全复现文献《A Distributed Dual Consensus ADMM Based on Partition for DC-DOPF with Carbon Emission Trading》,建立了一个考虑碳排放交易的最优模型&am…

【测试开发学习历程】MySQL分组查询与子查询 + MySQL表的联结操作

目录 1 MySQL分组查询与子查询 1.1 数据分组查询 1.2 过滤分组 1.3 分组结果排序 1.4 select语句中子句的执行顺序 1.5 子查询 2 MySQL表的联结操作 2.1 关系表 2.2 表联结 2.3 笛卡尔积 2.4 内部联结 2.5 外联结 2.6 自联结 2.7 组合查询 1 MySQL分组查询与子查询…

Java学习路线一条龙

说在前面 讲真,虽然我是正规计算机专业出身,但十多年来,Java这语言和它那一大堆配套的工具、框架,变化得太快了。 我也是一边学新的,一边扔旧的,忙得不可开交。 现在回想起来,走过的弯路、浪费…

2024年【危险化学品经营单位安全管理人员】新版试题及危险化学品经营单位安全管理人员模拟考试题

题库来源:安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员新版试题考前必练!安全生产模拟考试一点通每个月更新危险化学品经营单位安全管理人员模拟考试题题目及答案!多做几遍,其实通过危险化学品经营单位安…

C++默认构造函数(二)

目录 构造函数补充 构造函数初始化列表的使用 赋值运算符重载函数 运算符重载函数介绍 运算符重载函数的使用 赋值运算符重载函数 赋值运算符重载函数的使用 拷贝构造函数和赋值运算符重载函数 重载前置和后置 前置 后置 重载流插入<<与流提取>> 流插…

ngrok实现内网穿透

在使用jenkins进行自动化部署时&#xff0c;需要设置github的webhook钩子来触发构建&#xff0c;由于jenkins运行在自己的电脑上&#xff0c;因此需要通过内网穿透来接受http请求。 Install ngrok via Homebrew with the following command: brew install ngrok/ngrok/ngrokP…

微信小程序开发学习笔记——4.2showModal和showLoading界面交互操作

>>跟着b站up主“咸虾米_”学习微信小程序开发中&#xff0c;把学习记录存到这方便后续查找。 课程连接&#xff1a;https://www.bilibili.com/video/BV19G4y1K74d?p27&vd_source9b149469177ab5fdc47515e14cf3cf74 一、showModal 显示模态对话框 1、属性 https:/…

电商爬虫系统|电商数据采集|电商API商品数据采集

1、基本的说明 当初为了在几个电商网站抓取商品信息数据搭建的系统。该系统主要用来抓取电商网站上面的一百个左右品类的商品的价格信息、商品信息和折扣信息等。抓取的电商网站主要是某宝和某东。其他的电商网站抓取信息的方式无外乎这两种。跟其他的示例代码不同&#xff0c…

【redis】服务器架构演进

架构演进 单机架构应用数据分离架构应⽤服务集群架构读写分离 / 主从分离架构冷热分离架构垂直分库微服务架构 单机架构 所有的应用服务、业务所需的数据、业务处理等都在一台服务器上。 在初期&#xff0c;用户访问量很少&#xff0c;对服务器的的性能和安全没有很高的要求&am…

抖音视频无水印批量下载软件|爬虫视频采集工具

抖音视频无水印批量下载软件&#xff0c;轻松实现视频提取和下载 概述&#xff1a; 想要快速、方便地提取和下载抖音视频无水印&#xff1f;我们的抖音视频无水印批量下载软件将是您的得力助手&#xff01;不仅支持通过关键词批量提取视频&#xff0c;还可以针对特定视频进行提…

Linux安装Nacos

安装前必要准备 准备Java环境 &#xff0c;8以上的版本&#xff0c;mysql&#xff08;集群相关信息&#xff09;&#xff0c;nginx&#xff08;进行代理&#xff09; 安装Nacos 首先我们要有一个nacos的包&#xff0c;我们可以在线下载&#xff0c;也可以提前下载好&#xf…

IRIS 和 Caché 是什么关系

我们都知道真正一个数据库通常是 2 个部分组成的&#xff0c;存储和进程。 Cach Cach 的定义就是一个数据库&#xff0c;在这个数据库中有存储和进程。 与我们常用的 MySQL 来说&#xff0c;我们安装好 MySQL 后我们就可以通过客户端进行连接了&#xff0c;同时我们还可以通过…

二叉树的链式结构和遍历(下)

又见面了&#xff0c;小伙伴们。今天我们继续来学习二叉树&#xff0c;今天的内容相对来说比较容易理解&#xff0c;前提是需要你们自己动手画图才会好理解。眼过千遍不如手过一遍。所以小伙伴们要多动手哦。直接开始今天的学习吧 1.二叉树链式结构的实现 1.1 前置说明 在学习…

Stability AI发布Stable Video 3D模型:可从单张图像创建多视图3D视频,视频扩散模型史诗级提升!

Stability AI发布了Stable Video 3D (SV3D)&#xff0c;这是一种基于稳定视频扩散的生成模型&#xff0c;推动了3D技术领域的发展&#xff0c;并大大提高了质量和视图一致性。 该版本有两个版本: SV3D_u:该变体基于单图像输入生成轨道视频&#xff0c;无需相机调节。 SV3D_p:扩…

鸿蒙Harmony应用开发—ArkTS(@Link装饰器:父子双向同步)

子组件中被Link装饰的变量与其父组件中对应的数据源建立双向数据绑定。 说明&#xff1a; 从API version 9开始&#xff0c;该装饰器支持在ArkTS卡片中使用。 概述 Link装饰的变量与其父组件中的数据源共享相同的值。 限制条件 Link装饰器不能在Entry装饰的自定义组件中使用…

伊理威科技:抖音开网店新手刚做选啥品

在数字浪潮中&#xff0c;抖音不仅是展示才艺的舞台&#xff0c;更是创业者的新天地。新手若想在这片热土上开垦网店&#xff0c;选品便是首要课题。选择产品如同种下希望的种子&#xff0c;既要考量土壤肥沃度&#xff0c;也得预测风雨适宜期。 兴趣与专长是选品的罗盘。热爱所…

STM32之HAL开发——RCC外设CubeMX配置时钟

RCC外设介绍 RCC是Reset and Clock Control (复位和时钟控制)的缩写&#xff0c;它是STM32内部的一个重要外设&#xff0c;负责管理各种时钟源和时钟分频&#xff0c;以及为各个外设提供时钟使能。RCC模块可以通过寄存器操作或者库函数来配置。 RCC是复位和时钟控制模块&#…