天天看點

《大規模分布式存儲系統》第十章 資料庫功能

  • 隻讀事務

    首先,MergeServer子產品中SQL層進行SQL語句解析、詞法分析、申城文法樹,其中查詢優化是MySQL的核心和難點,但是OceanBase在本部分并沒有很多工作。其次,無論是單表查詢還是多表查詢都會根據需求拆分為子請求,分發到目的ChunkServer上執行。最後,OceanBase 原則上盡量保持存儲節點與計算節點一緻,即ChunkServer可以計算的,盡量在ChunkServer上計算,減少MergeServer的計算。

    注:MergeServer 會彙聚多個子表的結果,記憶體、CPU等資源可能成為瓶頸。

  • 讀寫事務

    多版本并發控制:UpdateServer内部維護B樹,葉子節點存儲修改連結清單,根據版本區分不同連結清單。通過兩階段實作并發事務。預送出階段,先鎖住行資料(跨行事務,逾時釋放解決死鎖),然後修改操作添加到未送出連結清單,最後将事務添加到任務隊列中。送出階段,送出線程(多線程)從任務隊列取任務,然後寫日志緩沖區,達到一定大小同步給從,然後寫日志檔案,寫完後将操作從未送出連結清單中取出加入已送出隊列,并釋放鎖。事務中所有的讀操作都是讀制定某個版本的資料,為保證更高的并發度,沒有提供更高的隔離級别。

    備UpdateServer并發回放日志,日志分發線程批量的擷取日志,分發給多個日志回放線程,回放完成後交給日志送出線程(送出到記憶體表,然後寫日志)。感覺日志送出線程需要控制送出順序,多回放線程提升了速度,貌似在一些極端情況送出線程會成為瓶頸。

  • OLAP業務支援

業務特點:查詢量大,百萬、千萬級别。隻查詢部門列。

并發查詢:MergeServer拆分自請求給ChunkServer,然後Merge結果,MergeServer更容易成為瓶頸;

列式存儲:減少子請求,提升效率,且壓縮比高。OceanBase支援列組,包括三種:第一種是所有列屬于一個列組(OLTP業務),第二種是每個列屬于一種列組(比較少用)、第三種是部分列屬于一個列組(OLAP業務)。對于SSTable檔案的組織形式也是不同的,第一種是按行存儲,第二種是按列存儲。第三種是行列混合存儲。且OceanBase支援一個列屬于多列組。

    注:作者介紹OceanBase初期由于記憶體設計問題,記憶體膨脹、CPU使用高等問題嚴重影響了列式存儲的性能優勢。

  • 特色功能

大表左連

    兩個表需要左連運算,表很大的話,計算量很大(每個使用者收藏的商品,将使用者id分發給所有手上商品表所在的ChunkServer),延時不可接受。另一種方案是,兩個表在底層存儲時,存在一個表中,但是備援度高帶來了更新繁瑣的問題,一個商品被幾十萬使用者收藏,人氣、收藏數等等資料實時更新困難。

    OceanBase的解決方案是,ChunkServer上的極限資料采用備援的方式,UpdateServer的增量資料采用分表方式,這樣可以規避上述兩個問題。

資料過期與批量删除

    用于使用者設定過期規則,例如,删除某一個時間段等操作,在查詢時會進行實體删除。這個功能主要是針對OLAP業務,資料量較大,一旦存儲錯誤資料,逐條删除不友善。

繼續閱讀