从硬件发展及特性看数据库发展2 – 作者:龙渊实验室LongYuanLab

今天这篇文章接续上篇《从硬件发展及特性看数据库发展》,主要从存储的角度来进行一些概述,具体内容如下。

1、固态硬盘的兴起,虽然对传统机械硬盘造成很大的冲击,但是可以预见的是,固态硬盘与机械硬盘将会存在一段并行期,要不全固态硬盘存储。要不固态硬盘作为内存、机械硬盘之间的缓存存储。

从数据读写的角度来说,基本可以分为顺序读写、随机读写四种场景,那么在在机械硬盘、SSD、内存之间,其基本性能表现可参考一下相关数据,此处就不说了。因为感觉每个厂商还有不同的接口差距还是比较大的。总之,SSD 在顺序读/随机读/顺序写上确实有很大优势,对于随机写,貌似优势不明显。具体原因,文中会说。

那么针对数据库领域,又会有什么影响呢?

首先,我们来看一下机械硬盘的读写操作,机械硬盘每个扇区大约512字节,数据读写通过磁盘机械臂沿着半径方向在不同磁道之间的移动和盘面的转动完成。

图片[1]-从硬件发展及特性看数据库发展2 – 作者:龙渊实验室LongYuanLab-安全小百科图片[2]-从硬件发展及特性看数据库发展2 – 作者:龙渊实验室LongYuanLab-安全小百科图片[3]-从硬件发展及特性看数据库发展2 – 作者:龙渊实验室LongYuanLab-安全小百科

理想情况下,磁盘的顺序读写基本上是沿着磁道进行数据读写。由于,磁盘的读写性能严重依赖于历史IO,所以当经过一段时间的数据读写之后,数据在磁盘的分布将会在同的柱面,这个时候再次进行数据读写的时候,磁盘机械臂将会在不同的磁道移动,增加了磁盘寻址时间,所以性能急剧下降。此时,数据的随机读写,将会呈现上图的情况,机械臂不断的移动。虽然,现在的文件系统进行底层磁盘设备操作的时候,进行了一些优化,比如,进行IO延迟,以降低随机写的频率,保证数据批量写入磁盘。同时,也会针对读写进行排序,以尽量减少磁盘臂的移动,但是这种情况依然不能避免。

2、OK,初步了解磁盘读写过程之后,接下来,我们看一下数据库中两种典型的存储结构,行存和列存,并看看这两种存储结构的优劣。

行存储

图片[4]-从硬件发展及特性看数据库发展2 – 作者:龙渊实验室LongYuanLab-安全小百科列存储

图片[5]-从硬件发展及特性看数据库发展2 – 作者:龙渊实验室LongYuanLab-安全小百科

通常,在OLTP场景中,采用的是行存储。因为,在TP场景中,我们面对的通常的按照行select数据、delete数据、insert数据、update数据(其实,update数据也是一次Insert)。那这个时候,按照行的数据存储,理想情况下,会在按照行连续的分布和存储在机械硬盘的一个柱面上。这个时候,进行数据读写操作的时候,可以按照行批量将数据读写保证数据操作的局部性,减少了磁盘机械臂的移动,降低了寻址时间。(通常,会有预抓取的功能,增加缓存命中率)。

但是这种按照行存储的格式,在OLAP场景中,将会造成很大的问题,因为在OLAP场景中,我们通常面对的是Group by col、Join、where等数据分析的场景。这个时候,通常是按照数据列进行分析。如果按照是采用行存储的方式,将会读取大量无用数据,浪费内存空间和增加磁盘IO。同时,行存储的时候,数据压缩比较复杂,针对每一行数据需要耗费大量的CPU进行数据类型解析。而列存储的时候,一是数据类型的同构性,便于压缩。而是,进行数据分析计算的时候,只需要处理当前列的数据,可以高效利用内存空间和磁盘IO。

同时,个人认为,在进行数据顺序写的时候,行存和列存是没有多大差距的。但是如果进行随机写的时候,为了保证数据的局部性,会不会列存的数据需要多次移动机械臂进行数据重新分布呢?

所以,在面向OLAP和OLTP场景下,两种不同的数据存储方式,各有优势。那么针对HTAP场景,有没有一种行列混存的方式,来同时满足这两种场景的需求呢?我觉得可以看一下下面这个图。

图片[6]-从硬件发展及特性看数据库发展2 – 作者:龙渊实验室LongYuanLab-安全小百科

有没有看到这个数据存储特别熟悉呢?

如果您用过Hbase,就应该想起来了。可以看到HBase作为列存数据,其实在列族这个层面,一个列族中的数据保持的行数据的局部性,可以简单看作一种行列混合存储。目前,也有很多行业混合存储方案,比如PAX。

3、好了。接下来,我们来看看新型存储设备,基于闪存芯片的SSD。

其实,下面这个图里面,为了简单起见,模拟了8通道的单存储器包、单晶粒、单面版的SSD结构。实际中,SSD内部是具有4级高度并行的结构的。通常,SSD内部具有多个通道,每个通道会有一个闪存控制器。同时为了提高资源利用率,每个通道又会被多个闪存存储包所共享,每个闪存存储包内又有多个晶粒,每个晶粒中有2个面板,每个面板又由多个闪存块组成。

图片[7]-从硬件发展及特性看数据库发展2 – 作者:龙渊实验室LongYuanLab-安全小百科SSD具有如下基本特性,以下特性在我们设计数据库存储管理器、缓存管理器、事务及并发控制的时候,都是需要考虑的,如何才能充分发挥SSD的硬件特性?1、与机械硬盘相比,基于闪存的SSD是没有机械延迟的,主要基于电信号进行逻辑地址与物理地址的映射进行数据读写。因此,数据读写性能很高。2、与机械硬盘的读写对称相比,SSD顺序读和随机读对称,读写体现出明显的非对称特性。大约是1:10的延迟(20us/200us)。通常,SSD 写操作单位为页,比如单位页大小0.5K(此处,不同厂商的SSD设计可能不同),块大小可以是64 * 单位页,也可以更大。3、SSD 硬盘写的时候,需要进行异地更新。比如,在进行数据更新的时候,SSD会把更新操作引导到其他空闲页执行,原来的旧数据所在页标记为无限。只有当空闲页数量很少或者触发其他块擦除策略的时候,才会进行垃圾回收。将原来的旧数据所在块的有效数据重写到新的块,然后将旧的数据页所在的块进行擦除操作。4、同时,由于闪存的芯片的可擦除次数有限,通常是10万次左右。所以,在SSD内部的算法通常会针对块的擦除采取磨损均衡的策略。以保证SSD可用性和稳定性,避免过早出现坏块的情况。

如下图所示情况,

Block x 和 Block y 有效页分别是A、B、C、D、E、F、G。假设这个时候进行垃圾回收,则会将A、B、C、D、E、F、G 写入到 BlockZ 中。然后擦除块Block x 和 Block y。

图片[8]-从硬件发展及特性看数据库发展2 – 作者:龙渊实验室LongYuanLab-安全小百科4、现在应该对SSD的基本特性有了初步的了解。接下来,我们具体来分析一下SSD的读写。

1、考虑一下,如何充分利用SSD内部的并行化机制?

2、在读写数据的时候,擦除操作在SSD内部将会涉及到多次的数据读写,此时将会严重影响SSD性能,如何避免?

3、SSD 顺序读写、随机读性能基本相当。但是,SSD随机写为什么造成性能严重下降,甚至低于机械硬盘。为什么?

可以想一下,假设单位页大小4K,数据写操作4K,通常上会在一个Block中。这个时候,其实只有一个通道,在进行数据写操作。如果,在8通道的SSD中,每次写操作32K。这个时候,将会充分利用SSD内部并行特征,将数据页通过8个通道写到不同的Block中。

另外一种情况,多任务并发随机写,通常情况下,这些单位页可能会随机写到任何一个Block中,这个时候Block中的有效页和无效页鱼龙混杂,当进行垃圾回收的时候,需要将多个块中的有效页分别写到空闲块,然后再进行擦除操作。但是,如果多任务顺序写,整个块都是属于某个文件的。这个时候,垃圾回收的话,直接擦除就可以了。

总结一下,其实这里已经蕴含的针对SSD数据库的缓冲区管理优化策略,针对写操作,就是进行数据写缓存,写数据顺序局部性保证,尽量进行保证顺序写操作。

同时,针对读操作,数据读取的时候,通过多线程并行,充分利用SSD内部并行的结构特征。

原文链接

来源:freebuf.com 2020-09-02 11:20:13 by: 龙渊实验室LongYuanLab

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论