螞蟻金服自研數據庫 OceanBase 登頂 TPC-C 引發業內普遍關注,爲了更清楚的展現其中的技術細節,咱們特地邀請 OceanBase 核心研發人員對本次測試進行技術解讀,共包括五篇:web
1)TPC-C基準測試介紹
2)OceanBase如何作TPC-C測試
3)TPC-C基準測試之SQL優化
4)TPC-C基準測試之數據庫事務引擎的挑戰
5)TPC-C基準測試之存儲優化sql
本文爲第二篇,其它文章已同步發佈,詳情請在「螞蟻金服科技」公衆號查看。數據庫
衆所周知,TPC 組織是當今國際數據庫領域公認最權威的測試和評價組織,它成立的初衷就是構建最好的測試標準以及制定針對這些標準最優的審計和監測流程。數據庫界的天皇巨星 Jim Gray 曾在 1985 年提出了針對事務處理能力的評價標準 DebitCredit,而 1988 年 TPC 組織成立伊始,就基於這個標準提出了 TPC 組織第一個針對 OLTP 應用的測試標準 TPC-A。但隨着時代發展,TPC-A 已經慢慢沒法徹底體現真實應用場景,此時 TPC-C 肩負重任應運而生,接下來也一直是 TPC 組織最核心同時也是關係數據庫領域最頂級的測試標準。TPC-C 標準比 TPC-A 更加複雜,壓力負載模型是 16 位一線工業產業界學者一塊兒參與制定,隨着時間推移測試標準也一直在保持修訂,因此其模擬大型在線商超的測試模型時至今日也仍不過期,愈來愈能找到和當前大型 B2C 電商網站的共通之處。segmentfault
有機會挑戰 TPC-C 測試相信是全部數據庫內核開發人員的夢想,但 TPC-C 測試標準很是複雜,1992 年 7 月發佈以來到如今已是 v5.11.0 版本,僅 PDF 就 132 頁,若是不是鐵桿粉絲估計不多有人會認真通讀完這個標準。此次 OceanBase 創造 TPC-C 記錄引發了你們的普遍關注,但它也只是這個測試標準裏體現跑分的一個評價項 MQTh(最大有效吞吐量),隱藏在跑分下面的是 TPC-C 標準對被測數據庫無數細緻入微的測試驗證和評價項,而正是這些才讓這個標準在關係數據庫領域如此權威,同時也是國產數據庫以前很難入場的一大緣由。性能優化
因爲這是國產數據庫同時也是分佈式數據庫第一次衝擊這個榜單,爲了完成此次挑戰,OceanBase 團隊先後準備時間超過一年,僅審計認證過程就耗時約半年,除了數據庫自身性能優化同時還有大量的穩定性、合規要求相關工做,6088w tpmC 其實也只是整個測試結果中一小個展現項而已。服務器
做爲基於 LSM-Tree、多副本 paxos 強一致的新型分佈式關係數據庫,如何進行 TPC-C 測試,有哪些注意事項,何時該作什麼步驟等等諸多問題,在審計剛啓動時咱們無處諮詢也沒有任何可借鑑的資料。TPC-C 測試首先須要找到官方惟一認證的審計員來對測試進行審計監察,但面對 OceanBase 這樣一個全新架構的關係數據庫時,他們其實也有着諸多和咱們相似的疑惑和問題,所以他們對此次 OceanBase 的審計也至關重視,全世界僅有的三個審計員此次就有兩個參與到測試審計工做中。架構
兩位審計員其中一位仍是 TPC-C 標準原做者之一,他們對整個測試流程的要求異常細緻和嚴苛,起初對待 OceanBase 還持有很大的懷疑態度,和審計員們漫長的郵件以及現場溝經過程也異常艱辛,但這也幫助咱們始終堅持用規範中最嚴格的標準來針對每一個測試子項,最終也贏得了審計員們充分的信任,審計員甚至在理解了 OceanBase 架構後幫助咱們提出了多個問題解決思路。另外經過此次測試,OceanBase 也給 TPC-C 標準帶來了不少新鮮的概念和測試方案。app
目前市面上基本找不到一個可以開箱即用的符合 TPC-C 標準的測試工具。以目前各個廠商 PoC 環境最常遇到的 benchmarksql 爲例,能夠說只是模擬 TPC-C 壓力模型的壓測工具,連最基本的數據導入都不合規,大量的字符串生成未保證全局隨機,缺少壓測階段最基本的 think time、keying time 這些基本配置致使極小的數據量就能跑出很高的 tpmC,最關鍵的是它將測試模型大大簡化爲工具直連 DB 測試,徹底沒有遵照 TPC-C 測試標準規範。框架
在標準定義中,測試系統能夠分爲 RTE(Remote Terminal Emulator)和 SUT 兩部分,但實際上從角色上看 SUT 能夠進一步拆分爲兩部分:WAS(web application server)和 DB Server。這其中 DB Server 是每一個測試廠商的數據庫服務;RTE 扮演的角色是測試模型中的客戶終端,事務的觸發、RT 的統計等都在這裏完成;標準明確要求每個用戶 terminal 都必須保持一個長鏈接,顯然在海量 Warehouse 時 DB 是沒法承受這麼多鏈接的,WAS 就是 RTE 和 DB 之間橋樑,標準定義可使用鏈接池,在保證對應用透明的狀況下它能夠作全部請求的管理。分佈式
這三個角色中,WAS 和 DB 是必須商業化可購買且提供支付服務的,OceanBase 此次是使用了 OpenResty 做爲 WAS 供應商。而 RTE 則通常由各個參測廠商自行根據標準實現,但全部實現代碼必須通過審計的嚴格審計,OceanBase 此次完整的實現了一整套徹底合規的 RTE,而且支持在大規模測試系統中部署。要知道在實際的 TPC-C 測試流程中,不僅是對 DB 端能力的考驗,RTE 端一樣存在極大的資源消耗和壓力。以此次 6088w tpmC 測試結果看,咱們一共在 64 臺 64c128G 的雲服務器上運行了 960 個 RTE 客戶端,來模擬總計 47942400 個用戶 terminal,最後還須要基於這麼多 RTE 統計結果進行一致性和持久化審計驗證。
雖然只是測試客戶端,但 RTE 的中一樣有大量的可能致使最後測試失敗的小細節,好比你們可能注意不到的全部事務都由於用了 web 端模擬終端後須要增長的 100 毫秒 rt,又好比爲了模擬用戶終端輸出顯示的 100 毫秒延時。
TPC-C 歷來都不是一個簡單的測試,它很科學並無給出強制的軟硬件配置,只是給出測試規範和各類審計檢查限制標準,全部數據庫廠商能夠根據本身的特性充分調優來拿到一個最好的性能或性價比。但這同時也對全部參測廠商提出了一個巨大的難題,如何對已有的資源進行合理規劃來保證順利完成一次對 TPC-C 榜單的衝擊。
最受關注的性能壓測部分在 TPC-C 標準中規定了如下三個狀態:
因此以前通常數據庫進行性能壓測通常是如下的流程,先進行一段時間的預熱到達穩態,等待穩定運行一段時間並完成一個 checkpoint 後開始進入 2 小時的性能採集階段。
而 OceanBase 此次是使用了 TPC-C 測試迄今以來最嚴苛的一個流程來完成這個性能測試的,咱們首先使用了 10 分鐘進行預熱,而後在 6088w tpmC 穩態保持運行 25 分鐘並完成一個檢查點,再繼續跑了完整的 8 小時性能壓測採集階段,總耗時超過 8 個半小時,中間性能最大波動不到 0.5%,最終結果也讓審計員異常興奮。
整個性能測試先後,審計員還須要進行數據及事務隨機分佈檢查,簡單說來就是大量全表掃描和統計 sql,最大的一條 sql 須要訪問超過萬億行的 order_line 表結果,能夠算是 TPC-C 裏的「TPC-H 測試」。現場審計第一次遇到這些 sql 時咱們也大量的出現 sql 執行超時狀況,但後續基於 OceanBase2.2 版本最新的並行執行框架咱們仍是很快搞定了這些大 sql,因此要順利完成 TPC-C 測試並不能只是一個偏科生,保持自身沒有短板纔是真正意義上的通用關係數據庫,從這點上說 Oracle 還是 OceanBase 學習的榜樣。
曹暉,現任螞蟻金服 OceanBase 團隊技術專家,2017 年加入 OceanBase 團隊,現從事存儲引擎開發工做。