OceanBaseデータベースは創業当初からLSM-Treeアーキテクチャを堅持し、機能を磨き続けることでさまざまな典型的なTPタイプの業務をサポートしてきました。また、パフォーマンスを継続的に最適化し、あらゆる極限的な負荷圧力に耐えることで、豊富なエンジニアリング実践経験を蓄積し、独自開発された独自の特徴を備えた業界トップクラスのLSM-treeストレージエンジンを構築しました。V4.3.0バージョンでは、既存技術の蓄積に基づき、OceanBaseデータベースのストレージエンジンがさらに拡張され、カラムストアのサポートが実現されました。これにより、ストレージの統合が図られ、一つのコード、一つのアーキテクチャ、一つのOBServerで、カラムストアデータと行ストアデータが完璧に共存し、TPタイプとAPタイプのクエリ性能を真に両立させています。
全体のアーキテクチャ
OceanBaseデータベースはネイティブ分散データベースとして、ユーザーデータをデフォルトでマルチレプリカで保存します。マルチレプリカの利点を活用し、データの強力な検証やデータ移行の再利用など、ユーザーエクスペリエンスをさらに向上させるため、独自開発のLSM-Treeストレージエンジンにも多くの特化設計が施されています。まず、ユーザーデータ全体は大きく以下の二つの部分に分けられます:
ベースラインデータ
他の主流のLSM-Treeストレージエンジンのデータベースとは異なり、OceanBaseデータベースは分散マルチレプリカの基盤を活用し、「日次マージ」という概念を提案しています。テナントは定期的に、またはユーザー操作に基づいてグローバルバージョン番号を選択し、テナントデータのすべてのレプリカはそのバージョンで一巡のメジャーコンパクションを完了し、最終的にそのバージョンのベースラインデータが生成されます。すべてのレプリカにおける同一バージョンのベースラインデータは物理的に完全に一致します。
増分データ
ベースラインデータに対して、最新バージョンのベースラインデータ以降に書き込まれたすべてのデータは増分データに属します。具体的には、増分データはユーザーがMemTableに書き込んだばかりのメモリデータであったり、SSTableにフラッシュされたディスクデータであったりすることができます。ユーザーデータのすべてのレプリカにおいて、増分データ内の各レプリカは独立して管理され、一貫性は保証されません。また、ベースラインデータが指定バージョンに基づいて生成されるのとは異なり、増分データにはすべてのマルチバージョンデータが含まれます。
カラムストアのアプリケーションシナリオにおいてランダム更新量が制御可能であるという背景に基づき、OceanBaseデータベースは自身のベースラインデータと増分データの特性を組み合わせ、上位層に対して透過的なカラムストアの実装方法を提案しています:
ベースラインデータはカラムストアモードで保存され、増分データは行ストアのまま保持されます。ユーザーのすべてのDML操作は影響を受けず、上下流の同期はシームレスに接続されます。カラムストアテーブルのデータは、行ストアテーブルと同様にすべてのトランザクション操作を実行できます。
カラムストアモードでは、各列データは独立したSSTableとして保存され、すべての列のSSTableが組み合わさって仮想SSTableを形成し、ユーザーのカラムストアベースラインデータとなります。下図のように示されています。
ユーザーがテーブル作成時に指定したテーブルのストレージモードに基づき、ベースラインデータには行ストア、カラムストア、行ストア・カラムストア冗長の三つのモードがあります。
ストレージエンジン内でカラムストアモードを実装しただけでなく、ユーザーが他のAPデータベースからより容易に移行できるようにし、以前はAP要件があった既存ユーザーがカラムストアにアップグレードできるようにするため、OceanBaseデータベースはオプティマイザーから実行エンジン、ストレージなど、その他の関連モジュールに至るまで、カラムストアに適応し最適化されています。これにより、ユーザーがカラムストアに移行しても業務への影響はほとんどなく、行ストアと同様にカラムストアが提供する性能優位性を享受できます。また、OceanBaseデータベースは真にTP/APの統合を実現し、一つのエンジン、一つのコードで異なるタイプの業務をサポートする目標を達成し、完璧なHTAPエンジンを構築しています。
SQLの統合
カラムストア向けに新しいコストモデルを設計・実装し、カラムストア関連の統計情報を追加しました。オプティマイザーはデータテーブルのストレージモードとコストに基づいて自動的に実行計画を選択します。
新しいベクトル化エンジンを実装し、重要な演算子の新しいエンジン再構築を完成させました。異なるタイプの計画はコストに基づいて自動的にベクトル化とバッチサイズを選択します。
ストレージの統合
ユーザーデータについて、業務負荷のタイプに応じてテーブルのストレージモードをカラムストア、行ストア、または行列冗長モードに柔軟に設定できます。ユーザーはクエリの実行やバックアップ・リカバリなどの操作を行う際、完全に透過的です。
カラムストアテーブルは、すべてのオンラインおよびオフラインDDL操作を完全にサポートし、すべてのデータ型およびセカンダリインデックスの作成を完全にサポートします。これにより、ユーザーは行ストアと同様に使用できるようになります。
トランザクションの統合
増分データはすべて行ストア形式であり、トランザクション内でのログ内容の変更やマルチバージョン管理など、行ストアのロジックと完全に一致しています。
主な機能
アダプティブCompaction
新しいカラムストアの格納モードが導入されたことにより、データマージの動作は従来の行ストアデータと大きく異なります。具体的には、増分データがすべて行ストア形式であるため、ベースラインデータとマージした後、各列の独立したSSTableに分割する必要があり、マージ時間とリソース消費は行ストアに比べて大幅に増加します。
カラムストアテーブルのマージ速度を向上させるため、OceanBaseデータベースはCompactionプロセスを大幅に最適化しました。カラムストアテーブルでは、行ストアテーブルと同様に水平分割による並列マージの高速化に加え、垂直分割による高速化も追加されています。カラムストアテーブルでは、複数列のマージ処理を1つのマージタスク内で実行し、タスク内の列数はシステムリソースに応じて自動的に調整可能で、全体としてマージ速度とメモリ使用量のバランスをより良く実現します。
カラム指向エンコーディングアルゴリズム
これまで、OceanBaseデータベースのストレージデータは2段階の圧縮を経ていました。第1段階はOceanBaseデータベース独自の行列混合エンコーディング圧縮であり、第2段階は汎用圧縮です。その中でも、行列混合エンコーディングはデータベース組み込みアルゴリズムであるため、解凍せずに直接クエリを実行できるだけでなく、エンコーディング情報を利用したクエリフィルタリングの高速化も可能で、特にAP系クエリにおいて大幅な高速化が得られます。
従来の行列混合エンコーディングアルゴリズムは依然として行指向であったため、OceanBaseデータベースはカラムストアテーブル向けに全く新しいカラム指向エンコーディングアルゴリズムを実装しました。既存のエンコーディングアルゴリズムと比較して、新アルゴリズムはクエリの全面的なベクトル化実行をサポートし、異なる命令セットと互換性のあるSIMD最適化をサポートするとともに、数値型に対する圧縮率を大幅に向上させ、性能と圧縮率の両面で既存アルゴリズムを全面的に向上させました。
Skip Index
一般的なカラムストアデータベースは、通常、各列データに対して一定の粒度で事前集計計算を行い、集計結果をデータと共に永続化します。これにより、ユーザーがクエリリクエストで列データにアクセスする際、データベースは事前集計されたデータを用いてデータをフィルタリングし、データアクセスのオーバヘッドを大幅に削減し、不必要なI/O消費を抑えることができます。
カラムストアエンジンにおいても、OceanBaseデータベースはSkip Indexのサポートを追加しています。各列データに対してマイクロブロック粒度で最大値、最小値、NULL総数など複数の次元で集計計算を行い、段階的に上方向に集計累積してマクロブロック、SSTableなどより大きな粒度の集計値を取得します。ユーザーがクエリを実行する際、システムはスキャン範囲に応じて適切な粒度の集計値を選択し、フィルタリングおよび集計出力を行います。
クエリのプッシュダウン
OceanBaseデータベースはV3.2.xバージョンから簡単なクエリのプッシュダウンを初めてサポートし、V4.xバージョンからストレージがベクトル化およびより多くのプッシュダウンを全面的にサポートしました。カラムストアエンジンにおいて、プッシュダウン機能はさらに強化・拡張され、具体的には以下の点で表れています:
すべてのクエリフィルタのプッシュダウンが可能であり、フィルタの種類に応じてSkip Indexやエンコーディング情報を活用した高速化も可能です。
一般的な集計関数のプッシュダウン。Group By以外のシナリオでは、現在COUNT()、MAX()、MIN()、SUM()、AVG()などの集計関数をストレージエンジンにプッシュダウンできます。
Group Byのプッシュダウン。NDV(Number of Distinct Values)が少ない列において、Group Byのプッシュダウンストレージ計算をサポートし、マイクロブロック内のディクショナリ情報を活用して大幅な高速化を実現します。
関連ドキュメント
- カラムストアテーブルの作成に関する情報については、テーブルの作成(MySQLモード)およびテーブルの作成(Oracleモード)を参照してください。
- Skip Indexに関する情報については、列Skip Index属性(MySQLモード)および列Skip Index属性(Oracleモード)を参照してください。