磁盘随机 IO 性能常常是数据库性能的决定因素,即使是 15000RPM 的 SAS 盘,单盘也很难超过 300IOPS ,对于传统关系数据库,磁盘随机 IO 是个多年的老大难问题,目前尚无令人满意的解决方案,数据库如何抵抗随机IO的问题、方法与现实一文中提到了一些关于此问题进展。
与传统磁盘相比, SSD 固态盘提供了非常好的随机读性能,单盘可达 35000IOPS (4KB) 甚至更高,并提供 512MB/s 或以上的读出带宽。但通常 SSD 盘的随机写性能甚至比一般磁盘更差,这是因为,尽管 SSD 的读和写都以 4KB 页 (page) 为单位,但 SSD 写入前需要先擦除已有内容,而擦除以块 (block) 为单位,一个块 (block) 通常是 128 个连续的页 (page) ,即 512KB 。假如写入的页 (page) 内有内容,即使是写入一个字节, SSD 也需要把整个 128 页 (512KB) 内容先读到内存,与要写入的内容融合,擦除这 128 页所在的块 (block) ,然后再重新写入整个 512KB 数据,这就是 SSD 盘的写入放到效应。
“ SSD 的写入放大 - Write amplification ”
假设每次随机写入 1KB ,即便 SSD 能够提供 1K 次 / 秒的随机写入能力,根据上面的分析,对应的写入放大将把 SSD 的 512MB/s 的读出带宽全部消耗掉,也就是说,这种情况下, SSD 已经无法提供读服务。因此,在传统关系数据库中,普通 SSD 难以获得令人满意的性能。
淘宝海量数据库 OceanBase 采用与经典关系数据库不同的设计: OceanBase既 实现了增删改在内的跨行跨表写事务,又完全摒弃了随机写,除了操作日志 (commit log) 总是顺序追加写入到普通 SAS 盘上,剩下的写请求就是对响应时间要求不是很高的批量顺序写, SSD 盘完全可以轻松应对,而许多响应查询请求的随机读,更可以充分发挥 SSD 良好的随机读性能 。
从测试结果来看, OceanBase 在一台装有多块 SSD 盘的服务器上获得了数万 QPS 的查询性能 ( 大约是所有 SSD 盘的聚合 QPS 的 40% 左右,因此还有提升空间 ) ,这使得一台装备 SSD 盘的服务器可以提供 5-10 台同样配置但装备 15000RPM SAS 盘的服务器。尽管 SSD 盘大约是同样容量的 SAS 盘价格的 3~4 倍,在 OceanBase 数据库环境下,由于机器数量的大幅度减少,不仅机器采购成本降低了,机架、网络带宽等运维费用更是大幅度降低,总体成本也降低很多。
此外,由于 SSD 盘的功耗 ( 约 0.06W-3.5W) 明显低于 SAS 盘 (12W-15W , 3.5”) ,因此能源消耗的降低更多。
【编辑推荐】