MySQL主从复制的数据同步延迟(二)

news2024/11/17 21:30:38

1、介绍

主从复制环境在单机应用的时候没有问题,但是在实际的生产环境中,会存在 复制延迟 的问题
在这里插入图片描述
查看从库同步状态
在从库中执行 show slave status\G :

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.2.158
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 2560
               Relay_Log_File: mysql-slave-node01-relay-bin.000002
                Relay_Log_Pos: 2292
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 2560
              Relay_Log_Space: 2512
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: c28a6a7f-2a61-11eb-91e9-000c2959176f
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 

这里有几个比较重要的参数:
Master_Log_File :slave中的IO线程正在读取的主服务器的二进制日志文件的名称
Read_Master_Log_Pos :在当前的主服务器二进制日志中,slave中的IO线程已经读取的位置
Relay_Log_File : SQL线程 当前正在读取和执行的中继日志文件的名称
Relay_Log_Pos :在当前的中继日志中,SQL线程已经读取和执行的位置
Relay_Master_Log_File :由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称
Slave_IO_Running : IO线程是否启动并成功的连接到主服务器上
Slave_SQL_Running :SQL线程是否启动
Seconds_Behind_Master :从服务SQL线程和从服务器IO线程之间的时间差(秒)
值得一提的是 Seconds_Behind_Master ,这个参数直接就给出了当前从库延迟了多长时间。

那么这个值是如何计算的呢?
Master执行完成一个事务,写入 binlog ,这个时刻记为 T1 ;
Master传输 binlog 给Slave,Slave接收完 binlog 的时刻记为 T2 ;
Slave执行完这个事务的时刻记为 T3 ;
主从复制延迟时间 就是同一个事务,在从库执行完成的时间和主库执行完成的时间之间的差值,也就是 T3 - T1。
SBM(Seconds Behind Master) 在进行计算的时候就是按照这样的方式,每个事务的 binlog 中都有一个时间字段,用于记录主库写入的时间,从库取出当前正在执行的事务的时间字段的值,计算它与当前系统时间的差值,得到SBM。

SBM时间差值产生的原因
通过SBM计算方式的分析,我们分析一下这个时间差产生的可能原因,以便于我们能在实际生产环境中解决问题。

大事务执行
比如主库的一个事务执行了N分钟,而 binlog 的写入必须要等待事务完成之后,才会传入从库,那么此时从库在开始执行的时候就已经延迟了N分钟了。

从库随机操作数据
主库的写操作是 顺序写 binlog ,从库单线程去主库 顺序读 binlog ,从库取到 binlog 之后在本地执行。

MySQL的主从复制都是单线程的操作,由于主库是顺序写,所以效率很高,而从库也是顺序读取主库的日志,此时的效率也是比较高的,但是 当数据拉取回来之后变成了随机的操作,而不是顺序的,所以此时成本会提高 。

从库同步时与查询线程发生lock征用
从库在同步数据的同时,可能跟其他查询的线程发生锁抢占用的情况,此时也会发生延时。

主库TPS高
当主库的TPS并发非常高的时候,产生的DDL数量超过了一个线程所能承受的范围的时候,那么也可能带来延迟。

网络问题
主从在进行 binlog 日志传输的时候,如果网络带宽也不是很好,那么网络延迟也可能造成数据同步延迟。

复制延迟问题解决方案
从sync_binlog参数配置下手

请添加图片描述

通过这个图我们可以看到,每个线程都有自己的 binlog cache ,但是共用同一份 binlog 文件。

其中的 write ,就是 把日志写入到文件系统的page cache,并没有把数据持久化到磁盘,所以速度快 。

fsync ,才是将数据持久化到磁盘的操作。一般情况下,我们认为 fsync才占用磁盘的IOPS 。

而 write 和 fsync 的时机就是 由参数sync_binlog来进行控制的 。

sync_binlog=0:表示每次提交事务都只write,不fsync
sync_binlog=1:表示每次提交事务都执行fsync
sync_binlog=N:表示每次提交事务都write,但积累N个事务后才fsync
在大部分应用场景中,建议将此参数的值设置为1,因为这样的话能够保证数据的安全性。

但是如果出现主从复制的延迟问题,可以考虑将此值设置为100~1000中的某个数值,非常不建议设置为0,因为设置为0的时候没有办法控制丢失日志的数据量。

TIP:如果是对安全性要求比较高的业务系统,这个参数产生的意义就不是那么大了。

禁用salve上的binlog
直接禁用salve上的binlog,当从库的数据在做同步的时候,有可能从库的binlog也会进行记录,此时肯定也会消耗IO的资源,因此可以考虑将其关闭。

TIP:如果你搭建的集群是 级联 的模式的话,那么此时的 binlog 也会发送到另外一台从库里方便进行数据同步,此时这个配置项也不会起到太大的作用。

设置innodb_flush_log_at_trx_commit
innodb_flush_log_at_trx_commit 是用来表示每一次的事务提交是否需要把日志都写入磁盘(都写入磁盘耗时)。

**innodb_flush_log_at_trx_commit ** 一共有三个属性值:

=0 每次写到服务缓存,一秒钟刷写一次
=1 每次事务提交都刷写一次磁盘
=2 每次写到OS缓存,一秒钟刷写一次
一般情况下设置成2,这样就算MySQL的服务宕机了,写在OS缓存中的数据也会进行持久化。

从根本上解决
并行复制
**并行复制 ** 是MySQL 5.6版本之后引入的:
在这里插入图片描述
并行复制就是在中间加了一个 分发 任务的环节,也就是说原来的 SQL Thread 变成了现在的 Coordinator 组件,当日志来了之后, Coordinator 负责 读取日志信息以及分发事务 ,真正的日志执行的过程是放在了 worker线程 上,由多个线程并行的去执行。

并行复制操作

查看并行的slave的线程的个数,默认是0,表示单线程:

show global variables like 'slave_parallel_workers';

根据实际情况设置开启多少线程:

set global slave_parallel_workers = 4;

设置并发复制的方式,默认是一个线程处理一个库,值为database:

show global variables like ‘%slave_parallel_type%’;
设置slave_parallel_type属性值:

set global slave_parallel_type=‘logical_lock’;
复制代码
查看线程数

show full processlist;
复制代码
MySQL 5.7的并行复制策略
MySQL 5.7版本优化了自己的并行复制策略,并且可以通过参数 slave-parallel-type 来控制并行复制的策略:

当配置的值为DATABASE的时候,则使用5.6版本的 数据库级别 的并行复制策略;
当配置的值为LOGICAL_CLOCK的时候,则使用MySQL 5.7全新的并行复制策略。
MySQL 5.7并行复制策略的思路是:

所有处于 redo log prepare 阶段的事务,都可以并行提交,原因是这些事务都已经经过了锁资源争用的阶段,都是没有冲突的。

反之,如果这些事务之间有冲突,则后来的事务会等待前面的事务释放锁之后才能执行,因此,这些事务就不会进入prepare阶段。

总结一下就是,一个组提交(group commit)的事务都是可以并行回放,因为这些事务都已进入到事务的prepare阶段,则说明事务之间没有任何冲突(否则就不可能提交)。

binlog_group_commit_sync_delay 表示延迟多少微秒后才调用 fsync;
binlog_group_commit_sync_no_delay_count 表示累积多少次以后才调用 fsync。
基于这样的处理机制,为了增加一组事务内的事务数量提高从库组提交时的并发量引入了 binlog_group_commit_sync_delay=N 和 binlog_group_commit_sync_no_delay_count=N 参数,MySQL等待 binlog_group_commit_sync_delay 毫秒直到达到 binlog_group_commit_sync_no_delay_count 事务个数时,将进行一次组提交。

基于GTID的主从复制
之前搭建主从复制环境的时候,在Slave上执行:

change master to master_host=‘192.168.2.158’,master_user=‘root’,master_password=‘123456’,master_port=3306,master_log_file=‘master-bin.000001’,master_log_pos=154
复制代码
这种写法限制我们必须知道具体的 binlog是哪个文件,同时在文件的哪个位置开始复制,正常情况下也没有问题。

但是如果是一个主备主从集群,那么如果主机宕机,当从机开始工作的时候,那么备机就要同步从机的位置,此时位置可能跟主机的位置是不同的,因此在这种情况下,再去找位置就会比较麻烦,所以在5.6版本之后出来一个 基于GTID的主从复制 。

GTID(Global Transaction ID) 是对于一个已提交事务的编号,并且是一个全局唯一的编号。

GTID实际上是由 UUID + TID 组成的,其中UUID是MySQL实例的唯一标识,TID表示该实例上已经提交的事务数量,并且随着事务提交单调递增。

这种方式保证事务在集群中有唯一的ID,强化了主备一致及故障恢复能力。

配置基于GTID的集群环境
虚拟机环境与 MySQL高可用之主从复制 中的集群环境一致。

三台MySQL实例配置文件修改:

192.168.2.158

[mysqld]
# binlog
log-bin=master-bin
log-slave-updates=true
binlog-format=ROW
 
# GTID
server-id=158
gtid_mode=on
 
# 强制GTID一致性,开启后对于特定create table不被支持
enforce_gtid_consistency=on
 
# 从库:禁止开启IO线程和SQL线程,防止破坏从库
skip_slave_start=1

192.168.2.159

# binlog
log-bin=master-bin
log-slave-updates=true
binlog-format=ROW
 
# GTID
server-id=159
gtid_mode=on
 
# 强制GTID一致性,开启后对于特定create table不被支持
enforce_gtid_consistency=on
 
# 从库:禁止开启IO线程和SQL线程,防止破坏从库
skip_slave_start=1

192.168.2.157

[mysqld]
# binlog
log-bin=master-bin
log-slave-updates=true
binlog-format=ROW
 
# GTID
server-id=157
gtid_mode=on
 
# 强制GTID一致性,开启后对于特定create table不被支持
enforce_gtid_consistency=on
 
# 从库:禁止开启IO线程和SQL线程,防止破坏从库
skip_slave_start=1

三台MySQL实例均重启。

在两个从库执行:

mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

mysql> change master to master_host=‘192.168.2.158’,master_user=‘root’,master_password=‘123456’,master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

关于master_auto_position

master_auto_position = 0,表示采用老的binlog复制
master_auto_position = 1,表示采用GTID复制
验证
在Master上执行:

mysql> show slave hosts;
±----------±-----±-----±----------±-------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID |
±----------±-----±-----±----------±-------------------------------------+
| 157 | | 3306 | 158 | c269d11a-2a61-11eb-bf0d-000c29599fb3 |
| 159 | | 3306 | 158 | c2cba590-2a61-11eb-ac0e-000c2900ba99 |
±----------±-----±-----±----------±-------------------------------------+
2 rows in set (0.00 sec)
复制代码
可以看到,有两个从节点的MySQL实例。

在从节点上, show slave status\G

在这里插入图片描述

基于GTID复制的原理

当一个事务在Master提交时,该事务就被赋予了一个GTID,并记录在主库的binlog;

主库的binlog会被传输到从库的relay log中,从库读取此GTID并生成gtid_next系统参数;

从库验证此GTID并没有在自己的binlog中使用,则应用此事物在从库上。

在这里插入图片描述

如果我们不开启gtid,分组信息该如何保存呢? 其实是一样的,当没有开启的时候,数据库会有一个 Anonymous_Gtid ,用来保存组相关的信息

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

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

相关文章

Matlab论文插图绘制模板第73期—带等高线的光影曲面图

在之前的文章中,分享了Matlab曲面图的绘制模板: 光影曲面图: 带等高线的曲面图: 进一步,再来看一下带等高线的光影曲面图的绘制模板。 先来看一下成品效果: 特别提示:Matlab论文插图绘制模板系…

make <board_name>_defconfigmake menuconfig

1.make <board_name>_defconfig (1)在uboot的顶层目录的Makefile中查找目标&#xff08;defconfig无法查到&#xff09;&#xff0c;检索config&#xff0c;找到目标config和目标%config 因为我们的目标为<board_name>_defconfig&#xff0c;所以需要看的是有通配…

发现了一个提取时间序列技术指标的神器

互联网上有一个最简单而又强大的技术库&#xff0c;叫做pandas_ta。这个python库为你提供了一个简化的API&#xff0c;让你从时间序列中提取技术分析指标。今天我将和大家一起学习这个库。记得点赞、收藏&#xff5e; 虽然你可能会将这些函数应用于股票价格&#xff0c;但你可…

python开发环境搭建实践

这里写自定义目录标题前言搭建过程anaconda下载与安装下载安装配置环境变量pycharm下载和安装下载安装激活总结前言 新年新气象&#xff0c;我也把电脑进行了重装系统。所以现在需要重新搭建各种开发环境&#xff0c;也不能说是各种&#xff0c;因为我只会python和Java。 先搭…

全国产交换机基本介绍(分类、性能指标、硬件构成及工作方式)

关于全国产交换机基础知识&#xff0c;您了解多少呢&#xff1f;来和海翎光电的小编一起学习一下吧&#xff01; 一、交换机的分类与性能指标 1.1 交换机的分类 按照网络构成方式来分的话&#xff0c;交换机分为三类&#xff1a;接入层交换机、汇聚层交换机和核心层交换机。按照…

93.transformer、多头注意力以及代码实现

1. Transformer架构 2. 多头注意力 3. 数学上来解释多头注意力 4. 有掩码的多头注意力 5. 基于位置的前馈网络 6. 层归一化 batch norm&#xff1a;比如说一行是一个样本&#xff0c;那么BN就是对一列进行归一化&#xff0c;就是对所有数据项的某一列特征进行归一化 layer nor…

【数据结构和算法】了解认识栈,并实现栈的相关函数

到现在我们了解并认识了线性表的概念&#xff0c;动态、静态顺序表的建立&#xff0c;以及两种链表的实现&#xff0c;接下来我们要认识一个新的内容&#xff0c;新的概念&#xff0c;栈&#xff0c;是基于顺序表或者链表的一种新型数据结构。 目录 一、栈是什么&#xff1f; …

RabbitMQ入门中篇

本篇博文目录一.Spring整合RabbitMQ1.导入依赖2.生产者3.消费者4.测试二.SpringBoot整合RabbitMQ1.导入依赖2.生产者3.消费者4.测试三.代码下载一.Spring整合RabbitMQ 在spring项目中使用RabbitMQ的Exchange模式的Topics&#xff0c;项目分为消费者spring项目和生产者spring项目…

Centos7安装kvm服务器

Centos7安装kvm服务器什么是kvm检查硬件是否支持kvm虚拟化启用嵌套虚拟化(可选)查看是否启用嵌套虚拟化嵌套虚拟化立即生效(临时)重新加载模块并验证虚拟机硬件直通虚拟机内查看嵌套虚拟化是否成功安装kvm服务器安装kvm的所有包(不推荐)启动libvirt服务查看是否正确设置了虚拟化…

Linux操作系统之线程安全

一、引入线程安全关于strtok函数不能在多线程中使用&#xff0c;为什么&#xff1f;运行结果原因如下&#xff1a;在strtok内部会有一个全局变量静态指针&#xff08;static char* ptr&#xff09;&#xff0c;一开始指针指向主线程的a&#xff0c;等到后面子线程开始分割时&am…

18 Java反射reflect(类加载+获取类对象+通用操作+设计模式+枚举+注解)

Java反射18 反射reflect18.1 类的加载18.2 Class对象18.3 获取类对象的3种方法18.4 反射通用操作18.4.1 常见方法18.4.2 通用操作18.5 设计模式18.5.1 概念18.5.2 好处18.5.3 工厂设计模式18.5.4 单例模式18.6 枚举18.7 注解18.7.1 概念18.7.2 定义注解18.7.3 注解属性类型18.7…

知名休闲服饰品牌——慕尚集团借力泛微实现统一办公、业务协同

客户简介 宁波中哲慕尚控股有限公司&#xff08;以下简称慕尚集团&#xff09;是中国知名的由新零售模式驱动的休闲时尚服饰多品牌运营公司。 旗下品牌有GXG,gxgjeans,gxg.kids,MODE COMMUTER等&#xff0c;覆盖时尚男女装、童装市场和其他时尚领域。2019年5月慕尚集团正式登…

不要在线上滥用CopyOnWriteArrayList,姿势不对性能真的很拉胯

从JDK1.5版本&#xff0c;JAVA提供了线程安全的List增强版CopyOnWriteArrayList&#xff0c;其保持线程安全的方式是&#xff1a;每次修改数据时&#xff0c;不会直接修改数据&#xff0c;而是把数据复制出来一份&#xff0c;对复制出来的数组进行操作。 通过这样的机制&#…

【图像算法】马赛克识别

【目的】 校验视频中出现马赛克的频率&#xff0c;抽象成将视频切割成图片&#xff0c;对每张代测图片进行自动化验证。 【实现】 图像边缘检测算法识别 算法步骤&#xff1a; 使用高斯滤波器&#xff0c;以平滑图像&#xff0c;滤除噪声。计算图像中每个像素点的梯度强度和…

buuctf-web-[BJDCTF2020]Easy MD51

打开环境一个简单的页面查看源代码一个get传参&#xff0c;随便输入试试看输入1,1",1,均无反应&#xff0c;每次遇到这种有输入框的都以为是sql注入&#xff0c;但是题目为md5标头里面看到提示select * from admin where passwordmd5($pass,true)搜索相关漏洞&#xff0c;…

gost 常用tunnel配置示例(隧道模式)

gost是用golang语言实现的一个安全隧道。地址位于&#xff1a;https://github.com/ginuerzh/gost是一个不可多得的隧道工具。至于什么是隧道&#xff1f; 就是可以通过这个工具传输一些其他协议的数据。就像这个样子。隧道有什么用呢&#xff1f;可以起到一些加速的作用或者流量…

Array.prototype.from()

Array.from() 用于将类数组对象或可迭代对象转化为一个新的浅拷贝数组实例。 let arr Array.from({length:3},(_,i)>({id:item-${i1}}))console.log(arr)Array.from()转换数组 // Array.from 转换成数组let arr2 Array.from(chixinAwen)console.log(arr2) 示例&#xff1a…

如何免安装使用 Python?推荐 17 个在线的 Python 解释器

安装 Python 很容易&#xff0c;但或许你正在用智能手机/平板电脑&#xff0c;在用不允许安装软件的电脑&#xff0c;或者因为其它原因无法安装 Python。那么&#xff0c;如何通过免安装的方式使用 Python 呢&#xff1f; 本文将介绍 17 个免费的 Python 解释器和交互式 Shell…

百里挑一,4款免费又实用的软件,用一次就爱上

好看的皮囊千篇一律&#xff0c;实用的软件百里挑一&#xff0c;下面几款软件都是笔者收集多年所得&#xff0c;实用且免费。 1、坚果云 这是一款颠覆许多人认知的网盘工具&#xff0c;免费使用无广告&#xff0c;不限速的优点就比某度网盘强百倍&#xff0c;支持任何设备&…

AOP案例:测量业务层接口万次执行时间

测量业务层接口万次执行时间1. 准备1.1 service层&#xff1a;1.2 dao层&#xff1a;1.3 SpringConfig配置类&#xff1a;2. AOP2.1 通知类2.2 测试类&#xff1a;3. 问题及改进1. 准备 需求&#xff1a;任意业务层接口执行均可显示执行的时长&#xff1b; 切入点配置&#x…