磁盘随机IO性能常常是数据库性能的决定因素,即使是15000RPM的温彻斯特SAS盘,单盘也很难超过300IOPS,对于传统关系数据库,磁盘随机IO是个多年的老大难问题,除了内存等的cache可以适当缓解外,这种物理上固有的特性并没有令人满意的解决方案,风轻扬的博客(数据库如何抵抗随机IO:问题、方法与现实,http://wangyuanzju.blog.163.com/blog/static/13029201132154010987/)一文中提到了一些关于此问题一些进展。
与传统磁盘相比,SSD固态盘提供了好得多的随机读性能,单盘可达35000 IOPS(4KB或8KB等)甚至更高,并提供512MB/s或以上的读出带宽。但通常SSD盘的随机写性能比传统温切斯特磁盘更差,这是因为,尽管SSD的读和写都以页(page,例如4KB,8KB等)为单位,但SSD写入前需要先擦除已有内容,而擦除以块(block)为单位,一个块(block)由若干连续的页(page)组成,大小通常在512KB~2MB左右。假如写入的页(page)内有内容,即使是写入一个字节,SSD也需要把整个block内容(512KB~2MB)先读到内存,与要写入的内容融合,擦除整个块(block),然后再重新写入整个块的内容,这就是SSD盘的写入放大效应。更严重的是,SSD内部一般是由多块SSD存储芯片(即die)以类似于RAID0的方式组成,擦除操作会擦除所有芯片的同一个block(称为band),一个300GB的SSD盘可能由40个8GB的die组成,其page为8KB,block为2MB,则一个band是2MB*40=80MB,因此每次擦除需要擦除80MB的内容。
假设每次随机写入1KB且每次写入都要先擦除,并且假设SSD能够提供1K次/秒的随机写入能力,根据上面的分析,即使是单片die为512KBblock的SSD盘,其对应的写入放大将把SSD的512MB/s的读出带宽全部消耗掉,也就是说,这种情况下,SSD已经无法提供任何读服务。以上是比较极端的情况,当剩余空间较大时,SSD盘通过使用剩余空间写入并在读写间隙进行擦除,能够在一定程度上减少写入放大。因此SSD盘厂商一般会强制预留一定比例的空间来改善固态盘的写入性能,通常最少7%,这样160GB的SSD盘最大可用空间不超过148GB(格式化后容量),300GB的SSD盘最大可用空间不超过276GB(格式化后的容量)。由于上述原因,传统关系数据库在普通SSD盘上难以获得令人满意的性能。
OceanBase采用与经典关系数据库不同的实现。OceanBase实现了增删改在内的跨行跨表的写事务,但又完全摒弃了随机写:除了操作日志(commitlog)总是顺序追加写入到普通SAS盘上(即便这种每次少量数据的顺序追加的写入,SSD盘的表现也不如SAS盘),剩下的写请求就是对响应时间要求不是很高的批量顺序写(每日数据合并时),SSD盘可以轻松应对,而大量查询请求的随机读,则充分发挥了SSD良好的随机读性能。摒弃随机写,采用批量的顺序写,也使得固态盘的使用寿命不再成为问题:主流SSD盘使用MLCSSD芯片,而MLC号称可以擦写1万次(SLC可以擦写10万次,但因成本高而较少使用),即使按最保守的2500次擦写次数计算,而且每天全部擦写一遍,其使用寿命为2500/365=6.8年。
内部测试发现,OceanBase在一台装有多块SSD盘的服务器上获得了数万QPS的查询性能(跟SSD盘的聚合IOPS相比还有很大提升空间),这使得一台装备SSD盘的服务器可以提供5-10台装备15000RPMSAS盘的同样配置的服务器。尽管SSD盘价格仍然高于同样容量的SAS盘,在OceanBase环境下,由于机器数量的大幅度减少,不仅机器采购成本降低了,机架、网络带宽等运维费用更是大幅度降低,总体成本也降低很多。
此外,由于SSD盘的功耗(约0.06W-3.5W)大大低于SAS盘(约12W-15W,3.5”),配备12个SAS盘的普通2U机架式服务器,其最大功耗可能达到360W左右,一个4.5KW功率的机架,只能放置12台这样的服务器。如果其中10块SAS盘换成SSD盘,则单服务器功率可下降85W~115W,同样的机架可以放置16~18台服务器。
一些基于PCIe的SSD存储产品,例如FusionIO、Virident等的PCIe的SSD产品,通过采用PCI板上内存、板上电容(防止数据丢失)等提升固态存储设备的读写性能,尤其是随机写性能,但这类产品的成本和价格高于普通的使用廉价的MLC的固态盘(如Intel等的SSD固态盘)。比如一个2U机架式服务器可以很容易挂接10个相对廉价的160GB的SSD盘,从而使得总容量达到1.47TB(格式化后的容量)并且具备了35万的聚合IOPS,这对于许多数据库应用来说其单机容量和单机IOPS已经足够大,而一个320GB容量的PCIe的SSD存储产品的价格,可能就跟这些SSD盘的总价相当。