一時的なレプリケーション
一時的なレプリケーション (CASSANDRA-14404) は、アプリケーションとデプロイメントのためにデータベースのあらゆる側面を検証できる熟練した Apache Cassandra ユーザー向けに設計された実験的な機能です。これは、読み取り、書き込み、デコミッション、削除、再構築、修復、置換などの操作がすべて、クエリ、データ、構成、運用プラクティス、および可用性の要件で機能することを確認できることを意味します。Apache Cassandra 4.0 には、一時的なレプリケーションの初期実装があります。今後の Cassandra のリリースでは、この機能がより幅広いユーザーに適したものになります。将来のバージョンでは、一時的なレプリケーションを使用したモノトニック読み取りに加えて、LWT、ログバッチ、およびカウンターがサポートされると予想されます。実験的なものであるため、一時的なレプリケーションは本番環境での使用には推奨されません。 |
目的
一時的なレプリケーションの目的は、ストレージ要件をデータの冗長性(またはコンセンサスグループサイズ)から分離し、ストレージオーバーヘッドを削減するために増分修復を使用することです。特定のノードは完全なレプリカとして機能し(特定のトークン範囲のすべてのデータを格納)、一部のノードは一時的なレプリカとして機能し、同じトークン範囲の修復されていないデータのみを格納します。
一時的なレプリケーションで可能になる最適化は「安価なクォーラム」と呼ばれ、ストレージ使用量の増加を伴わずにデータの冗長性が向上することを意味します。
一時的なレプリケーションは、すべてのデータを受信して格納するのに十分な完全なレプリカがない場合に役立ちます。一時的なレプリケーションを使用すると、増分修復されていないデータのみを複製するようにレプリカのサブセットを設定できます。最適化として、完全なレプリカにデータを正常に書き込んだ場合、一時的なレプリカにデータを書き込むのを回避できます。
増分修復後、一時的なレプリカに格納された一時的なデータは破棄できます。
一時的なレプリケーションの有効化
一時的なレプリケーションはデフォルトでは有効になっていません。一時的なレプリケーションは、cassandra.yaml
の次の構成プロパティを設定することにより、クラスタ内の各ノードで個別に有効にする必要があります。
transient_replication_enabled: true
一時的なレプリケーションは、SimpleStrategy
と NetworkTopologyStrategy
の両方で設定できます。一時的なレプリケーションは、レプリケーションファクターを <total_replicas>/<transient_replicas>
として設定することで構成されます。
例として、レプリケーションファクター (RF) 3 でキースペースを作成します。
CREATE KEYSPACE CassandraKeyspaceSimple WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 4/1};
別の例として、some_keysopace keyspace
には DC1 に 3 つのレプリカがあり、そのうち 1 つは一時的なレプリカであり、DC2 には 5 つのレプリカがあり、そのうち 2 つは一時的なレプリカになります。
CREATE KEYSPACE some_keysopace WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1' : '3/1'', 'DC2' : '5/2'};
一時的にレプリケートされたキースペースは、read_repair
が NONE
に設定されたテーブルのみをサポートします。
重要な制限
-
一部のエンドポイントが正常な状態でない場合(範囲の移動がない場合)、RF を変更することはできません。
-
一時的なレプリカがある場合、完全なレプリカを追加することはできません。最初にすべての一時的なレプリカを削除し、完全なレプリカの数を変更してから、一時的なレプリカを元に戻す必要があります。
-
増分修復を毎回実行しながら、一度に安全に一時的なレプリカの数を増やすことしかできません。
さらに、一時的なレプリケーションは、以下には使用できません。
-
モノトニック読み取り
-
軽量トランザクション (LWT)
-
ログバッチ
-
カウンター
-
マテリアライズドビューを使用するキースペース
-
セカンダリインデックス (2i)
安価なクォーラム
安価なクォーラムは、書き込みパス上の最適化のセットであり、要求された整合性レベルを満たすのに十分な完全なレプリカが利用できない場合を除き、一時的なレプリカへの書き込みを回避します。ヒントは、一時的なレプリカには書き込まれません。読み取りパスの最適化では、一時的なレプリカからの読み取りが優先されます。一時的なレプリケーションを使用するように構成されたテーブルにクォーラムで書き込む場合、クォーラムは、一時的なレプリカが書き込みを処理する必要がないように、一時的なレプリカよりも常に利用可能な完全なレプリカを優先します。完全なレプリカが遅いか利用できない場合に、一時的なレプリカに書き込みを送信することにより、テールレイテンシは高速書き込み保護(高速読み取り保護と同様)によって短縮されます。一時的なレプリカは、データがない場合、ブルームフィルターのチェック以外に何もする必要がないため、読み取りを高速に処理できます。vnodes と大規模なクラスタサイズでは、一時的なレプリカが、一時的にレプリケートされた範囲の一部に対して一定量の書き込みトラフィックを処理し始める1つ以上の完全なレプリカが失敗した場合でも、大量のデータを持つことはありません。
投機的書き込みオプション
CREATE TABLE
には、一時的なレプリカで使用するためのオプション speculative_write_threshold
が追加されています。オプションは、デフォルト値が 99PERCENTILE
の simple
型です。レプリカが遅いか応答しない場合、speculative_write_threshold
は、安価なクォーラムの書き込みを一時的なレプリカを含めるようにアップグレードするしきい値を指定します。
保留中の範囲と一時的なレプリカ
保留中の範囲とは、一時的なレプリカ間でのトークン範囲の移動を指します。一時的な範囲が移動されると、両方の一時的なレプリカが、移動が有効になった後、読み取りクォーラムが応答を返すことができるように、論理的な一時的なレプリカを目的とした書き込みを受信する必要がある期間が発生します。ノードは、拡張中に一時的なレプリカには一時的になりません。読み取りを処理できるようになる前に、一時的な範囲の完全なレプリカのようにデータをストリーミングします。完全なレプリカの保留状態に似た保留状態が発生します。一時的なレプリカも、保留中の場合は常に書き込みを受信します。保留中の一時的な範囲には、少し多くのデータが送信され、そこからの読み取りは回避されます。
読み取り修復と一時的なレプリカ
読み取り修復は、一時的なレプリカを修復しようとはしません。読み取りには、常に少なくとも 1 つの完全なレプリカが含まれます。また、可能な場合は一時的なレプリカを優先する必要があります。範囲スキャンでは、スキャンされたすべての範囲に 1 つの完全なレプリカが含まれるという要件を満たすレプリカ選択が実行されるようにします。増分および検証修復処理中、一時的なレプリカでは、アンチコンパクションは一時的な範囲のデータを出力しません。これは、データが修復後に削除され、一時的なレプリカにデータがストリーミングされないためです。
完全なレプリカと一時的なレプリカ間の移行
一時的なレプリケーションが導入する追加の状態遷移では、ストリーミングと nodetool cleanup
が異なる動作をする必要があります。データがストリーミングされる場合、一時的なレプリカではなく、完全なレプリカからストリーミングされることが保証されます。
レプリケートされていない状態から一時的にレプリケートされた状態に移行するということは、次の増分修復が完了するまでノードが保留状態のままである必要があることを意味します。この時点で、その範囲のデータが完全なレプリカで利用可能であることがわかります。
一時的にレプリケートされた状態から完全にレプリケートされた状態に移行するには、完全なレプリカからのストリーミングが必要です。これは、レプリケートされていない状態からレプリケートされた状態に移行するときにデータがストリーミングされる方法と同じです。移行は、ストリーミングが完了するまで一時的なレプリカが完全なレプリカとして読み取られないように管理されます。書き込みクォーラムにすぐに使用できます。
完全にレプリケートされた状態から一時的にレプリケートされた状態に移行するには、修復されたデータを一時的にレプリケートされた範囲から削除してスペースを再利用するためにクリーンアップが必要です。書き込みクォーラムにすぐに使用できます。
一時的にレプリケートされた状態からレプリケートされていない状態に移行するには、以前に一時的にレプリケートされたデータを削除するためにクリーンアップを実行する必要があります。
一時的なレプリケーションが使用されている場合、ノードの追加/削除、RF の変更、DC の追加/削除などのリングの変更がサポートされます。
一時的なレプリケーションは EACH_QUORUM をサポートします
(CASSANDRA-14727) は、EACH_QUORUM
の一時的なレプリケーションのサポートを追加します。(CASSANDRA-14768) によると、必要な応答の数と要求された整合性レベルに関係なく、すべての DC で少なくとも QUORUM
のノードに書き込むようにします。これは、一時的なレプリケーションでユーザーを最小限に驚かせるためです。通常の書き込みでは、すべてのノードに書き込むことで、可能なすべての DC で QUORUM
に到達することをソフトに保証します。ACK を待たなくても、どちらの場合も十分なメッセージが送信されています。