亚马逊云科技Aurora MySQL在复制性能提升上的不断优化和尝试

前言

 Amazon Aurora是亚马逊云科技自研的云原生关系数据库,它在提供和开源数据库MySQL、PostgreSQL的完好兼容性同时,也能够提供和商业数据库媲美的性能和可用性。

 Aurora的性能提升不仅包含应用读写吞吐量的提升,也包含复制延迟的降低。一个Aurora集群包含1个写节点和多达15个读节点。在写节点和读节点之间的数据传输机制上,Aurora创新性地使用Redo Log传输来实现。Aurora的架构是计算存储分离,写和读节点共享存储,在写节点处理写请求时,会将Redo Log传送给存储系统,同时也会传送给读节点。读节点在收到Redo Log后,会判断Redo Log所修改的数据页是否在自己当前的缓冲区中:如果存在,可以按照一定逻辑将Redo Log应用到对应数据页上;如果不存在,可以直接忽略掉这部分Redo Log,后续需要时可以直接去共享存储中读取数据页。Redo Log的传输使得数据传输量相比传统的Binlog大幅降低,再加上读节点应用Redo Log的简洁处理逻辑,使得Aurora的复制延迟很低,通常在20毫秒以内。相应处理逻辑如下图所示。

 由于低复制延迟和读节点自动伸缩的能力,用户可以将非必须要求强一致的应用分散部署到Aurora不同节点上。高性能、高可用以及良好的扩展性使得Aurora得到用户的喜爱,也一度成为亚马逊云科技用户使用量增幅最快的服务。

 因为Aurora本身读写节点是通过Redo Log复制的,如果单纯使用Aurora,是不需要开启Binlog的。但是,用户有时也需要把数据从OLTP数据库中导出,比如去做后续的复杂数据分析等。对于MySQL而言,数据导出最通用的方式便是Binlog。Aurora MySQL与社区MySQL是完好兼容的,所以也支持消费端以Binlog Consumer的方式来将数据持续导出。打开Binlog以及有Binlog Consumer连接都会对MySQL带来性能上的影响,所以Aurora MySQL在Binlog方面不停进行优化,力争减少开启Binlog带来的影响。

 本篇聚焦Aurora MySQL在Binlog方面的优化历程,首先会介绍下Binlog的机制,然后会分享下Aurora MySQL的Yield机制和Binlog I/O Cache,最后会重点介绍下Aurora MySQL 3推出的Enhanced Binlog这一新功能以及对应的性能测试情况。

 Binlog机制

 Binlog是MySQL主从节点同步数据的最常见方式。在主节点开启Binlog后,MySQL会在事务执行过程中记录数据页变更Redo Log的同时,也会记录Binlog,来描述数据在逻辑意义上的修改。Binlog最小的单位为Binlog Event,多个Binlog Event构成一个Binlog文件,一个Binlog文件的大小通常是128MB。对于大事务,Binlog文件大小也可能会超过128MB。Binlog有Row、Statement和Mixed三种不同的格式,可以决定Binlog Event中数据存放的内容,Row表示真实的数据,Statement表示SQL语句,而Mixed是两者的混合,会尽可能采用Statement格式来记录Binlog,在Statement方式在某些场景下可能导致主从不一致的情况下(比如获取当前系统时间),会采用ROW格式来记录Binlog。开启Binlog本身会需要额外的数据处理和刷盘逻辑,会带来一定的性能损。

 当有另一个模块需要消费Binlog时,它会以Binlog Consumer的身份连接到主节点。下图展示了另一个MySQL数据库作为Binlog Consumer的情况下主从同步机制的示意图。实际应用中也有可能会是其他流数据处理工具比如Kafka、DMS连接到MySQL主库,MySQL主库的处理逻辑都是相同的。

 每当有一个副本连接到MySQL主库时,MySQL主库中都会有一个Dump线程专门用来读取Binlog Event,并将Binlog Event通过网络发送给Consumer。如果Binlog Consumer也是MySQL数据库,会有一个专门的IO线程来接收主库传输的数据,并将接收到的Binlog Event存放在Relay Log中。从库MySQL上还会有一个或者多个SQL线程,来读取Relay Log,并将读取到的Binlog Event进行重放,从而使从库得到与主库一致的数据。

 主库上因为前端线程在处理用户写入请求时需要将Binlog Event写入到Binlog文件,而Dump线程需要读取Binlog文件,尽管Binlog文件通常以128MB为单位进行存储,当两者操作同一个Binlog文件时,仍然会带来加锁竞争等,所以有Binlog Consumer连接到MySQL主库时会进一步由于锁冲突额外消耗MySQL主库的资源,影响到前端应用程序的返回时延。MySQL支持多个Binlog Consumer同时连接,但每个连接都会有对应的Dump线程来读取Binlog,连接数越多,对主库的性能影响也就越大。

 Aurora MySQL的Yield和I/O Cache机制

 Aurora MySQL兼容社区版MySQL,在Binlog处理逻辑上尤其是前端线程、Dump线程、IO线程和SQL线程等处理上与社区保持一致,只是将Binlog文件的存储由本地磁盘转到了远程的共享存储上。所以开启Binlog以及有Binlog Consumer连接到Aurora MySQL同样会带来性能的损耗。

 Aurora MySQL一直致力于减少由于开启Binlog对Aurora带来的性能影响。在Aurora MySQL 1.17.6和2.04.5版本中提出了Binlog Yield的机制,Aurora MySQL 2.10版本中进一步提出了I/O Cache的机制来减少Binlog竞争冲突。

 Binlog Yield的含义是在Dump线程与前端应用对应的线程在操作同一个Binlog文件引发冲突时,让Dump线程Yield等待一段时间,等到等待时间期满或者前端应用线程操作完毕当前Binlog文件,再让Dump线程继续工作。等待时间由变量aurora_binlog_replication_max_yield_seconds控制。Yield的机制能够在发生冲突时优先执行前端应用线程,能够降低对用户应用的响应延迟,但会一定程度上会带来复制延迟的增加。

 Binlog I/O Cache顾名思义是单独开辟一块内存缓冲区,用来存放Binlog。前端线程可以将Binlog Event写入到内存缓冲区中,Dump线程可以从内存缓冲区中读取Binlog。在Binlog复制延迟比较低的时候,Dump线程和前端线程的交互可以在内存中完成,而不再需要去远程存储系统中读取并加锁处理,因此提升了Binlog复制传输的性能。

 Aurora MySQL 3的Enhanced Binlog

 Aurora MySQL 3.03支持的Enhanced Binlog从另一个角度降低了开启Binlog带来的性能损耗。它能将打开binlog对应用程序的影响降低到13%(之前可能最高达到50%),也能提升计算节点的吞吐。此外,Binlog开启时,数据库故障恢复效率与社区版binlog相比提升了99%。

 上面示意图对比展示了Enhanced Binlog和普通Binlog在Aurora MySQL架构中的不同。Enhanced Binlog提出以前,如果用户把Aurora MySQL引擎开启了Binlog,Aurora MySQL写节点在写Redo Log的同时,也会把Binlog写出到存储中去,这样,在发生写节点failover时,新的写节点就能依据共享存储中的信息做好failover以及后续持续写入。另外,Binlog文件的写入是串行完成的。在Enhanced Binlog架构图中,Aurora MySQL将Binlog存储在单独的存储引擎中,并更改了计算层和Binlog引擎中交互Binlog的方式,从串行写封装文件接口的形式改成打散并行写Binlog Event的形式,Binlog引擎可以完成Binlog Event的排序和归集。

 上图进一步展示了Aurora MySQL开启Enhanced Binlog之前和之后对应的处理逻辑的对比。传统Binlog处理流程是两阶段提交的方式,即Redo Log Prepare->Binlog Commit->Redo Log Commit。Binlog刷盘的动作是在Redo Log Prepare完毕顺序刷到存储层,128MB的Binlog文件刷出是需要经历一段时间的,对于较大的事务,Binlog文件也可能超过128MB。当然,Aurora MySQL 2也对超过512MB的大Binlog文件做了提前拷贝到存储层的优化,但对于512MB以下的Binlog文件,传输时需要耗费一定时间的。而Enhanced Binlog单独的存储引擎存放Binlog,可以使得刷Redo Log和Binlog的操作可以同步进行,在事务提交时,直接就通知两个存储引擎进行单独的Commit操作,节省了等待Binlog刷盘的时间。

 Enhanced Binlog测评

 针对Aurora MySQL Enhanced Binlog,也做了一些测试。现有两套Aurora MySQL集群:

  • Aurora MySQL 3.03.1版本。R6g.8xlarge集群,一写一读,打开Binlog。

  • Aurora MySQL 3.03.1版本。R6g.8xlarge集群,一写一读,打开Binlog,并打开Enhanced Binlog。

 为打开Binlog,设置参数binlog_format为ROW。为了使用Sysbench测试较高并发,将max_prepared_stmt_count设置成了最大值1048576。

 为打开Enhanced Binlog,设置了三个参数aurora_enhanced_binlog,binlog_backup,binlog_replication_globaldb,参数取值如下图所示。

 运行的负载是采用Sysbench进行压测,Sysbench运行在EC2上,EC2机型是c5.18xlarge。测试过程中EC2没有成为瓶颈。

 测试了两组不同的数据:1)16张表,每张表1千万条记录;2)250张表,每张表25000条记录。测试的Sysbench并发请求从2,4,8,一直增加到4096。

 下面展示了16张表每表1千万条记录的测试结果。可以看到随着并发线程的增多,Enhanced Binlog的优势愈发明显,在4096个并发线程时,Enhanced Binlog能达到41%的性能提升。

 下面展示了250张表每表25000条记录的测试结果。可以看到和前面类似的结论。随着并发线程的增多,Enhanced Binlog的优势愈发明显,在4096个并发线程时,Enhanced Binlog能达到23%的性能提升。

 下面表格展示了Enhanced Binlog故障恢复的速度。可以看到Enhanced Binlog能够将故障恢复的速度提升92%以上。

 此外,还针对ZeroETL进行了测试,因为ZeroETL是依赖于Aurora Enhanced Binlog的,测试结果表明,即便开启了ZeroETL,即有Binlog Consumer从Aurora MySQL中读取数据,Aurora MySQL对OLTP的性能保持不变。原因在于ZeroETL能够从Binlog存储引擎中直接读取数据,无需再联系Aurora MySQL计算节点。

 总体而言,单独的Binlog存储引擎有几个优势:

  •  提升性能:存储层进行Binlog排序逻辑,可以增加计算层的并行度,减少加锁,加速事务两阶段提交的速度。

  •  加速故障恢复:避免传统Binlog故障恢复时必须顺序读取Binlog到计算层的操作。可以在保证一致性前提下按需恢复事务。可以将故障恢复时间从几分钟降低到几秒。

  •  是实现直接从Aurora MySQL存储层取Binlog的基础。比如Aurora MySQL和Redshift之间的ZeroETL功能就是基于Enhanced Binlog来执行实现的,避免了有Binlog Consumer连接到Aurora MySQL计算实例对于计算节点资源的进一步竞争和消耗。

 总结

 综上所述,亚马逊云科技Aurora MySQL在复制性能提升上不断优化和尝试。Aurora MySQL首发版本中基于Redo Log的物理复制机制带来通常在20毫秒以下的复制延迟,使很多客户能够将更多的读应用发送到读节点进而达到更好扩展性。

 基于用户对Binlog的诉求和MySQL原生Binlog机制带来对性能影响,Aurora MySQL 1.17.6和2.04.5中首先提出了Binlog Yield机制通过Dump线程让路,给前端线程更高优先级,降低了有Binlog Consumer连接时对应用延迟的影响;Aurora MySQL 2.10中进一步改进,提出了Binlog I/O Cache,既能在有Binlog Consumer连接时降低对前端应用延迟的影响,又不过度拖累复制延迟;Aurora MySQL 3.03中更是重塑了架构,将Binlog放在了单独的存储引擎上,不仅降低了Binlog在写节点落盘的时延,更是创造性地使Binlog Consumer能从存储引擎上读取Binlog信息,无需再从Aurora MySQL主节点上进行将Binlog文件从存储层读出再发送,彻底避免了Binlog Consumer和前端应用线程的竞争。所以不论是否有Binlog Consumer的连接,Aurora MySQL的性能不受影响。

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

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

相关文章

echart 柱状图-bar

业务场景一 效果 业务组件调用代码 <template> <barCom :domId"1" :title"barComProps.title" :xAxisData"barComProps.xAxisData" :yAxisProps"barComProps.yAxisProps" :seriseData"barComProps.serise…

在数据库中进行表内容的修改(MYSQL)

根据表中内容&#xff0c;用命令语句创建数据库&#xff0c;表格&#xff0c;以及插入&#xff0c;修改&#xff0c;删除表格中的内容。 创建数据库&#xff1a;zrzy mysql> create database zrzy; 引用zrzy数据库&#xff1a; mysql> use zrzy; 创建student_info表&…

【EasyExcel实践】导出多个sheet到多个excel文件,并压缩到一个zip文件

文章目录 前言正文一、项目依赖二、封装表格实体和Sheet实体2.1 表格实体2.2 Sheet实体 三、核心实现3.1 核心实现之导出为输出流3.2 web导出3.3 导出为字节数组 四、调试4.1 构建调试用的实体类4.2 控制器调用4.3 测试结果 五、注册大数转换器&#xff0c;长度大于15时&#x…

XML Schema中的attributeFormDefault

XML Schema中的attributeFormDefault属性&#xff0c;用以指定元素的属性默认是否必须带有命名空间前缀。 attributeFormDefault属性可以取值qualified或unqualified&#xff0c;默认值是unqualified。 当取值为qualified时&#xff0c;表示属性必须用命名空间作为前缀&#x…

线性可分SVM摘记

线性可分SVM摘记 0. 线性可分1. 训练样本到分类面的距离2. 函数间隔和几何间隔、(硬)间隔最大化3. 支持向量 \qquad 线性可分的支持向量机是一种二分类模型&#xff0c;支持向量机通过核技巧可以成为非线性分类器。本文主要分析了线性可分的支持向量机模型&#xff0c;主要取自…

命令模式 rust和java实现

文章目录 命令模式介绍javarustrust仓库 命令模式 命令模式&#xff08;Command Pattern&#xff09;是一种数据驱动的设计模式。请求以命令的形式包裹在对象中&#xff0c;并传给调用对象。调用对象寻找可以处理该命令的合适的对象&#xff0c;并把该命令传给相应的对象&…

梦极光(ez_re?)

ez_re 先查壳看看&#xff0c;没有壳 32位 我先说说这道题 打开分析找到主函数 在这里就是flag了&#xff0c;用十六进制转ascii码 我们先运行这个程序看看 我想说说我的想法 首先没看出来这里是十六进制转ascii码其次41D538数组用来干啥来的&#xff1f;题目里面给出的请…

untiy 配置iis服务器来打开webgl

最简单的方法是不需要配置服务器&#xff0c;打包的时候直接build and run&#xff0c;但是有时候如果我们需要调整js的内容&#xff0c;会很不方便&#xff0c;所以配置一个iis服务器还是很有必要的 首先要开启iis服务 控制面板&#xff0c;查看方式选类型&#xff0c;点击程…

android viewpager 禁止滑动

android viewpager 禁止滑动 前言一、viewpager 禁止滑动是什么&#xff0c;有现成方法吗&#xff1f;二、使用setOnTouchListener三、使用自定义viewpager总结 前言 本文介绍了本人有一个相关的需求需要实现这一功能&#xff0c;在过程中发现自己之前没做过&#xff0c;然后记…

用C++和python混合编写数据采集程序?

之前看过一篇文章&#xff0c;主要阐述的就是多种语言混合编写爬虫程序&#xff0c;结合各种语言自身优势写一个爬虫代码是否行得通&#xff1f;觉得挺有意思的&#xff0c;带着这样的问题&#xff0c;我尝试着利用我毕生所学写了一段C和python混合爬虫程序&#xff0c;目前运行…

基于Spring Boot的疫苗接种系统-计算机毕设 附源码 32315

基于Spring Boot的疫苗接种系统 摘 要 预防预接种工作实行网络信息化管理&#xff0c;是我国免疫规划工作发展的需要。接种信息实行网络信息化不仅是预防接种工作步入了一个新的台阶&#xff0c;更重要的是解决了多年疫苗接种过程种&#xff0c;免疫接种剂次不清&#xff0c;难…

2023-简单点-yolox-pytorch代码解析(一)-nets/darknet.py

yolox-pytorch: nets/darknet.py yolox网络结构yolox-pytorch目录今天解析注释net/darknet.pyFocusBaseConvDWConvSPPBottleneckDarknet未完待续。。。 yolox网络结构 yolox-pytorch目录 今天解析注释net/darknet.py #!/usr/bin/env python3 # 指定使用python3来执行此脚本 …

电子签名软件,在教育行业中如何应用?

电子签名软件简化签署流程&#xff0c;降低签署门槛&#xff0c;让更多人便捷地参与到签署中来。 微签作为国内电子签名软件的拓荒者之一&#xff0c;拥有19年的研发应用经验&#xff0c;提供专业的企业电子签名服务。微签的电子签名软件广泛应用于审批场景&#xff0c;实现高…

win系列:电脑设置关闭屏幕和休眠时间不起作用解决方案

电脑设置关闭屏幕和休眠时间不起作用解决方案 一. 笔记本电脑30s自动锁屏&#xff0c;怎么设置都没用?方法一&#xff1a;使用快捷键方法二&#xff1a;开始菜单设置如果需要对锁屏进行背景等的设置&#xff0c;建议你采用这个方法来进行。方法三&#xff1a;控制面板设置怎么…

从0开始学习JavaScript--JavaScript 箭头函数

JavaScript的现代语法&#xff0c;箭头函数&#xff08;Arrow Functions&#xff09;是一个不可忽视的重要部分。它们不仅提供了更简洁的语法&#xff0c;还改变了函数的作用域规则。在这篇文章中&#xff0c;将深入研究JavaScript箭头函数的概念、语法、用法以及它们与传统函数…

使用Git客户端向gitee免密推送项目代码(保姆级流程哦)

1.进入Git官网手动下载git的客户端可执行程序 一路next即可 2.找到安装路径下的3.进入git-bash 根据如下的代码一次执行只需要修改对应的username和自己再gitee中绑定的邮箱 4.分发私钥到邮箱 产生私钥的时候回车三次即可&#xff1b;查看私钥如下图及正常&#xff1b; 5.进…

C++设计模式——工厂模式 :简单工厂、工厂方法、抽象工厂

工厂模式可以分为三种&#xff0c;简单工厂模式&#xff0c;工厂方法模式和抽象工厂模式。 那么&#xff0c;这三种工厂模式长啥样&#xff0c;又为啥会衍生出这三种模式来呢&#xff1f;本篇和大家一起来学习总结一下。 一、简单工厂模式 简单工厂SimpleFactory 负责创建所有…

Zabbix 6 详细安装部署教程

目录 一、安装 MySQL 数据库 二、安装 zabbix 监控平台 三、编辑配置文件 四、启动服务 五、zabbix-web 安装 zabbix web 出图展示乱码问题解决方案 zabbix 的安装部署非常简单&#xff0c;官方提供了四种安装途径&#xff0c;分别是二进制 rpm 包安装方式、源码安装方…

使用 DMA 在 FPGA 中的 HDL 和嵌入式 C 之间传输数据

使用 DMA 在 FPGA 中的 HDL 和嵌入式 C 之间传输数据 该项目介绍了如何在 PL 中的 HDL 与 FPGA 中的处理器上运行的嵌入式 C 之间传输数据的基本结构。 介绍 鉴于机器学习和人工智能等应用的 FPGA 设计中硬件加速的兴起&#xff0c;现在是剥开几层“云雾”并讨论 HDL 之间来回传…

微信小程序仿网易严选(附精选源码32套,涵盖商城团购等)

商城主要实现的功能 首页、专题、分类、购物车、我的小程序授权登陆获取用户信息首页包含品牌制造页、品牌制造详情页面、新品首发页面、人气推荐页面、各分类列表商品详情页面&#xff0c;包含常见问题、大家都在看商品列表、加入购物车、收藏商品、立即购买、下订单、选择收…