上个月初,在Percona的博客中看到一篇关于计算存储的性能测试文章(详见文末的链接),其中提到的一些特性,引起了我的一些兴趣,于是,又扩展研究了一下计算存储相关的技术,突然发现计算存储这块对数据库系统来说,或许能多多少少解决一些瓶颈与痛点、甚至还能够在不影响性能的前提下大幅度降低TCO。是什么样的特性有如此魔力呢? 这里先卖个关子,文中提到的内容我们稍后再说,我们先来看看数据库系统的生命周期管理中,可能碰到哪些瓶颈与痛点。然后,再介绍计算存储是如何系统性地化解这些瓶颈与痛点的。 PS:以下内容仅代表个人观点。另外,由于本人对MySQL比较熟悉,下面以MySQL InnoDB引擎为例简单列举几个典型的痛点进行阐述。
1、数据库系统中典型的瓶颈与痛点有哪些?
数据库性能的两个关键指标:(latency)与事务的并行数量(tps),两者相辅相成,且成反比,事务的latency越低,则允许tps就越高,反之,事务的latency越高,则允许的tps就越低。越高的tps就代表着越好的性能,反之就代表越低的性能。数据库对IO的响应延迟非常敏感,其直接影响着事务的响应延迟,而事务的响应延迟则在很大程度上决定着数据库的tps高低。因此,在一个硬件规格配置合理的服务器中运行MySQL数据库,且MySQL的索引使用比较规范的场景中,我们常常能够看到最先达到瓶颈的就是IO子系统 围绕着这2个关键指标,我这里罗列了4个可能出现瓶颈与痛点的典型场景,如下:
1.1. 单台数据库服务器存储能力不足
存储容量不足
传统解决方案
存储负载过高(吞吐量过高)
传统解决方案:
缺点:
临时解决方案需要频繁关注存储的负载情况,而且常常顾此失彼 更换配件需要增加额外的成本,做数据拆分更是增加了业务的复杂度和维护成本、而且还引入了一些新的问题(详见"1.4. 并发查询数过高导致数据库实例负载过高"中提到的缺点)
1.2. 数据库服务器内存不足
传统解决方案:
临时清理不需要的表数据或者调小MySQL在各种缓存分配上的参数值,以便腾出更多的内存来使MySQL Server能够做更多的事情 增加物理内存,并调大MySQL的各种缓冲分配参数值
缺点:
临时解决方案需要持续关注内存使用量,且需要频繁地操作,而且,这是挖东墙补西墙的做法 增加物理内存,除了增加成本之外,还会对业务造成一定影响(服务器需要关机)
1.3. 单个事务过大导致查询性能低下
传统解决方案:将大事务拆分成小事务
无法拆分的大事务,在硬件规格不变的前提下,可以对读写事务分别做一些优化。例如:写可以在执行前,会话级别将binlog格式修改为statement,以减少主从实例之间传输的binlog日志量;读事务可以拆分到只读从库中,以减少主库的访问压力
缺点:
将大事务拆分成小事务,并不会让原本大事务需要完成的工作任务少做一些,而是拆分成小事务之后,降低对其他并行事务的影响(例如:大事务可能长时间的持有锁、二进制日志文件句柄资源等,从而导致长时间的阻塞其他并行事务,导致并行事务执行失败)
1.4. 并发查询数过高导致数据库实例负载过高
传统解决方案:
杀死高负载查询会话、后续优化慢查询 读写分离,并增加只读从库,扩展只读能力 数据拆分,将数据分散到多个数据库实例中,扩展读/写能力。
缺点:无论是垂直拆分还是水平拆分,都需要应用配合相应的改造,而且,数据拆分之后,会引入新的痛点,类似如下(虽然这些痛点可以通过技术改造来解决,但成本过高,而且需要较长时间来磨合才能够使其达到稳定,另外,可能需要和业务深度契合改造,不同的客户可能需要做不一样的改造):跨分片访问,导致不得不启用分布式事务来保证跨分片访问的数据一致性,而分布式事务本身除了实现起来有一定工程量之外,应用本身也需要配合改造
如果分片跨了不同的实例,则无法做到数据的全局一致性备份,要实现跨实例多数据分片的全局数据一致性备份,需要中间件、数据库都做一些改造 不受事务控制的DDL语句,无法通过分布式事务来保证数据的全局一致性,因此,还需要额外的机制来保证数据的全局一致性 如果分片数据出现倾斜、或者访问负载出现倾斜,则还可能需要频繁地做分片数据的迁移(将大数据量的分片、高负载实例中的分片,迁移到较为空闲的实例中)
2、计算存储是如何解决数据库的瓶颈与痛点的?
针对计算存储,我这里列出3个我认为比较重要的特性,先对其原理做简单的介绍(关于相关原理的详细介绍,可参考文末的链接),然后再说说这些特性是如何解决上述数据库的瓶颈与痛点的
第一个重要的特性:存储支持硬件级别的原子写
数据库为何需要原子写?

计算存储支持原子写,对数据库的收益是什么呢?
第二个重要的特性:数据透明压缩/解压
数据库为何需要压缩/解压?
什么是数据透明压缩/解压?我们可以从目前几种主流的压缩/解压方式的角度着手来理解



计算存储支持透明的压缩/解压,对数据库的收益是什么呢?
第三个重要的特性:计算下推到存储(当然,不同业务需要下推的计算逻辑可能有所不同,因此,不通用的计算逻辑下推,可能需要联合研发)
数据库为何需要将计算下推到存储?
什么是计算下推到存储?下面用三个图简单说明计算下推到存储的实现逻辑



计算存储支持将计算下推到存储设备,对数据库的收益是什么呢?
3、对计算存储的未来展望
计算存储的诸多优良的特性,使得它能够系统性地一次性缓解、解决多个数据库的瓶颈与痛点,而不是像传统方法那样,费时费力费财不说、还常常是顾此失彼 虽然说条条大路通罗马,没有解决不了的技术难题,不使用计算存储,也肯定还有其他多种多样的解决方式,但我们也要看具体是如何解决的,如果有近一点的大路,为什么要舍近求远呢? 个人认为计算存储,是数据库领域一个具有前瞻性的发展方向,当然,并不是说用了计算存储就可以一劳永逸,但至少,你的数据量没有达到计算存储都吃不消的地步时,就可以或多或少避开或者延缓上文中提到的一些瓶颈与痛点。另外,还有一点很重要,对于单台服务器的TCO成本下降可能不痛不痒,但如果你的服务器规模较大,能够节省的成本不可小觑哦! 至于以后,计算存储能发展成什么样,天知道,但我想,来自底层可通用的技术突破,比起在应用层做一些难以通用的技术改造更加合算,因此,我相信只要有强烈的需求存在,就必然有勇夫会持续去突破! PS:以上内容,是根据一些已公开发表的文章整理得出(详见文末的链接),需要详细了解的读者,请移驾文末的参考链接,其中包括了更多的细节说明和完备的性能测试数据,希望在大家的数据库之旅的路上,本文能够对大家或多或少有所帮助!
4、参考链接
Percona 博客中关于ScaleFlux CSD 2000(一款来自ScaleFlux的高性能计算存储产品)的介绍:https://www.percona.com/blog/2020/08/06/how-can-scaleflux-handle-mysql-workload/技术白皮书(包含更多的CSD 2000的测试结论和数据):https://learn.percona.com/hubfs/Collateral/Whitepapers/Testing-the-Value-of-ScaleFlux.pdf 微信公众号"yangyidba"中的"翻译|MySQL 基于ScaleFlux SSD性能测试":https://mp.weixin.qq.com/s/MNBNKlxiBBXGSOyzm5HGdQ 微信公众号"老叶茶馆"中的"可计算存储:数据压缩和数据库计算下推":https://mp.weixin.qq.com/s/iAg64XNrrZxRCLdlRJjFCQ 微信公众号"ScaleFlux"中的"可计算存储: 透明压缩,数据库IO模型和SSD寿命":https://mp.weixin.qq.com/s/jh4JzyXSGhxldT01paCPvw 微信公众号"SSDFans"中的"太强大了!NVMe SSD变身内存":https://mp.weixin.qq.com/s/niZmq170l4HDnfyw0rmRFg MariaDB 中关于实现自动原子写的介绍:https://mariadb.com/kb/en/atomic-write-support/ https://mariadb.com/kb/en/mariadb-1055-changelog/
最后修改时间:2020-09-21 15:29:50
文章转载自罗小波,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




