ストリーミングの改善
Apache Cassandra 4.0では、ストリーミングにいくつかの改善が加えられました。ストリーミングは、クラスタのノードがSSTable形式のデータを交換するために使用するプロセスです。SSTableのストリーミングは、以下のようないくつかの操作で実行されます。
-
SSTable修復
-
ホストの置換
-
範囲の移動
-
ブートストラップ
-
再構築
-
クラスタの拡張
Nettyベースのストリーミング
Cassandra 4.0のストリーミングは、Nettyを使用したノンブロッキング入出力(NIO)に基づいています(CASSANDRA-12229)。これは、ストリーミングメッセージとファイル転送のシングルスレッド(またはシーケンシャル)、同期、ブロッキングモデルに取って代わります。Nettyは、複数の接続を同時に開くことができるノンブロッキング、非同期、マルチスレッドストリーミングをサポートしています。ノンブロッキングとは、スレッドが送信されたリクエストの応答を待機しないため、ブロックされないことを意味します。応答は別のスレッドで返される可能性があります。非同期では、接続とスレッドは切り離されており、1対1の関係はありません。スレッドよりも多くの接続を開くことができます。
ゼロコピーストリーミング
4.0以前では、ストリーミング中にCassandraはSSTableをオブジェクトに具象化していました。これにより不要なガベージが発生し、一部のSSTableは個々のパーティションではなく、ファイル全体として転送できるため、ストリーミングプロセス全体が遅くなります。Cassandra 4.0では、可能な場合はSSTable全体をストリーミングするためのサポートが追加されました(CASSANDRA-14556)。これにより、ZeroCopy APIを使用した高速ストリーミングが可能になります。有効にすると、Cassandraは適格なSSTableにZeroCopyを使用し、転送速度とスループットを大幅に向上させます。ゼロコピーパスは、送受信側両方でデータをユーザー空間にもたらすことを回避します。ストリーミング関連の操作では、対応する改善が見られます。ゼロコピーストリーミングはハードウェアに依存しており、ハードウェアの制限(ネットワークとディスクI/O)によってのみ制限されます。
高可用性
ベンチマークテストでは、ゼロコピーストリーミングはパーティションベースのストリーミングよりも5倍高速です。高速ストリーミングにより、可用性が向上するという利点があります。クラスタの復旧は主にストリーミング速度に依存するため、ノードに障害が発生したCassandraクラスタは、はるかに迅速に(5倍高速に)復旧できます。ノードに障害が発生した場合、SSTableを置換ノードにストリーミングする必要があります。置換操作中、新しいCassandraノードは、この新しいノードのトークン範囲に属するデータのコピーを保持する隣接ノードからSSTableをストリーミングします。保存されているデータの量によっては、このプロセスにはかなりのネットワーク帯域幅が必要になり、完了するまでに時間がかかる場合があります。これらの範囲移動操作にかかる時間が長くなるほど、クラスタの可用性が低下します。複数のノードの障害は、高可用性を大幅に低下させます。新しいノードがデータをストリーミングする速度が速くなるほど、トラフィックを迅速に処理できるようになり、クラスタの可用性が向上します。
ゼロコピーストリーミングの有効化
ゼロコピーストリーミングは、cassandra.yaml
で次の設定を行うことで有効になります。
stream_entire_sstables: true
デフォルトでは、ゼロコピーストリーミングは有効になっています。
ゼロコピーストリーミングに適格なSSTable
SSTable内のすべてのパーティションを転送する必要がある場合、ゼロコピーストリーミングが使用されます。これは、LeveledCompactionStrategy
を使用する場合、またはトークン範囲によるSSTableのパーティショニングが有効になっている場合によく見られます。ゼロコピーストリーミングの適格性を判断するために、SSTable内のすべてのパーティションキーが反復処理されます。
ゼロコピーストリーミングの利点
有効にすると、Cassandraはすべてのコンポーネントを含む、適格なSSTable全体をノード間でゼロコピーストリーミングできます。これにより、stream_throughput_outbound
で指定されたスロットリングの影響を受けますが、ネットワーク転送速度が大幅に向上します。
これにより、送受信ノードのGC圧力が軽減されます。この機能はディスクのバランスを維持しようとしますが、保証はできません。ノード間暗号化が有効になっている場合、この機能は自動的に無効になります。現在、これはLeveled Compactionで使用できます。
ゼロコピーストリーミングの設定
スロットリングにより、ストリーミング速度が低下します。stream_throughput_outbound
は、ノードでのすべての発信ストリーミングファイル転送を、指定された合計スループット(Mbps)に制限します。設定されていない場合、デフォルトは200 Mbpsまたは24 MiB/sです。
stream_throughput_outbound: 24MiB/s
ゼロコピーストリーミングのベンチマークを実行するには、stream_throughput_outbound
を非常に高い値に設定する必要があります。そうでない場合、スロットリングが大きく、ベンチマークの結果は意味のあるものになりません。
inter_dc_stream_throughput_outbound
は、データセンター間のすべてのストリーミングファイル転送を制限します。この設定により、stream_throughput_outbound
で設定されたすべてのネットワークストリームトラフィックのスロットリングに加えて、データセンター間のストリームスループットを制限できます。設定されていない場合、デフォルトは200 Mbpsまたは25 MB/sです。
inter_dc_stream_throughput_outbound: 24MiB/s
ゼロコピーストリーミングでストリーミングされるSSTableコンポーネント
ゼロコピーストリーミングは、SSTable全体をストリーミングします。SSTableは、別々のファイルにある複数のコンポーネントで構成されています。ストリーミングされるSSTableコンポーネントは、表1に記載されています。
表1. SSTableコンポーネント
SSTableコンポーネント | 説明 |
---|---|
Data.db |
SSTableの基本データ。残りのコンポーネントは、データコンポーネントに基づいて再生成できます。 |
Index.db |
データファイル内の位置へのポインタを含む、行キーのインデックス。 |
Filter.db |
SSTable内の行キーのシリアライズされたブルームフィルタ。 |
CompressionInfo.db |
非圧縮データの長さ、チャンクオフセットなどの情報を保持するファイル。 |
Statistics.db |
SSTableの内容に関する統計メタデータ。 |
Digest.crc32 |
データファイルサイズ_bytesのCRC32チェックサムを保持します。 |
CRC.db |
非圧縮ファイル内のチャンクのCRC32を保持します。 |
Summary.db |
SSTableインデックスサマリー(インデックスコンポーネントのサンプリング)を保持します。 |
TOC.txt |
目次。SSTableのすべてのコンポーネントのリストを格納します。 |
カスタムコンポーネント。例:カスタム圧縮戦略で使用される可能性があります。
修復ストリーミングプレビュー
nodetool repair
による修復には、修復されたSSTableのストリーミングが含まれ、実行する必要がある修復ストリーミングの量の見積もりを提供する修復プレビューが追加されました。修復プレビュー(CASSANDRA-13257)は、オプションを使用してnodetool repair --preview
で呼び出されます。
-prv, --preview
ストリーミングする範囲とデータの量を決定しますが、実際には修復を実行しません。
Keyspaceのストリーミングの並列化
Cassandra 4.0では、ブートストラップと再構築のための異なるKeyspaceのストリーミングが並列化されました(CASSANDRA-4663)。
マルチDC展開でのストリーミングの固有ノード
各DCのレプリカ数が3以上の場合、Range Streamerはデータのストリーミング元として固有のノードを選択します(CASSANDRA-4650)。この最適化を行うことで、クラスタ全体でストリーミング負荷を均等化できます。最適化を行わない場合、一部のノードは他のノードよりも多くのデータのストリーミングに選択される可能性があります。このパッチにより、1つの範囲のみをストリーミングする専用ノードを選択できます。
これにより、ノードのブートストラップのパフォーマンスが向上し、データを提供するノードへの負荷も軽減されます。各DCでN < 3の場合は、2つのノードからのみデータをストリーミングするため、影響はありません。
ストリーム操作の種類
特定のストリームの種類または目的を知ることは重要です。バージョン4.0(CASSANDRA-13064)では、さまざまな種類のストリームを区別するためのenum
が追加されました。ストリームの種類は、ストリームリクエストとストリームタスクの両方で使用できます。さまざまなストリームの種類は次のとおりです。
-
レプリカ数の復元
-
アンブートストラップ
-
再配置
-
ブートストラップ
-
再構築
-
バルクロード
-
修復
レプリカ数が設定されたRFを下回ると、デコミッションを許可しない
CASSANDRA-12510は、レプリカ数が設定されたレプリケーションファクター(RF)を下回るとデコミッションを防ぎ、意図的な場合はデコミッションを続行できるようにする--force
オプションを追加します。設定されたRFを下回ってレプリカ数を減らす場合でも、このノードのデコミッションを強制します。