淘寶海量數據庫之克服隨機IO難題
磁盤隨機 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”) ,因此能源消耗的降低更多。
【編輯推薦】