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