小研究 - Mysql快速全同步复制技术的设计和应用(二)

Mysql半同步复制技术在高性能的数据管理中被广泛采用,但它在可靠性方面却存在不足.本文对半同步复制技术进行优化,提出了一种快速全同步复制技术,通过对半同步数据复制过程中的事务流程设置、线程资源合理应用、批量日志应用等技术手段,在保证数据可靠性的基础上降低复制过程中的性能损失,实现了快速的全同步复制.测试结果表明,快速全同步复制技术可以在性能、可靠性和一致性方面做到很好的均衡,有效提高了Mysql存储集群的业务承载能力.

目录

2 快速全同步复制的功能实现

2.1 主机节点

2.2 备机节点

2.3 Mysql存储集群快速全同步的状态变量

2.4 快速全同步配置参数


2 快速全同步复制的功能实现

Mysql过去的半同步复制和全同步复制技术是通过插件的方式实现,而快速全同步复制技术为了提高复制性能及实现高可靠性,直接在Mysql的事务处理流程里设置断点及增加相应函数,通过在事务处理过程中,增加等待备机节点的 ACK 消息等一系列流程后才完成事务来实现快速全同步.本文设计的快速全同步复制技术具体应用在 Sharding-sphere的Sharding-proxy分库分表解决方案场景上,具体的应用方案如下.

在如图 3 所示的架构中,应用程序通过 Shard-ing-Proxy 访问存储集群里的数据,Sharding-Proxy复制 SQL 语句的路由下发 SQL 到对应的存储集群 . 在每个存储集群里,通过快速全同步技术实现
高可用性,HA manager 负责集群监测和角色管理(如主从切换).

快速全同步技术定义了一系列的数据库参数和状态变量,用于控制和展示快速全同步技术的运行,主机节点和备机节点的实现原理及过程如下.

2.1 主机节点

快速全同步复制采用了 after-commit 的同步模式.在处理用户会话的工作线程完成事务T提交或prepare(XA prepare)且还未向客户端确认成功(即发送OK包)之前,主节点检查事务T的binlog是否已经收到足够数量的备机ACK.通过主机节点设置参数数据库参数 Fullsync_consistency_level,定义了主节点需要让每个事务等待多少个备机的 ACK ,如果是0就不等待任何ACK ;如果大于0则等待定义数量备机的ACK .

在数据库集群中,数据库管理员根据集群节点数量为每个 Master 节点设置合理的 Fullsync_consis-tency_level.通常的设定方法是对于一个2*n+1个节点的存储节点,设置Fullsync_consistency_level=n,从而在同时有n个节点消失的情况下,集群仍然可以
正常写入 . 也可以支持其他策略,比如要求所有备机全部确认等.

若释放条件满足,则工作线程直接返回成功状态给客户端,且完成本次请求处理,否则工作线程就把会话对象放到Fullsync ACK等待队列,然后去处理其他连接中收到的请求 . 主节点收到 ACK 后会对等待队列中的会话做释放条件检查,满足释放条件的会话会被释放,也就是返回成功状态给客户端.在等待备机ACK的过程中,用户会话并不占用工作线程.如超时(Fullsync_timeout)未收到足够的ACK来释放一个等待的会话时,Mysql存储集群有如下两种策略(由全局变量disable_fullsync_on_slave_ack_timeout来控制):

(1)如果 disable_fullsync_on_slave_ack_timeout=1,那么 fullsync 会自动退化为异步,这样后续等待的事务将不再做 fullsync 等待,当主节点再次收到备机ACK后,会自动启用Fullsync机制.

(2)如果 disable_fullsync_on_slave_ack_timeout=0,那么Fullsync等待超时的会话,会返回错误(错误号9000)给客户端,对于数据库集群来说,就是计算节点收到了这个错误,会触发主备切换.

2.2 备机节点

备机收到事件组(event group,即 Binlog 事务,包括普通显式事务,XA事务第一阶段,XA事务第二阶段,DDL语句,autocommit语句这几种类型,下文 简 称 EG)的 终 止 Binlog 事 件(XID_EVENT、XA_PREPARE_LOG_EVENT 或者 DDL 事务)后,它会决定是否需要把收到的若干个 EG 写到 RelayLog 文件并且刷到持久存储系统(即 flush&fsyncrelay log)中,然后发送 ACK 给主节点来确认这些收到的EG.

这个决定基于最小化资源消耗和最优化性能来确定:如果备机收到了足够多的EG(配置参数:full-
sync_fsync_ack_least_txns),或足够量的Binlog(配置参数:fullsync_fsync_ack_least_event_bytes),或太久没有发送 ACK(配置参数:fullsync_fsync_ack_wait_max_milli_secs),它就会落盘Relay Log再发送ACK.

一个 ACK 包含这些信息:备机的 server_id,落盘的最后一个 EG 在主节点 Binlog 中的终止位置
(文件编号和偏移值).主节点收到一个备机的ACK后就可以确认这个备机收到并持久存储了ACK位置之前的所有EG.使用fullsync_relaylog_fsync_ack_level 全局变量来控制一个备机节点落盘 Relay Log 和发送 ACK行为的时机,其含义如表1所示:

备机有两种方法发送 ACK 给主节点,这两种方法都要求备机使用Mysql客户端库连接主节点,这样每个备机节点有两个连接连到主节点,一个是备机的IO线程的连接,另一个是备机发送ACK的连接.在此连接中备机发送Mysql存储集群特有的COM_BINLOG_ACK 命令或者发送 Mysql 存储集群可以理解的SQL语句,前者性能更好,但是后者可以让各种第三方 Binlog 存储组件向主节点发送ACK.

(1)发送COM_BINLOG_ACK命令使用 Mysql 存储集群的客户端库文件及其mysql.h 头文件编译程序,然后调用 mysql_send_binlog_ack()函数发送ACK. Mysql存储集群快速全同步功能使用此方法发送ACK给其主节点.

(2)使用 SLAVE server_id CONSISTENT TOfile_index offset SQL语句这种方法可以使用任何社区版 Mysql 客户端库,Mysql存储集群的主节点可以正确处理该语句,把它当作确认ACK.此方法特别适合各种Binlog存储组件.

2.3 Mysql存储集群快速全同步的状态变量

这些状态变量可以帮助DBA观察快速全同步的运行情况和性能,并且作为辅助调节快速全同步配置参数的依据,如表2所示.

2.4 快速全同步配置参数

Mysql存储集群快速全同步支持丰富的配置参数,让用户在性能、资源消耗和一致性方面取得适当的平衡 . 这些变量都是 Mysql 的全局变量,其意义 和 用 法 说 明 如 表 3 所 示 . 关 键 的 参 数 如 en-able_fullsync 开启快速全同步复制,fullsync_timeout设置了等待超时时间等.

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

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

相关文章

C++/Qt读写ini文件

今天介绍C/Qt读写ini文件,ini文件一般是作为配置文件来使用,比如一些程序的一些默认参数会写在一个ini文件中,程序运行时会进行对应的参数读取,详细可以查看百度ini文件的介绍。https://baike.baidu.com/item/ini%E6%96%87%E4%BB%…

401 · 排序矩阵中的从小到大第k个数

链接:LintCode 炼码 - ChatGPT!更高效的学习体验! 题解: 九章算法 - 帮助更多程序员找到好工作,硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧 class Solution { public:/*** param matrix: a matrix of intege…

stable diffusion(1): webui的本地部署(windows)

一、前言 是的,现在是202308月份了,网上已经有很多打包好的工具,或者直接进一个web就能用SD的功能,但是我们作为程序员,就应该去躺坑,这样做也是为了能够有更多自主操作的空间。 像其他AI一样&#xff0c…

Python——调用webdriver.Chrome() 报错

今天运行脚本&#xff0c;报错内容如下&#xff1a; collecting ... login_case.py:None (login_case.py) login_case.py:11: in <module> dr webdriver.Chrome() D:\Program Files (x86)\Python\Python39\Lib\site-packages\selenium\webdriver\chrome\webdriver.p…

【算法题解】52. 分割圆的最少切割次数

这是一道 简单 题 https://leetcode.cn/problems/minimum-cuts-to-divide-a-circle/ 题目 圆内一个 有效切割 &#xff0c;符合以下两个条件之一&#xff1a; 该切割是两个端点在圆上的线段&#xff0c;且该线段经过圆心&#xff0c;即圆的直径。该切割是一端在圆心另一端在圆…

自然语言处理学习笔记(五)————切分算法

目录 1.切分算法 2.完全切分 3.正向最长匹配 4.逆向最长匹配 5.双向最长匹配 6.速度评测 1.切分算法 词典确定后&#xff0c;句子可能含有很多词典中的词语&#xff0c;他们有可能互相重叠&#xff0c;如何切分需要一些规则。常用规则为&#xff1a;正向匹配算法、逆向匹…

关于Godot游戏引擎制作流水灯

先上核心代码 游戏节点 流水灯的通途可以是 1. 装饰 2. 音乐类多媒体程序&#xff08;如FL中TB-303的步进灯&#xff09; FL Studio Transistor Bass

Stephen Wolfram:ChatGPT 的训练

The Training of ChatGPT ChatGPT 的训练 OK, so we’ve now given an outline of how ChatGPT works once it’s set up. But how did it get set up? How were all those 175 billion weights in its neural net determined? Basically they’re the result of very large…

pycharm、idea、golang等JetBrains其他IDE修改行分隔符(换行符)

文章目录 pycharm、idea、golang系列修改行分隔符我应该选择什么换行符JetBrains IDE&#xff0c;默认行分隔符 是跟随系统修改JetBrains IDE&#xff0c;默认行分隔符 pycharm、idea、golang系列修改行分隔符 一般来说,不同的开发环境和项目对换行格式的使用偏好不同: Windo…

Maven: No compiler is provided in this environment.

在Eclipse中运行Maven项目&#xff0c;报错&#xff1a; No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 解决方法&#xff1a; Windows > Preferences > Java > Installed JREs > Add > Standard VM,…

基于arcFace+faiss开发构建人脸识别系统

在上一篇博文《基于facenetfaiss开发构建人脸识别系统》中&#xff0c;我们实践了基于facenet和faiss的人脸识别系统开发&#xff0c;基于facenet后续提出来很多新的改进的网络模型&#xff0c;arcFace就是其中一款优秀的网络模型&#xff0c;本文的整体开发实现流程与前文相同…

软件测试缺陷报告

缺陷报告是描述软件缺陷现象和重现步骤地集合。软件缺陷报告Software Bug Report&#xff08;SBR&#xff09;或软件问题报告Software Problem Report&#xff08;SPR&#xff09; 作用&#xff1a;缺陷报告是软件测试人员的工作成果之一&#xff0c;体现软件测试的价值缺陷报…

针对高可靠性和高性能优化的1200V碳化硅沟道MOSFET

目录 标题&#xff1a;1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance摘要信息解释研究了什么文章创新点文章的研究方法文章的结论 标题&#xff1a;1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance 摘要 本文详…

Vue2 第二十一节 Vue UI组件库

移动端常用UI组件 1. Vant https://youzan.github.io/vant 2. Cube UI https://didi.github.io/cube-ui 3. Mint UI http://mint-ui.github.io PC端常用UI组件 1. Element UI https://element.eleme.cn 2. IView UI https://www.iviewui.com 一. Element UI 的引入和使…

SpringBoot项目增加logback日志文件

一、简介 在开发和调试过程中&#xff0c;日志是一项非常重要的工具。它不仅可以帮助我们快速定位和解决问题&#xff0c;还可以记录和监控系统的运行状态。Spring Boot默认提供了一套简单易用且功能强大的日志框架logback&#xff0c;本文将介绍如何在Spring Boot项目中配置和…

SpringBoot核心配置和注解

目录 一、注解 元注解 基本注解 启动注解 二、配置 格式介绍 读取配置文件信息 案例演示1 嵌套读取bean信息 案例演示2 读取Map&#xff0c;List 以及 Array 类型配置数据 案例演示3 三、总结 一、注解 之前我们了解了SpringBoot基础和AOP简单应用&#xff0c;这期来讲…

[Docker实现测试部署CI/CD----Jenkins集成相关服务器(3)]

目录 7、 Jenkins 集成 SonarQubeJenkins 中安装 SonarScanner下载移动修改配置文件 8、Jenkins配置SonarQube安装插件添加SonarQube添加 SonarScanner 9、Jenkins集成目标服务器 7、 Jenkins 集成 SonarQube Jenkins 中安装 SonarScanner SonarScanner 是一种代码扫描工具&am…

【stm32】初识stm32—stm32环境的搭建

文章目录 &#x1f6f8;stm32资料分享&#x1f354;stm32是什么&#x1f384;具体过程&#x1f3f3;️‍&#x1f308;安装驱动&#x1f388;1&#x1f388;2 &#x1f3f3;️‍&#x1f308;建立Start文件夹 &#x1f6f8;stm32资料分享 我用夸克网盘分享了「STM32入门教程资料…

【Android】控件与布局入门 - 简易计算器

目录 1. 基础开发环境 2. 计算器的布局和相关按钮 3. 计算器的主要运算逻辑 4. APK 文件 5. 项目源码 1. 基础开发环境 JDK&#xff1a;JDK17 Android Studio&#xff1a;Android Studio Giraffe | 2022.3.1 Android SDK&#xff1a;Android API 34 Gradle: gradle-8.0-bi…

参考RabbitMQ实现一个消息队列

文章目录 前言小小消息管家1.项目介绍2. 需求分析2.1 API2.2 消息应答2.3 网络通信协议设计 3. 开发环境4. 项目结构介绍4.1 配置信息 5. 项目演示 前言 消息队列的本质就是阻塞队列&#xff0c;它的最大用途就是用来实现生产者消费者模型&#xff0c;从而实现解耦合以及削峰填…