本文由云+社区发表sql
做者介绍:简怀兵,腾讯云数据库高级工程师,负责腾讯云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路径和避免大锁竞争”。如下是内核性能的部分案例:架构
如上图所示,在原生MySQL的复制架构中,Master侧经过Dump线程不断发送Binlog事件给Slave的I/O线程,Slave的I/O线程在接受到Binlog事件后,有两个主要的动做:并发
通过分析,咱们的优化策略是:运维
如上图所示,通过优化:左图35.79%的锁竞争(futex)已经被彻底消除;同压测压力下,56.15%的文件I/O开销被优化到19.16%,Slave I/O线程被优化为预期的I/O密集型线程。异步
如上图所示,在原生MySQL中多个事务提交线程TrxN和多个Dump线程之间会同时竞争Binlog文件资源的保护锁,多个事务提交线程对Binlog执行写入,多个Dump线程从Binlog文件读取数据并发送给Slave。全部的线程之间是串行执行的!分布式
优化方法
通过分析,咱们的优化策略是:
效果
通过测试,优化后的内核,不只提高了事务提交线程的性能,在Dump线程较多的状况下,对主从复制性能有较大提高。
如上图所示,在原生MySQL中主备库之间的数据发送和ACK回应是简单的串行执行,在上一个事件ACK回应到达以前,不容许继续发送下一个事件;这个行为在跨园区(RTT 2-3ms)的状况性能很是差,并且也不能很好地利用带宽优点。
通过分析,咱们的优化策略是:
根据实际用例测试,优化后的TPS提高为15%左右。
在腾讯云上,不时遇到用户APP异常或者BUG从而占满DB的最大链接限制,这是CDB OSS账号没法登陆以进行紧急的运维操做。针对这个现状,咱们在MySQL内核单独开辟了一个可配置的链接数配额,即使在上述场景下,运维账号仍然能够链接到DB进行紧急的运维操做。极大地下降了异常状况下DB无政府状态的风险。该账号仅有数据库运维管理权限,没法获取用户数据,也保证了用户数据的安全性。
针对一些应用对数据的一致性要求很是高,CDB在MySQL原生半同步的基础上进行了深度优化,确保一个事务在主库上提交以前必定已经复制到至少一个备库上。确保主库宕机时数据的一致性。
除了以上提到的MySQL内核侧的部分优化,咱们也在外围OSS平台进行了多处优化。例如使用异步MySQL ping协议实现大量实例的监控、经过分布式技术来加固原有系统的HA/服务发现和自动扩容等功能、在数据安全/故障切换和快速恢复方面也进行了多处优化。
此文已由做者受权腾讯云+社区发布