OceanBaseデータベースは創業当初からLSM-Treeアーキテクチャを堅持し、機能を磨き続けることでさまざまな典型的なTPタイプの業務をサポートしてきました。また、パフォーマンスを継続的に最適化し、あらゆる極限的な負荷に耐える力を備え、豊富なエンジニアリング実践経験を蓄積することで、完全に独自開発された独自の特色を備えた業界トップクラスのLSM-treeストレージエンジンを構築しました。V4.3.0バージョンでは、既存技術の蓄積に基づき、ストレージエンジンをさらに拡張し、カラムストアをサポートすることでストレージの統合を実現しました。一つのコード、一つのアーキテクチャ、一つの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モード)を参照してください。