容器技术改变了应用交付、运行的方式,几乎各种Linux环境下的应用程序都可以使用容器来运行。但是否能在容器环境里运行数据库应用,以及数据库应用是否适合在容器里运行,一直都是大家很关注的问题,今天我们就来深入分析一下容器环境运行MySQL数据库的事。
在容器中运行数据库,能帮助用户提高服务器利用效率,降低基础架构成本,更快速地部署、更便捷地管理数据库服务。
根据云监控供应商Datadog的调查报告, Postgres、MongoDB和MySQL等数据库技术都位于容器上运行的十大技术之中——并且使用量还在增长。

数据库实际上由两大组件组成:读取、写入和查询数据的应用,以及数据存储,我们通常称之为数据卷。MySQL等数据库应用所需的计算资源完全可以通过容器技术提供,是否能流畅运行MySQL数据库的关键在于容器存储方案。国内大多数用户在选择容器存储时,通常有以下几种方案:
大多数客户对容器存储的以下几点尤为关注:
关于用户关注的上述特性,我们在之前的文章中都有过介绍,在以后的文章里也会进一步描述。本文针对用户最关注的,MySQL基于不同存储的实际性能进行了实际测试和对比。
在介绍实际测试性能之前,有必要介绍一下MySQL数据库的存储引擎,以及相关的写入策略,这对于数据库的实际使用性能有非常关键的影响。
MySQL存储引擎
MySQL数据库提供插件式的存储引擎,这个存储引擎提供了一系列标准的管理和数据读写服务的支持,不同的存储引擎有不同的特点,存储引擎对于业务开发人员而言是透明的。其中,InnoDB是著名的第三方存储引擎,后被Oracle收购,是MySQL数据库OLTP(Online Transaction Processing,在线事务处理)应用中使用最广的存储引擎,也是5.5.8版本后,MySQL默认的存储引擎,以下的测试就基于InnoDB存储引擎进行。
InnoDB刷数据策略
InnoDB中有一项设置——innodb_flush_method,这项设置负责控制InnoDB刷数据时所使用的系统调用。所谓刷数据,即将缓存在内存中或临时磁盘存储区域中的数据写入特定的日志及数据文件(log,如ib_logfile和数据库data file),完成持久化。
刷数据动作可能是因为内存区域已满并且系统需要释放一些空间而触发,或是因为事务完成更改的commit操作而触发,或者由需要终结所有未完成工作的关闭操作而触发。
innodb_flush_method的值对应着不同的系统调用,从而会触发不同的系统行为,经常使用的值包括:
YRCloudFile可以支持这种刷数据方式,即可以很好地确保每个数据都直接落盘,同时减少频繁调用fsync带来的开销,极大提升性能。

sysbench性能对比测试
在下面进行的性能对比的测试中,我们在MySQL容器中使用了以下几种存储方案进行对比:
除物理SSD盘外,YRCloudFile和Ceph集群都采用以下四台相同的物理服务器进行搭建:
MySQL版本为8.0.14,使用InnoDB作为存储引擎,innodb_flush_method设为O_DIRECT_NO_FSYNC ;Ceph版本为mimic,Ceph基于filestore;sysbench版本为1.0.17,基于50个表,每个表中包含100万条数据的数据库进行oltp_write_only和oltp_read_write测试。
测试结果如下:


从测试结果看:
也许有读者会问,从单个MySQL实例的测试性能看,YRCloudFile分布式存储系统的优势如何体现呢?通过使用YRCloudFile,可以充分发挥集群中所有磁盘的性能,使整个集群支持更多的MySQL实例,而单块SSD盘的性能可以支撑的MySQL实例就有限得多了。此外,YRCloudFile也正在通过硬件offload,NVMe优化等方式,进一步缩短集群IO的延时,使集群IO的延时尽可能接近本地SSD的延时,从而使单MySQL实例的性能更加接近使用本地SSD运行MySQL的性能。
在这篇文章中,我们介绍了如何通过设置MySQL InnoDB的innodb_flush_method参数,使用YRCloudFile获得最佳的MySQL运行性能,并对比了在同等环境下,使用SSD、CephRBD、CephFS所获得的性能。在后续文章里,我们还会分享更多基于YRCloudFile运行各种中间件应用的最佳实践,以及相关的技术细节。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。