各位线上朋友,大家上午好!
我是来自ScaleFlux解决方案团队。今天我给大家带来的分享是《可计算存储在数据库应用场景的实践》。内容主要是围绕可计算存储原理以及如何给企业数据库降本增效。

首先有些朋友可能对可计算存储这个概念还比较陌生。所以这里我先来简单介绍一下背景。
近十多年来,数据的产生和使用出现爆发式增长,而存储产能却跟不上,这给IT系统带来巨大的挑战。其中之一就是企业数据存储成本在增加。为此很多数据库提供数据压缩方案。
但是,随着摩尔定律的失效,CPU性能增速变缓,面对海量数据的运算需求,单机的CPU算力也非常紧张。
当传统的计算和存储方案很难满足数据增长需求时,就需要通过创新来提升计算和存储的效率。其中一个有效的解决方案就是让计算和存储分流,将部分计算交给更专业高效的设备去完成。
比如说 AI复杂的计算下推给 GPU/TPU等芯片,网络方面繁重的压缩和加密运算交给智能网卡等芯片,存储的计算可以卸载到SSD内部。这个就是可计算存储诞生的背景。

在产业界有个可计算存储工作组,专门从事计算存储标准和模型规范的定义。ScaleFlux是这个组织的创始成员之一。如果这个组织成员公司已经发展到40多家。
这里请允许我简单介绍一下公司。ScaleFlux创立于2014年,主要从事可计算存储的研究、生产和销售,是大规模部署可计算存储的领导者。

ScaleFlux目前已经推出第三代可计算存储产品 SFX3000 。
SFX3000 本质上还是企业级NVMe SSD,新增内置计算加速引擎,所以在成本和性能上给SSD带来很大的变化。

我们来具体看看SFX3000 的产品特性。
首先我们可以看到很多企业级NVMe SSD基本的特性。像支持PCIe 4.0协议、U.2接口、标准的NVMe驱动,S.M.A.R.T工具、TRIM、LDPC纠错等等。
同时也看到 SFX3000独特的特性,如透明压缩/解压缩、原子写等。
后面我们将逐步介绍透明压缩、原子写对SSD成本和性能的改变。

首先我们来看CSD透明压缩的原理。
右图是应用读写SSD的示意图。上面是应用,中间是OS内核层,下面是硬件层。应用发起数据读写,从文件系统到通用块层到NVMe驱动,通过PCIe接口,发送到SSD内部,再通过后端闪存控制器发送到后端闪存NAND。然后数据读出来再原路返回。
普通SSD读写路径就是这样,CSD不一样的地方是在数据进入SSD后的路径上会增加硬件压缩,然后再把压缩的数据发往后端闪存。读取的时候数据从闪存读出来后会经过解压缩再通过前端返回给应用。
这个压缩逻辑主要是硬件电路实现,不占用主机CPU。同时对读写延时的影响非常小,但是它会大大压缩后端闪存带宽的实际使用值。
我们的研究表明,当前端接口支持PCIe 4.0和5.0时,前端带宽通常不是应用读写的性能瓶颈,而SSD内部的后端闪存带宽更容易成为性能瓶颈。它对SSD读写延时影响比较大。
左下角图是SSD读写延时等待时间跟SSD闪存带宽使用率关系。可以看出,使用率越低,前端读写延时等待也越低。这个SSD读写延时是可以通过 iostat 命令观察到。这就是 CSD在性能方面比SSD标盘更好的关键原因。
后面我们会通过很多组测试数据来证明这点。
不过,SSD后端闪存带宽利用率不好观测,但是SSD的写放大因子却可以。

透明压缩不光能降低后端闪存带宽使用率,还能降低SSD的写放大。
这里我稍微赘述一下SSD写放大的原理。
SSD的写原理比较像 LSM Tree数据库,支持新增写,但不支持原地修改,只能通过异地更新来间接实现数据修改。
如下面SSD的闪存写示意图。闪存读写以页为单位,业务先后写入ABCDEFGH数据后,要更新ABCD,只能再找新的页写入A’B’C’D’数据。那老的ABCD数据就是垃圾数据,它们所在的闪存页不能用于写入,除非擦除掉。而闪存擦除的单位是块,一个块里可能有几百个页,里面有些页还有有效数据。
所以擦除之前需要对当前块上有效数据进行搬迁。这个数据搬迁不是业务发起的,是SSD后台GC线程发起的,会占用部分后端闪存带宽。这种业务写引发的SSD额外的写活动就叫写放大。SSD的闪存写入量是可以观察的,通过SSD提供的接口,可以计算SSD的写放大值。SSD标盘的写放大值通常是大于等于1。
最右边的图就是CSD的闪存写示意图,可以看到由于有了透明压缩,同样的数据占用的闪存页更少,所以剩余空间相对比较足,GC的必要性就不是很高,GC活动就相对很少,数据搬迁自然也少,写放大就很低。CSD的写放大是可以小于1的。

前面我们从理论上分析CSD透明压缩可以降低写放大,那接下来我们就看具体的测试数据来证明这点。
为此,我们测试写入了多组不同压缩特性的随机数据。可以看出橙色的写放大值随着FIO数据压缩比的增加而下降,最低的时候在0.5左右。对于SSD标盘,当测试方法定了后,不管数据自身如何变化,其写放大基本保持不变,随机写场景写放大一般在3以上。
CSD透明压缩不光是改变了SSD的写放大因子,还增加了SSD的寿命(DWPD值)以及随机读写IOPS值。
图中绿色的是SSD的寿命DWPD,从写放大公式推导出来。柱状图是4KiB随机写IOPS值。可以看到随着数据压缩比的增加,这两项指标都能够提升2倍以上。
数据压缩特性变化会提升SSD寿命和性能,这是CSD相对于SSD标盘的一个独特之处。
关于透明压缩对性能的提升,我们再来看更多的FIO场景测试数据。

通常存储选型时考察SSD的性能使用最多的就是FIO测试。这里展示的就是使用FIO对不同容量规格的CSD进行测试,并且跟SSD标盘做对比。测试场景包括顺序读写和随机读写,考察顺序读写的带宽、随机读写的IOPS和延时。
实际测试表明,CSD的128KiB顺序读写带宽相比标盘更高一些,更能接近PCIe 4.0的带宽限制。CSD的4KiB随机读写IOPS也是比标盘SSD高。其中写方面的优势更明显,能提升有80%~200% 左右。IOPS更高说明延时更低,在高并发读写下,CSD的读写延时相比标盘更低且更稳定。
这里看的是单纯的读或者写,我们可以看出随机读的IOPS是远远高于随机写的IOPS。这是因为SSD内部的写通常伴随着写放大和GC。
实际数据库业务IO通常都是读写混合一起的。
接下来我们再看看CSD读写混合的特点。

在读写混合场景里,总的IOPS的值会受写请求比例影响。当写请求比例越高的时候,总体的IOPS会下降。所有的SSD都是这个特点,包括CSD也一样。
不一样的地方是,CSD由于有透明压缩,其性能下降的幅度会比SSD标盘要低很多。下面左图是IOPS绝对值随着横坐标写比例增加而下降,右图是CSD和SSD的性能下降的比例趋势。橙色的是SFX3000,蓝色的SSD标盘。蓝色线更低。这个曲线走向证实了刚才的结论。
前面是从存储视角考察了可计算存储的性能和特性等。接下来我们再从数据库应用视角来看。

可计算存储在数据库应用里主要价值就是降本增效。除了传统的MySQL、PG、ORACLE数据库,还有一些国产数据库、云原生数据库以及部分非关系型数据库等,部署在可计算存储上都能取得不同的收益。
这些收益主要从4个角度去看:读写延时、读写QPS、存储容量成本、存储寿命等。不同数据库架构和存储引擎原理不同,取得的收益也不完全相同。其中以MySQL数据库的收益最多最大。比如说更低的延时,3倍QPS提升,以及存储成本降低到一半以下。其他数据库部署在CSD上,存储成本上都能降低一半,寿命也都有确定的提升,只是性能上面提升水平会有大有小。
接下来我们看几个具体的数据库测试数据。

首先看MySQL数据库的压缩降本方案跟CSD透明压缩的比较。
先说结论。MySQL数据库支持页压缩,表压缩等多种压缩方案和算法,但是CSD透明压缩在压缩比效果上要远高于MySQL数据库。
从图中可以看出,同样规模的测试数据,使用MySQL数据库开压缩,部署在SSD标盘上确实可以节省存储成本,最大压缩比是页压缩zlib算法方案,达到2.74 。但是MySQL数据库不开压缩部署在SFX3000上,数据存储透明压缩比可以到3.57。比所有MySQL的压缩方案都要高。这个原因有三点:
CSD透明压缩算法是zlib(level6),压缩比是高于lz4等算法。
CSD透明压缩在硬件内部,文件系统下面,而MySQL的zlib压缩在文件系统上层,文件系统会做4KB对齐,数据库文件可能有一些数据空洞,到了CSD内部会被透明压缩完全压缩掉。
MySQL的压缩通常只做数据文件,而CSD透明压缩是面向盘上所有文件的。
所以跟数据库压缩方案相比,CSD透明压缩的好处就很明显:
ü对应用完全透明,应用不需要做任何改造。
ü透明压缩压缩效率还更高。
那么这么高的压缩比跟成本有什么关系呢?
答案是压缩比高时,SFX3000是可以扩容使用。比如说扩容两倍,一块3.84T的SFX3000就可以当7.68T的普通盘用。简单说就是一块盘当两块盘用,数据存储成本大幅下降。
这就是CSD降本的原理,很多客户使用ScaleFlux产品的主要原因就是为了降本。在云上面CSD的这个特性价值更大。比如说阿里云PolarDB的一款大容量低成本存储就使用的是CSD透明压缩技术。据说实际成本能节省60%。
SFX这个产品在携程和唯品会的MySQL业务集群里也有大量使用。
CSD 透明压缩能降低成本,那是否会牺牲性能呢?接下来我们再看看性能数据。

前面对比了MySQL多个压缩方案,通常观点认为开压缩会降低性能,其实说就是应用数据库的压缩方案特点。而CSD透明压缩使用的是盘内算力,不占用主机CPU,所以性能不会下降反而会提升。
我们看一下sysbench OLTP场景测试数据。图中以MySQL在标盘上不开压缩的性能为基准,对比MySQL开压缩部署在SSD标盘上、MySQL不开压缩部署在SFX3000上的性能。在SFX3000上有两组数据,后者使用了CSD原子写方案。
图中展示的性能增量数据。可以看出MySQL在CSD上2个结果优势都很明显。如果不用CSD原子写,CSD上MySQL读写混合性能最大提升150%;如果使用CSD原子写,最大提升300%以上。
从图中蓝色的数据可以看出原子写对MySQL写性能的促进作用很大。
不过这里需要说明的是,CSD的原子写只是功能上保证8KB~128KB的IO原子性,对SSD读写性能并没有促进作用。之所以MySQL测试中性能还能再翻一倍,其原因是关闭了MySQL的双写缓冲。熟悉双写缓冲原理和目标的人都能看出,MySQL自身为了保证16KB的IO原子性,牺牲了读写性能。

看完MySQL数据库的测试数据,我们再看看PG数据库。
首先是数据压缩比。同样的sysbench数据,在PG上数据压缩比比MySQL上还要高一些,同时高并发读写场景下,读写混合的QPS在CSD上比SSD标盘上高出最大1倍。
此外,PG还有个空间换性能的设计,它可以跟 CSD透明压缩完美结合,即降低建表时的填充因子来提升数据库更新的性能 同时又不会浪费空间。我们看图,图中箭头方向就是降低填充因子后在CSD盘和SSD标盘上引起空间和性能变化。可以看出作用于同样规模的数据表,填充因子降低25%,CSD上的PG性能提升约28%左右,代价是数据NAND容量仅增加 0.01TiB,约3%。而SSD标盘上性能提升约25% 左右,代价就是空间增加 0.3TiB,约33%。
由此可见,在CSD上部署PG,降低填充因子,对读写混合场景的性能是有提升的,并且还不用担心浪费存储空间。其原因是PG每个页里的预留空间在CSD透明压缩下几乎不占用NAND容量。

关于PG在CSD上的性能,我们再看一组详细的数据。这个是PG在SFX3000和SSD标盘上性能差异对比,基准数据是SSD标盘上的PG,其他两个是SFX3000上的PG性能提升比例。
先看蓝色的数据,PG在SFX3000上性能在不同场景下会有10%~125%的性能提升。再看橙色的数据,当降低PG填充因子时,数据库读性能会略有下降,写更新的性能会有个明显的提升,相比标盘提升水平在 25%~ 210%左右。

最后,我们简单总结一下可计算存储带给企业数据库的价值。
首先是降低数据存储成本。大部分线上业务数据库在不开启压缩的情况下,数据压缩比都高于2.4。使用CSD将容量扩容一倍,至少能降低一半存储成本。
第二是提升读写性能。部分数据库在 IO成为性能瓶颈时,通过CSD还可能将性能再提升 25%~150% 左右。如果使用CSD的原子写替换数据库自身的原子写方案,性能还可以额外再提升。
如果数据库本身有一些空间换性能的设计,那么可以跟CSD完美结合,实现性能和空间的双赢。
第三点就是可计算存储的寿命会更长。有些数据库开压缩后,CSD透明压缩比可能比较低。虽然成本降低不多,但是其寿命却还是能显著提升。这对于个别在乎SSD寿命的场景也是很有帮助的。比如说QLC SSD。
OK 今天的分享就到这里,对可计算存储原理和实践有兴趣的朋友可以查看我们公众号、官网或者线下联系我们。
谢谢大家!
更多阅读




