本文由云+社区发表

作者介绍:简怀兵,腾讯云数据库高级工程师,负责腾讯云CDB内核及基础设施建设;先后供职于Thomson Reuters和YY等公司,PTimeDB作者,曾获一项发明专利;从事MySQL内核开发工作8年,具有丰富的优化经验;在分布式存储等领域有较丰富经验。

MYSQL数据库适用场景广泛,相较于Oracle、DB2性价比更高,Web网站、日志系统、数据仓库等场景都有MYSQL用武之地,但是也存在对于事务性支持不太好(MySQL 5.5版本开始默认引擎才是InnoDB事务型)、存在多个分支、读写效率瓶颈等问题。

所以如何用好MYSQL变得至关重要,一方面需要通过MYSQL优化找出系统读写瓶颈,提高数据库性能;另一方面需要合理涉及数据结构、调整参数,以提高用户操作响应;同时还有尽可能节省系统资源,以便系统可以提供更大负荷的服务。本文将为大家介绍腾讯云团队是如何对Mysql进行内核级优化的思路和经验。

早期的CDB主要基于开源的Oracle MySQL分支,侧重于优化运维和运营的OSS系统。在腾讯云,因为用户数的不断增加,对CDB for MySQL提出越来越高的要求,腾讯云CDB团队针对用户的需求和业界发展的技术趋势,对CDB for MySQL分支进行深度的定制优化。优化重点围绕内核性能、内核功能和外围OSS系统三个维度展开,具体的做法如下:

一.内核性能的优化

由于腾讯云上的DB基本都需要跨园区灾备的特性,因此CDB for MySQL的优化主要针对主从DB部署在跨园区网络拓扑的前提下,重点去解决真实部署环境下的性能难题。经过分析和调研,我们将优化的思路归纳为:“消除冗余I/O、缩短I/O路径和避免大锁竞争”。以下是内核性能的部分案例:

1.主备DB间的复制优化

问题分析

如上图所示,在原生MySQL的复制架构中,Master侧通过Dump线程不断发送Binlog事件给Slave的I/O线程,Slave的I/O线程在接受到Binlog事件后,有两个主要的动作:

  • 写入到Relay Log中,这个过程会和Slave SQL线程争抢保护Relay Log的锁。
  • 更新复制元数据(包含Master的位置等信息)。

优化方法

经过分析,我们的优化策略是:

  • Slave I/O线程和Slave SQL线程是典型的单写单读生产者-消费者模型,是可以做到无锁设计的;因此实现思路就是Slave I/O线程在每次写完数据后,原子更新Relay Log的长度信息,Slave SQL线程读取Relay Log的时以长度信息为边界。这样就将原本竞争激烈的Relay Log锁化解为无锁;
  • 由于Binlog事件中的GTID(Global Transaction Identifier)和DB事务是一一对应的关系,所以Relay Log中的数据本身已经包含了所需要的复制元数据,所以我们可以不写Master info文件,消除了冗余的文件I/O;
  • 于DB都是以事务为更新粒度的,因为在Relay Log文件I/O上,我们通过合并离散小I/O为事务粒度的大I/O等手段,使磁盘I/O得以大幅提升。

优化效果

如上图所示,经过优化:左图35.79%的锁竞争(futex)已经被完全消除;同压测压力下,56.15%的文件I/O开销被优化到19.16%,Slave I/O线程被优化为预期的I/O密集型线程。

2.主库事务线程和Dump线程间的优化

问题分析

如上图所示,在原生MySQL中多个事务提交线程TrxN和多个Dump线程之间会同时竞争Binlog文件资源的保护锁,多个事务提交线程对Binlog执行写入,多个Dump线程从Binlog文件读取数据并发送给Slave。所有的线程之间是串行执行的!

优化方法

经过分析,我们的优化策略是:

  • 将读写分离开来,多个写入的线程还是在锁保护下串行执行,每一个写入线程写入完成后更新当前Binlog的长度信息,多个Dump线程以Binlog文件的长度信息为读取边界,多个Dump线程之间并行执行。以这种方式来让复制拓扑中的Dump线程发送得更快!

效果

经过测试,优化后的内核,不仅提升了事务提交线程的性能,在Dump线程较多的情况下,对主从复制性能有较大提升。

二.主备库交互流程优化

问题分析

如上图所示,在原生MySQL中主备库之间的数据发送和ACK回应是简单的串行执行,在上一个事件ACK回应到达之前,不允许继续发送下一个事件;这个行为在跨园区(RTT 2-3ms)的情况性能非常差,而且也不能很好地利用带宽优势。

优化方法

经过分析,我们的优化策略是:

  • 将发送和ACK回应的接收独立到不同的线程中,由于发送和接收都是基于TCP流的传输,所以时序性是有保障的;这样发送线程可以在未收ACK之前继续发送,接受线程收到ACK后唤醒等待的线程执行相应的任务。

效果

根据实际用例测试,优化后的TPS提升为15%左右。

三.内核功能的优化

1. 预留运维帐号连接数配额

在腾讯云上,不时遇到用户APP异常或者BUG从而占满DB的最大连接限制,这是CDB OSS帐号无法登录以进行紧急的运维操作。针对这个现状,我们在MySQL内核单独开辟了一个可配置的连接数配额,即便在上述场景下,运维帐号仍然可以连接到DB进行紧急的运维操作。极大地降低了异常情况下DB无政府状态的风险。该帐号仅有数据库运维管理权限,无法获取用户数据,也保证了用户数据的安全性。

2. 主备强同步

针对一些应用对数据的一致性要求非常高,CDB在MySQL原生半同步的基础上进行了深度优化,确保一个事务在主库上提交之前一定已经复制到至少一个备库上。确保主库宕机时数据的一致性。

四.外围系统的优化

除了以上提到的MySQL内核侧的部分优化,我们也在外围OSS平台进行了多处优化。例如使用异步MySQL ping协议实现大量实例的监控、通过分布式技术来加固原有系统的HA/服务发现和自动扩容等功能、在数据安全/故障切换和快速恢复方面也进行了多处优化。

此文已由作者授权腾讯云+社区发布


举个栗子看如何做MySQL 内核深度优化 1相关推荐

  1. 举个栗子看如何做MySQL 内核深度优化

    2019独角兽企业重金招聘Python工程师标准>>> 本文由云+社区发表 作者介绍:简怀兵,腾讯云数据库高级工程师,负责腾讯云CDB内核及基础设施建设:先后供职于Thomson R ...

  2. mysql udb_UDB高可用数据库内核深度优化

    原标题:UDB高可用数据库内核深度优化 UDB是UCloud提供的云数据库,支持实例级别的高可用.UCloud数据库团队在数据库原生复制的多个方面进行了深度优化,提升UDB高可用数据库的功能和性能. ...

  3. mysql40190_MySQL 内核深度优化

    MYSQL数据库适用场景广泛,相较于Oracle.DB2性价比更高,Web网站.日志系统.数据仓库等场景都有MYSQL用武之地,但是也存在对于事务性支持不太好(MySQL 5.5版本开始默认引擎才是I ...

  4. 阿里妈妈基于TensorFlow做了哪些深度优化?TensorFlowRS架构解析

    一. 综述 深度学习比传统的逻辑回归有着更强的模型刻画能力,同时也带来了计算力百倍提升的需求.相比图像.语音.视频等领域,搜索.广告.推荐等场景有着独特的场景特点: 样本规模和特征空间通常非常巨大,千 ...

  5. 举个栗子!Tableau 技巧(70):学做时尚的环状条形图(跑道图)

    在 Tableau 中,如何制作环条图呢?我们用一个简单的栗子(如下图)来分享方法. 本期<举个栗子>,我们给大家分享这个 Tableau 技巧:学做时尚的环状条形图(跑道图). 1.数据 ...

  6. tableau两个不同的图合并_举个栗子!Tableau技巧(59):学做两个集合的维恩图(文氏图)Venn diagram...

    我们常说的维恩图( Venn 图),学名叫:文氏图( Venn diagram ),又称温氏图.这种图表主要用于展示在不同的事物群组(集合)之间的数学或逻辑联系. 爱好篮球的数据粉们,可能看到过这样一 ...

  7. 举个栗子!Tableau技巧(56):自己动手做个仪表盘

    近期,我们陆续收到很多 Tableau 用户需求:希望学习制作仪表盘.用户们既喜欢它的炫酷,又喜欢它能直观表达指标变化的情况. 虽然,从专业的角度出发,我们并不特别赞同大家用 Tableau 去制作仪 ...

  8. 举个栗子!Tableau 技巧(138):学做炫酷的温度计图表

    来自北京的气象分析师提了一个需求:我经常分析温度数据,Tableau 可否实现像温度计那样的图表? 图片来自网络 当然,温度计图表在 Tableau 中可以实现!并且,它不仅可以用来呈现温度数据,还适 ...

  9. 举个栗子!Tableau 技巧(116):做一个有趣的锥状柱形图

    有 Tableau 用户提出很有趣的需求:柱形图太普通了,能不能让每一个柱子上面大.下面小,像圆锥那样呢? 很巧,我遇到过相同的需求,用 Tableau 实现类似 烟花升空 的柱形图(如下图),烟花下 ...

  10. 举个栗子!Tableau技巧(47):学做嵌套组合饼图

    虽然从数据分析的直观性而言,我们并不是特别推崇饼图.但很多数据粉仍对饼图情有独钟,并且很多时候,小伙伴是不得已要用到饼图. 除了环形图,还有一种饼图经常被小伙伴问及它的做法.它就是下面这种两个饼图嵌套 ...

最新文章

  1. opencv bug 合集
  2. asp建站系统源码_网站建设教程:虚拟主机如何安装PageAdmin建站系统
  3. node sqlite 插入数据_使用 Sequelize 操作 Sqlite3 数据库
  4. python遍历文件_python遍历目录文件脚本的示例
  5. mysql alert table 日志_MySQL日志
  6. python技术是什么意思_python中“//”表示什么意思_后端开发
  7. 【HDU - 4990】 Reading comprehension (构造+矩阵快速幂)
  8. HDU-5718 Oracle
  9. mysql库迁移_MySql数据库 指定库迁移
  10. linux脚本定义量,Linux上增加自定义脚本的展现量
  11. Improving Opencv 3 : Mask operations on matrices
  12. 阿克曼函数实现(Java代码)
  13. 苏州科技大学计算机考研资料汇总
  14. 青海大学昆仑学院计算机机考,青 海 大 学 昆 仑 学 院 试 卷.doc
  15. 505错误:Invalid bound statement (not found): com.pc.dao.BookMapper.queryAllBook错误解决
  16. cross_val_score 如何传入early_stopping_rounds等参数 用于 fit
  17. Transformer代码详解与项目实战之Masking
  18. php获取汉字个数,获取文件中汉字个数
  19. 如何利用微信进行微信签到呢?
  20. html页面高度和宽度,html和body元素的高度和宽度

热门文章

  1. 如何知道域名是否解析成功
  2. python_射门小游戏
  3. Android系统简介(中):系统架构
  4. 成因:六大元凶让肝不堪重负
  5. 目标成为Photoshop的轻量级替代软件——Acorn Mac版
  6. iOS获取手机卡IMSI信息
  7. centos7.x中设置hostname方法
  8. BZOJ1108 [POI2007]天然气管道Gaz
  9. jquery伪分页控件
  10. sap关于既是供应商又是客户的处理-转