淘宝海量数据库之六-克服随机IO难题
磁盘随机IO性能常常是数据库性能的决定因素,即使是15000RPM的SAS盘,单盘也很难超过300IOPS,对于传统关系数据库,磁盘随机IO是个多年的老大难问题,目前尚无令人满意的解决方案,风轻扬的博客(数据库如何抵抗随机IO:问题、方法与现实,http://wangyuanzju.blog.163.com/blog/static/13029201132154010987/)一文中提到了一些关于此问题进展。
与传统磁盘相比,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”,
http://iqalantam.blog.163.com/blog/static/5393552201121481111304/)
假设每次随机写入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”),因此能源消耗的降低更多。