OceanBase架構淺析(二)


單點性能

  OceanBase架構的優勢在於既支持跨行跨表事務,又支持存儲服務器線性擴展。當然,這個架構也有一個明顯的缺陷:UpdateServer單點,這個問題限制了OceanBase集群的整體讀寫性能。下面從內存容量、網絡、磁盤等幾個方面分析UpdateServer的讀寫性能。其實大部分數據庫每天的修改次數相當有限,只有少數修改比較頻繁的數據庫才有每天幾億次的修改次數。另外,數據庫平均每次修改涉及的數據量很少,很多時候只有幾十個字節到幾百個字節。假設數據庫每天更新1億次,平均每次需要消耗100字節,每天插入1000萬次,平均每次需要消耗1000字節,那么,一天的修改量為:1億×100+1000萬×1000=20GB,如果內存數據結構膨脹2倍,占用內存只有40GB。而當前主流的服務器都可以配置96GB內存,一些高檔的服務器甚至可以配置192GB、384GB乃至更多內存。

  從上面的分析可以看出,UpdateServer的內存容量一般不會成為瓶頸。然而,服務器的內存畢竟有限,實際應用中仍然可能出現修改量超出內存的情況。例如,淘寶雙11網購節數據庫修改量暴漲,某些特殊應用每天的修改次數特別多或者每次修改的數據量特別大,DBA數據訂正時一次性寫入大量數據。為此,UpdateServer設計實現了幾種方式解決內存容量問題,UpdateServer的內存表達到一定大小時,可自動或者手工凍結並轉儲到SSD中,另外,OceanBase支持通過定期合並或者數據分發的方式將UpdateServer的數據分散到集群中所有的ChunkServer機器中,這樣不僅避免了UpdateServer單機數據容量問題,還能夠使得讀取操作往往只需要訪問UpdateServer內存中的數據,避免訪問SSD磁盤,提高了讀取性能。

  從網絡角度看,假設每秒的讀取次數為20萬次,每次需要從UpdateServer中獲取100字節,那么,讀取操作占用的UpdateServer出口帶寬為:20萬×100=20MB,遠遠沒有達到千兆網卡帶寬上限。另外,UpdateServer還可以配置多塊千兆網卡或者萬兆網卡,例如,OceanBase線上集群一般給UpdateServer配置4塊千兆網卡。當然,如果軟件層面沒有做好,硬件特性將得不到充分發揮。針對UpdateServer全內存、收發的網絡包一般比較小的特點,開發團隊對UpdateServer的網絡框架做了專門的優化,大大提高了每秒收發網絡包的個數,使得網絡不會成為瓶頸。

  從磁盤的角度看,數據庫事務需要首先將操作日志寫入磁盤。如果每次寫入都需要將數據刷入磁盤,而一塊SAS磁盤每秒支持的IOPS很難超過300,磁盤將很快成為瓶頸。為了解決這個問題,UpdateServer在硬件上會配置一塊帶有緩存模塊的RAID卡,UpdateServer寫操作日志只需要寫入到RAID卡的緩存模塊即可,延時可以控制在1毫秒之內。RAID卡帶電池,如果UpdateServer發生故障,比如機器突然停電,RAID卡能夠確保將緩存中的數據刷入磁盤,不會出現丟數據的情況。另外,UpdateServer還實現了寫事務的成組提交機制,將多個用戶寫操作湊成一批一次性提交,進一步減少磁盤IO次數。

  磁盤隨機IO是存儲系統性能的決定因素,傳統的SAS盤能夠提供的IOPS不超過300。關系數據庫一般采用高速緩存(Buffer Cache)[注釋]的方式緩解這個問題,讀取操作將磁盤中的頁面緩存到高速緩存中,並通過LRU或者類似的方式淘汰不經常訪問的頁面;同樣,寫入操作也是將數據寫入到高速緩存中,由高速緩存按照一定的策略將內存中頁面的內容刷入磁盤。這種方式面臨一些問題,例如,Cache冷啟動問題,即數據庫剛啟動時性能很差,需要將讀取流量逐步切入。另外,這種方式不適合寫入特別多的場景。

  最近幾年,SSD磁盤取得了很大的進展,它不僅提供了非常好的隨機讀取性能,功耗也非常低,大有取代傳統機械磁盤之勢。一塊普通的SSD磁盤可以提供35000 IOPS甚至更高,並提供300MB/s或以上的讀出帶寬。然而,SSD盤的隨機寫性能並不理想。這是因為,盡管SSD的讀和寫以頁(page,例如4KB,8KB等)為單位,但SSD寫入前需要首先擦除已有內容,而擦除以塊(block)為單位,一個塊由若干個連續的頁組成,大小通常在512KB~2MB。假如寫入的頁有內容,即使只寫入一個字節,SSD也需要擦除整個512KB~2MB大小的塊,然后再寫入整個頁的內容,這就是SSD的寫入放大效應。雖然SSD硬件廠商都針對這個問題做了一些優化,但整體上看,隨機寫入不能發揮SSD的優勢。

  OceanBase設計之初就認為SSD為大勢所趨,整個系統設計時完全摒棄了隨機寫,除了操作日志總是順序追加寫入到普通SAS盤上,剩下的寫請求都是對響應時間要求不是很高的批量順序寫,SSD盤可以輕松應對,而大量查詢請求的隨機讀,則發揮了SSD良好的隨機讀的特性。摒棄隨機寫,采用批量的順序寫,也使得固態盤的使用壽命不再成為問題,主流SSD盤使用MLC SSD芯片,而MLC號稱可以擦寫1萬次(SLC可以擦寫10萬次,但因成本高而較少使用),即使按最保守的2500次擦寫次數計算,而且每天全部擦寫一遍,其使用壽命為2500/365=6.8年。

 

數據正確性

  數據丟失或者數據錯誤對於存儲系統來說是一種災難。OceanBase設計為強一致性系統,設計方案上保證不丟數據。然而,TCP協議傳輸、磁盤讀寫都可能出現數據錯誤,程序Bug則更為常見。為了防止各種因素導致的數據損毀,OceanBase采取了以下數據校驗措施:

●數據存儲校驗。每個存儲記錄(通常是幾KB到幾十KB)同時保存64位CRC校驗碼,數據被訪問時,重新計算和比對校驗碼。

●數據傳輸校驗。每個傳輸記錄同時傳輸64位CRC校驗碼,數據被接收后,重新計算和比對校驗碼。

●數據鏡像校驗。UpdateServer在機群內有主UpdateServer和備UpdateServer,集群間有主集群和備集群,這些UpdateServer的內存表(MemTable)必須保持一致。為此,UpdateServer為MemTable生成一個校驗碼,MemTable每次更新時,校驗碼同步更新並記錄在對應的操作日志中。備UpdateServer收到操作日志並重放到MemTable時,也同步更新MemTable校驗碼並與接收到的校驗碼對照。UpdateServer重新啟動后重放日志恢復MemTable時也同步更新MemTable校驗碼並與保存在每條操作日志中的校驗碼對照。

●數據副本校驗。定期合並時,新的子表由各個ChunkServer獨立地融合舊的子表中的SSTable與凍結的MemTable而生成,如果發生任何異常或者錯誤(比如程序bug),同一子表的多個副本可能不一致,則這種不一致可能隨着定期合並而逐步累積或擴散且很難被發現,即使被察覺,也可能因為需要追溯較長時間而難以定位到源頭。為了防止這種情況出現,ChunkServer在定期合並生成新的子表時,也同時為每個子表生成一個校驗碼,並隨新子表匯報給RootServer,以便RootServer核對同一子表不同副本的校驗碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM