高可用性のためのデータレプリケーション
このページは英語版のページが機械翻訳されたものです。英語版との間に矛盾または不一致がある場合は、英語版を正としてください。
ScalarDB Cluster は、高可用性とワークロード分散のために管理下のデータをリモートサイトにレプリケートすることができます。このリモートレプリケーション機能により、プライマリサイトでの書き込み操作が、1つ以上のバックアップサイトにほぼリアルタイムで複製されます。
この機能は、災害やその他の重大な障害がプライマリサイトに影響を与えた場合でも、バックアップサイトへのフェイルオーバーを可能にし、ビジネスの継続性を確保します。さらに、バックアップサイトは読み取り専用レプリカとして機能することも可能であり、分析クエリ、レポート、ビジネスインテリジェンスのワークロードのオフロードに役立ちます。
ScalarDB におけるリモートレプリケーションとは?
ScalarDB のリモートレプリケーションは、同期レプリケーションと非同期レプリケーションを組み合わせたハイブリッドアプローチを使用します。これにより、プライマリサイトでのパフォーマンスへの影響を最小限に抑えながら、データ損失ゼロ (目標復旧時点 (RPO) がゼロ) を保証します。目標復旧時間 (RTO) は、コンピューティングリソースの量を制御することで柔軟に調整できます。この機能は ScalarDB Cluster の上に構築されており、クラウドやデータベースに依存しません。これにより、あるクラウドベンダーのデータベースから、別のクラウドベンダーの異なる種類のデータベースへのレプリケーションが可能になります。
主な利点
リモートレプリケーションは、以下の主要な利点を提供します:
- すべてのコミット済みトランザクションに対してデータ損失ゼロ (RPO が 0) を保証します。
- 同期処理と非同期処理の組み合わせにより、パフォーマンスへの影響を最小限に抑えます。
- プライマリサイトとは異なるリージョン、アベイラビリティゾーン、またはデータセンターにバックアップサイトをデプロイする ことが可能です。
- 異なるクラウドサービスプロバイダーやデータベースタイプ間でのレプリケーションをサポートします。
- 組み込みのクラッシュ耐性と自動回復メカニズムを提供します。
アーキテクチャ概要
以下の図は、リモートレプリケーションアーキテクチャを示しています:
リモートレプリケーションは、このセクションに記載されているコンポーネントとツールで構成されています。
プライマリサイトコンポーネント
プライマリサイトは、プライマリサイトデータベース、クライアントアプリケーション、ScalarDB Cluster ノードの3つのコンポーネントで構成されています。それぞれ以下のように動作します:
- プライマリサイトデータベースには、ScalarDB Cluster を介してクライアントアプリケーションが使用するアプリケーションテーブルが含まれています。
- クライアントアプリケーションはデータベース操作を実行します。
- ScalarDB Cluster ノードは Coordinator データベースでトランザクション状態を管理し、LogWriter と呼ばれるモジュー ルを使用してトランザクション操作をキャプチャし、レプリケーションデータベースに書き込みます。
共有コンポーネント (プライマリサイトとバックアップサイト間)
プライマリサイトとバックアップサイトにまたがる2つのコンポーネントがあります: Coordinator データベースとレプリケーションデータベースです。これらのデータベースは単一のデータベースインスタンスでホストできます。ただし、トランザクション情報を維持するため、以下のように複数のサイトにレプリケートする必要があります:
- Coordinator データベースは、サイト間のトランザクション状態を可用性の高い方法で管理します。
- レプリケーションデータベースは、プライマリサイトからの書き込み操作を含むトランザクショングループを可用性の高い方法で保存します。
バックアップサイトコンポーネント
バックアップサイトは 、バックアップサイトデータベースと ScalarDB Cluster ノードの2つのコンポーネントで構成されています。それぞれ以下のように動作します:
- バックアップサイトデータベースには、プライマリサイトと同じアプリケーションテーブルが含まれています。また、レプリケーションメタデータと未適用の操作を追跡する内部テーブルであるレプリケーションレコードメタデータテーブルも含まれています。これらのテーブルは、アプリケーションテーブルと同じ名前空間に配置されます (デフォルトでは
__recordsのサフィックス付き)。 - ScalarDB Cluster ノードは、LogApplier と呼ばれるモジュールを使用してレプリケートされたデータを適用します。具体的には、LogApplier は Coordinator データベースでトランザクション状態を確認し、レプリケーションデータベースから書き込み操作の読み取りおよび削除を実行し、レプリケーションレコードメタデータテーブルを使用して依存関係を計算し、バックアップサイトテーブルに操作を適用します。
管理ツール
リモートレプリケーションは、以下の管理ツールを使用します: Schema Loader と Replication CLI。それぞれ以下のように動作します:
- Schema Loader は、ScalarDB Cluster エンドポイント経由で
--replication-tablesオプションを使用して、レプリケーションデータベースにレプリケーションテーブルを作成します。 - Replication CLI は、リ モートレプリケーションを介してデータをレプリケートする ScalarDB Cluster ノードを監視および管理します。
リモートレプリケーションの仕組み
リモートレプリケーションは、同期レプリケーションと非同期レプリケーションを組み合わせたハイブリッドアプローチを採用し、プライマリサイトでのパフォーマンスへの影響を最小限に抑えながらデータ損失ゼロ (RPO = 0) を確保します。以下のように、同期フェーズと非同期フェーズの2つのフェーズで構成されています:
- 同期フェーズでは、トランザクションコミット中にプライマリサイトからレプリケーションデータベースに書き込み操作がコピーされます。
- 非同期フェーズでは、これらの操作がレプリケーションデータベースから処理され、バックアップサイトテーブルに適用されます。
レプリケーションプロセスは以下の手順に従います:
- プライマリサイトでトランザクションがコミットされると、LogWriter がすべての書き込み操作をキャプチャし、レプリケーションデータベースに保存します。
- バックアップサイトの LogApplier は、レプリケーションデータベースを継続的にスキャンして新しいトランザクションデータを探します。
- LogApplier は Coordinator データベースをチェックしてトランザクシ ョンの完了を確認します。
- LogApplier は、レプリケーションレコードメタデータテーブルを使用して、レコードレベルでのトランザクション依存関係に基づいて書き込み操作を順序付けて適用します。
- LogApplier は処理された操作をバックアップサイトテーブルに適用し、レプリケーションレコードメタデータテーブルを最新の情報に更新します。
制限事項と特性
このセクションでは、リモートレプリケーションの制限事項と特性について説明します。
プライベートプレビューの制限事項
現在のプライベートプレビューバージョンには以下の制限がありますが、パブリックプレビューまたは一般提供 (GA) 時には緩和される予定です:
- 仕様は将来のリリースで変更される可能性があります。
- 複数のバックアップサイトはサポートされていません。
- 復元されたデータでリモートレプリケーションを開始することはサポートされていません。プライマリサイトとバックアップサイトの両方が最初から開始する必要があります。
- この機能はワンフェーズコミット最適化では動作しません。レプリケーションが正しく機能するためには、この最適化を無効にする必要があります。
- ScalarDB SQL を介したレプリケーションテーブルの作成はサポートされていません。
- 暗号化機能とリモートレプリケーションの組み合わせは検証されていないため、公式にはサポートされていません。
アーキテクチャ上の制限事項
リモートレプリケーションには以下のアーキテクチャ上の制限があり、アーキテクチャの特性上、緩和することが本質的に困難です:
- フェイルオーバーまでは、バックアップサイトでは read-committed 分離レベルでの読み取り専用トランザクションのみが許可されます。
- DDL 操作はレプリケートされません。スキーマ変更はプライマリサイトとバックアップサイトの両方に手動で適用する必要があります。
- この機能が有効な場合、ツーフェーズコミットインターフェースは使用できません。
- レプリケーションデータベースの仕様や設定によっては、プライマリサイトのパフォーマンスにわずかな影響がある可能性があります。
障害処理
リモートレプリケーションは、さまざまな障害シナリオを適切に処理するように設計されており、可能な限りデータの一貫性とシステムの可用性を確保します。
プライマリサイトの障害
プライマリサイトが利用不可になった場合、すべてのコミット済みトランザクションはレプリケーションデータベースまたはバックアップサイトデータベースに安全に保存され、データ損失ゼロが保証されます。LogApplier がレプリケーションデータベースからすべての保留中の書き込み操作を処理した後、バックアップサイトをアプリケーショントラフィックの処理に昇格させることができます。
バックアップサイトの障害
バックアップサイトが障害を起こした場合、プライマリサイトはアプリケー ショントラフィックに中断なく正常に動作し続けます。ただし、LogApplier が処理できないため、書き込み操作はレプリケーションデータベースに蓄積されます。バックアップサイトのダウンタイムが長期化すると、レプリケーションデータベースが容量制限に達するリスクがあるため、監視が重要です。バックアップサイトが復旧し、LogApplier が再開すると、レプリケーションは蓄積された操作に追いつきます。
Coordinator データベースの障害
Coordinator データベース障害の影響は、その範囲によって異なります。重大ではない障害 (マルチリージョン設定での単一リージョン障害など) の場合、リモートレプリケーションは正常に動作し続けます。ただし、Coordinator データベースが完全に利用不可になった場合、プライマリサイトの ScalarDB Cluster と LogApplier の両方が影響を受けます: プライマリサイトの ScalarDB Cluster は新しいトランザクションをコミットできず、LogApplier はトランザクション状態を確認してレプリケーションを進めることができません。
レプリケーションデータベースの障害
Coordinator データベース障害と同様に、影響は障害の範囲によって異なります。重大ではない障害 (マルチリージョン展開での単一リージョン障害など) はリモートレプリケーションの動作に影響しません。ただし、レプリケーションデータベースが完全に利用不可になった場合、プライマリサイトの ScalarDB Cluster は新しいトランザクションをコミットできず、LogApplier は書き込み操作を読み取ることができなくなり、プライマリ操作とレプリケーション処理の両方が事実上停止します。
設定
このセクションでは、ScalarDB Cluster のリモートレプリケーションの設定オプションについて説明します。
ベースレプリケーション設定
これらの設定は、レプリケーションセットアップ全体に適用されます:
partition_count
- フィールド:
scalar.db.replication.partition_count - 説明:
transaction_groupsテーブルのパーティション数。レプリケーションデータベース内のテ ーブルはパフォーマンスとスケーラビリティのためにパーティション化され、書き込み操作はパーティション間で均等に分散されます。このフィールドはプライマリサイトとバックアップサイト間で同一である必要があります。パーティション数を変更するには、両サイトの ScalarDB Cluster を再起動する必要があります。 - デフォルト値:
256
repl_db.namespace
- フィールド:
scalar.db.replication.repl_db.namespace - 説明: レプリケーションテーブルの名前空間名。このフィールドはプライマリサイトとバックアップサイト間で同一である必要があります。
- デフォルト値:
replication
record_table_suffix
- フィールド:
scalar.db.replication.record_table_suffix - 説明: レプリケーションレコードメタデータテーブルのサフィックス。
- デフォルト値:
__records
LogWriter 設定 (プライマリサイト)
LogWriter 設定は、トランザクションコミット中に書き込み操作がキャプチャされ、レプリケーションデータベースに保存される方法を制御します。
log_writer.enabled
- フィールド:
scalar.db.replication.log_writer.enabled - 説明: LogWriter 機能の有効化または無効化。
- デフォルト値:
false
log_writer.compression_type
- フィールド:
scalar.db.replication.log_writer.compression_type - 説明: レプリケーションデータベースに保存される書き込み操作の圧縮タイプ。利用可能な値:
NONE、GZIP。 - デフォルト値:
GZIP
log_writer.group_commit.retention.time_millis
- フィールド:
scalar.db.replication.log_writer.group_commit.retention.time_millis - 説明: レプリケーションデータベースでトランザクショングループをコミットする前の最大待機時間。
- デフォルト値:
100
log_writer.group_commit.retention.values
- フィールド:
scalar.db.replication.log_writer.group_commit.retention.values - 説明: レプリケーションデータベースで一緒にバッチ処理するトランザクションの最大数。
- デフォルト値:
32
log_writer.group_commit.timeout_check_interval_millis
- フィールド:
scalar.db.replication.log_writer.group_commit.timeout_check_interval_millis - 説明: レプリケーションデータベースのグループコミットタイムアウトをチェックする間隔。
- デフォルト値:
20
log_writer.group_commit.max_thread_pool_size
- フィールド:
scalar.db.replication.log_writer.group_commit.max_thread_pool_size - 説明: レプリケーションデータベースのグループコミット処理用の最大スレッドプールサイズ。
- デフォルト値:
4096
LogApplier 設定 (バックアップサイト)
LogApplier 設定は、レプリケーションデータが処理され、バックアップサイトテーブルに適用される方法を制御します。
log_applier.enabled
- フィールド:
scalar.db.replication.log_applier.enabled - 説明: LogApplier 機能の有効化または無効化。
- デフォルト値:
false
log_applier.transaction.expiration_millis
- フィールド:
scalar.db.replication.log_applier.transaction.expiration_millis - 説明: クリーンアップ用のトランザクション有効期限。
- デフォルト値:
30000
log_applier.transaction_group_scanner.threads
- フィールド:
scalar.db.replication.log_applier.transaction_group_scanner.threads - 説明: レプリケーションデータベース内のトランザクショングループ用のスキャナースレッド数。
- デフォルト値:
16
log_applier.transaction_group_scanner.fetch_size
- フィールド:
scalar.db.replication.log_applier.transaction_group_scanner.fetch_size - 説明: レプリケーションデータベースから各スキャン操作で取得するトランザクショングループレコード数。
- デフォルト値:
32
log_applier.transaction_group_scanner.wait_millis
- フィールド:
scalar.db.replication.log_applier.transaction_group_scanner.wait_millis - 説明: レプリケーションデータベース内のトランザクショングループのスキャン間の待機時間 (ミリ秒)。この値を増やすとスキャン頻度が減りますが、レプリケーション遅延が増加する可能性があります。
- デフォルト値:
1000
log_applier.transaction_group_scanner.dedup.expiration_millis
- フィールド:
scalar.db.replication.log_applier.transaction_group_scanner.dedup.expiration_millis - 説明: トランザクショングループ重複除去キャッシュの有効期限。LogApplier はこのキャッシュを使用して、レプリケーションデータベースから同じトランザクショングループを再処理することを回避します。
- デ フォルト値:
10000
log_applier.transaction_handler.threads
- フィールド:
scalar.db.replication.log_applier.transaction_handler.threads - 説明: LogApplier トランザクション処理用のスレッド数。この値を増やすとレプリケーションパフォーマンスが向上する可能性がありますが、リソース消費が増加します。
- デフォルト値:
128
log_applier.max_record_version
- フィールド:
scalar.db.replication.log_applier.max_record_version - 説明: 整数オーバーフローを防ぐための最大レコードバージョン (開発用)。
- デフォルト値:
Integer.MAX_VALUE - 1000
log_applier.write_operation.expiration_millis
- フィールド:
scalar.db.replication.log_applier.write_operation.expiration_millis - 説明: ガベージコレクション用の書き込み操作有効期限。
- デフォルト値:
86400000(1日)
log_applier.replication_status_service.threads
- フィールド:
scalar.db.replication.log_applier.replication_status_service.threads - 説明: レプリケーションステータスサービス用のスレッド数。
- デフォルト値:
16
log_applier.coordinator_state_cache.expiration_millis
- フィールド:
scalar.db.replication.log_applier.coordinator_state_cache.expiration_millis - 説明: Coordinator 状態キャッシュの有効期限。
- デフォルト値:
30000
log_applier.coordinator_state_cache.size
- フィールド:
scalar.db.replication.log_applier.coordinator_state_cache.size - 説明: Coordinator 状態キャッシュの最大サイズ。
- デフォルト値:
1000
重要な設定注意事項
このセクションでは、容量計画と障害耐性、データベース選択、パフォーマンスチューニングについて説明します。
容量計画と障害耐性のためのパーティション数計画
パーティション数 (scalar.db.replication.partition_count) を計画する際は、基盤となるデータベースによってパーティションに容量制限がある可能性を考慮してください。たとえば、Cosmos DB パーティションは最大 20 GB のデータを格納できます。バックアップサイトが長期間ダウンした場合、 多くの書き込み操作がレプリケーションデータベースに蓄積され、パーティションの制限に達する可能性があります。プライマリサイトからの予想書き込み操作とバックアップサイトの潜在的なダウンタイム期間に基づいてパーティション数を計画してください。パーティション数を増やすことで容量リスクを軽減できる可能性がありますが、より多くの LogApplier リソースが必要になる可能性があります。
データベース選択
Coordinator データベースとレプリケーションデータベース (共有コンポーネント) が利用不可の場合、プライマリサイトはトランザクションをコミットできず、LogApplier はレプリケーションデータを処理できません。そのため、災害耐性要件を満たす高可用性データベース (scalar.db.multi_storage.storages.coordinator.* と scalar.db.multi_storage.storages.replication.*) を選択し、データをレプリケートする場所に応じて複数の AZ またはリージョン間で同期レプリケーションを行う必要があります (たとえば、整合性レベルとして Strong を設定した Cosmos DB)。
パフォーマンスチューニング
リモートレプリケーションを使用する場合、ワークロードの特性とインフラストラクチャセットアップに基づいてパフォーマンスを調整する必要がある場合があります。このセクションでは、レプリケーションパフォーマンスを最適化するための主要な設定パラメータについて説明します。
LogWriter パフォーマンスチューニング
プライマリサイトでは、ワークロードの特性に基づいてレイテンシとスループットのバランスを取るために、グループコミット設定 (scalar.db.replication.log_writer.group_commit.retention.time_millis と scalar.db.replication.log_writer.group_commit.retention.values) を調整してください。
LogApplier パフォーマンスチューニング
バックアップサイトでは、並列処理パフォーマンスとリソース消費のバランスを取るために、スレッド数 (scalar.db.replication.log_applier.transaction_group_scanner.threads と scalar.db.replication.log_applier.transaction_handler.threads) を調整してください。
高レイテンシデータベース環境
マルチリージョンデータベースは、より高いレイテンシを持つ可能性があります。高レイテンシの Coordinator データベースでスループットを向上させるために、グループコミット設定の使用を検討してください。Coordinator グループコミット機能は複数のトランザクションを一緒にバッチ処理し、ネットワークレイテンシが全体のスループットに与える影響を減らします。レプリケーションデータベースのチューニングについては、上記の LogWriter パフォーマンスチューニングセクションを参照してください。