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

news2024/12/25 9:11:52

目录

一、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)

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

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

相关文章

如何使用ospf (enps) 简单实践ospf协议

1. OSPF的基本概念 OSPF(Open Shortest Path First,开放式最短路径优先)是一种广泛应用于TCP/IP网络中的内部网关协议(Interior Gateway Protocol, IGP),主要用于在同一自治系统(Autonomous Sys…

Django的forms组件

divmod(被除数, 除数)传入两个参数之后得到一个元组,元组中的第一个值是商,第二个是余数 forms组件 写一个注册功能,获取用户名和密码,利用form表单提交数据,在后端判断用户名和密码是否符合一定的条件:用户名必须超过3个字,密码最多6位.最后将验证信息返回到前端页面 1.手动…

【Algorithms 4】算法(第4版)学习笔记 21 - 5.2 单词查找树

文章目录 前言参考目录学习笔记0:前置介绍0:前置介绍1:单词查找树 R-way tries1.1:介绍1.2:查找操作1.2.1:成功命中1.2.2:未命中1.3:插入操作1.4:Java 实现1.5&#xff1…

刷题DAY31 | LeetCode 455-分发饼干 376-摆动序列 53-最大子序和

455 分发饼干(easy) 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并…

惠普EliteBook使用VirtualBox安装ISO镜像

实验环境 虚拟机软件:Oracle VM VirtualBox 6.1.16镜像文件:CentOS-7-x86_64-Minimal-2009.iso笔记本:惠普EditBook操作系统:Window10 BIOS开启虚拟化技术 一遍笔记本都不会开启虚拟化技术的,但是在window里使用虚拟…

二叉树|257.二叉树的所有路径

力扣题目链接 class Solution { private:void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {path.push_back(cur->val); // 中&#xff0c;中为什么写在这里&#xff0c;因为最后一个节点也要加入到path中 // 这才到了叶子节…

Qt实现TFTP Server和 TFTP Client(一)

1 概述 TFTP协议是基于UDP的简单文件传输协议&#xff0c;协议双方为Client和Server.Client和Server之间通过5种消息来传输文件,消息前两个字节Code是消息类型&#xff0c;消息内容随消息类型不同而不同。传输模式有三种&#xff1a;octet,netascii和mail&#xff0c;octet为二…

nodejs安装使用React

1、react安装 首先&#xff0c;确保电脑上具备nodejs环境&#xff0c;之后用 winr 呼出控制台&#xff0c;输入 cmd 命令弹出cmd控制台&#xff08;小黑框&#xff09;之后在默认路径输入如下代码 npm i -g create-react-app //全局安装react环境无需选择特定文件夹安装成功后…

代码随想录--排序算法

912.排序数组 快速排序 思路&#xff1a; 1. 设置一个pivot2. 将小于nums[pivot]的值 放在左边3. 将 大于nums[pivot]的值 放在 右边4. 递归调用注意&#xff1a;必须先比较nums[high] 与pivot 代码&#xff1a; class Solution {int partition(vector<int>&nu…

论文解读:Frozen Feature Augmentation for Few-Shot Image Classification

文章总结 动机 通过各种图像增强手段和冻结特征(已经训练好的特征)结合起来训练轻量级模型。 最终得到的最佳设置顺序 亮度&#xff0c;对比度FroFA (C)和后置cFroFA (Pc) 这三种连续的数据增强操作(具体这三种数据增强操作是干了什么&#xff0c;得去附录找) 这里三种FroFA…

国内IP地址格式的多样性与规范化

在当今数字化时代&#xff0c;IP地址作为互联网通信的基本要素之一&#xff0c;在网络通信中扮演着至关重要的角色。了解国内IP地址的格式、规范以及不同类型的IP地址对网络通信的影响&#xff0c;对于构建高效稳定的网络环境至关重要。虎观代理小二将深入探讨国内IP地址的格式…

Centos虚拟机忘记密码;重置虚机密码

虚拟机是一个好用的工具&#xff0c;在本地搭建的虚拟机可以给我们提供测试&#xff0c;但时间长了也会忘记密码&#xff1b;因此这里以centos系统的虚机为例&#xff0c;提供一个重置虚机密码的方法 1.在开机页面按“E”进入编辑模式 进入后长这样&#xff1a; 2.找到ro cras…

iOS模拟器 Unable to boot the Simulator —— Ficow笔记

本文首发于 Ficow Shen’s Blog&#xff0c;原文地址&#xff1a; iOS模拟器 Unable to boot the Simulator —— Ficow笔记。 内容概览 前言终结模拟器进程命令行改权限清除模拟器缓存总结 前言 iOS模拟器和Xcode一样不靠谱&#xff0c;问题也不少。&#x1f602; 那就有病治…

Tensorflow 2.0 常见函数用法(一)

文章目录 0. 基础用法1. tf.cast2. tf.keras.layers.Dense3. tf.variable_scope4. tf.squeeze5. tf.math.multiply 0. 基础用法 Tensorflow 的用法不定期更新遇到的一些用法&#xff0c;之前已经包含了基础用法参考这里 &#xff0c;具体包含如下图的方法&#xff1a; 本文介…

使用PDFBox调整PDF每页格式

目录 一、内容没有图片 二、内容有图片 maven依赖&#xff0c;这里使用的是pdfbox的2.0.30版本 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.30</version></dependency>…

基于python+vue 的一加剧场管理系统的设计与实现flask-django-nodejs-php

二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一需求设…

vue 消息左右滚动(前后无缝衔接)

演示效果 封装的组件 <!--* Author:* Date: 2024-03-21 19:21:58* LastEditTime: 2024-03-21 20:31:50* LastEditors: Please set LastEditors* Description: 消息左右滚动 --> <template><divid"textScroll"class"text-scroll"mousemove&…

Alibaba spring cloud Dubbo使用(基于Zookeeper或者基于Nacos+泛化调用完整代码一键启动)

Quick Start Dubbo&#xff01;用更优雅的方式来实现RPC调用吧 - 掘金 dubbozookeeper demo 项目结构&#xff1a; RpcService 仅仅是提供服务的接口&#xff1a; public interface HelloService {String sayHello(String name); }DubboServer pom&#xff1a; <?xm…

分布式之网关介绍

一、网关简介 1、网关背景 由于微服务“各自为政的特性”使微服务的使用非常麻烦。通常公司会有一个“前台小姐姐”作为统一入口&#xff0c;这就是网关 2、网关作用 统一入口&#xff1a;为服务提供一个唯一的入口&#xff0c;网关起到外部和内部隔离的作用&#xff0c; 保…

软考中级 --网络工程师真题试卷 2023下半年

在EIGRP协议中&#xff0c;某个路由器收到了两条路径到达目标网络&#xff0c;路径1的带宽为100Mbps&#xff0c;延迟2ms&#xff0c;路径2的带宽为50Mbps&#xff0c;迟为4ms&#xff0c;如果EIGRP使用带宽和延迟的综合度量标准&#xff0c;那么该路由器选择的最佳路径是(D)。…