圧縮
Cassandraは、オペレーターがテーブルごとに圧縮を設定できるようにします。圧縮は、ユーザーが設定可能な圧縮`chunk_length_in_kb`でSSTableを圧縮することにより、ディスク上のデータサイズを削減します。CassandraのSSTableは不変であるため、圧縮のCPUコストはSSTableが書き込まれるときのみ必要です。データへの後続の更新は異なるSSTableに格納されるため、UPDATEコマンドが発行された場合でも、Cassandraはデータを解凍、上書き、再圧縮する必要はありません。読み取り時には、Cassandraはディスク上の関連する圧縮チャンクを見つけ、チャンク全体を解凍してから、読み取りパスの残りの処理(ディスクとmemtableからのデータのマージ、読み取り修復など)に進みます。
圧縮アルゴリズムは、一般的に次の3つの領域でトレードオフを行います。
-
圧縮速度:圧縮アルゴリズムがデータを圧縮する速度。これは、データはディスクに書き込む前に圧縮する必要があるため、フラッシュとコンパクションパスにおいて重要です。
-
解凍速度:圧縮アルゴリズムがデータを解凍する速度。これは、データはディスクから完全なチャンクで読み取られ、返される前に解凍する必要があるため、読み取りとコンパクションパスにおいて重要です。
-
圧縮率:非圧縮データがどの比率で削減されるか。Cassandraは通常、ディスク上のデータサイズを非圧縮サイズに対する比率として測定します。たとえば、`0.5`の比率は、ディスク上のデータサイズが非圧縮データサイズの50%であることを意味します。Cassandraは、`nodetool tablestats`の`SSTable Compression Ratio`フィールドとして、テーブルごとのこの比率を公開します。
Cassandraは、デフォルトでこれらの領域で異なるトレードオフを行う5つの圧縮アルゴリズムを提供します。圧縮アルゴリズムのベンチマークは、多くの要因(圧縮レベルなどのアルゴリズムパラメータ、入力データの圧縮率、基盤となるプロセッサクラスなど)に依存しますが、次の表は、アプリケーションの要件に基づいて開始点を決定するのに役立ちます。これらの領域における異なる選択肢のパフォーマンスの非常に大まかな評価(Aは比較的良好、Fは比較的悪い)を示しています。
圧縮アルゴリズム | Cassandraクラス | 圧縮 | 解凍速度 | 圧縮率 | C*バージョン |
---|---|---|---|---|---|
|
A+ |
A+ |
C+ |
|
|
|
C+ |
A+ |
B+ |
|
|
|
A- |
A- |
A+ |
|
|
|
A- |
A |
C |
|
|
|
C |
C |
A |
|
一般的に、パフォーマンスが重要な(レイテンシまたはスループット)アプリケーションでは、CPUサイクルあたりの優れた圧縮率が得られるため、`LZ4`が適切な選択肢です。これが、Cassandraでのデフォルトの選択肢である理由です。
ただし、ストレージが重要なアプリケーション(ディスクフットプリント)では、`LZ4`よりも大幅に圧縮率を高めることができるため、`Zstd`の方が適している場合があります。
`Snappy`は下位互換性のために保持されており、通常は`LZ4`の方が優れています。
`Deflate`は下位互換性のために保持されており、通常は`Zstd`の方が優れています。
圧縮の設定
圧縮は、`CREATE TABLE`または`ALTER TABLE`に対するオプションの引数として、テーブルごとに設定されます。すべてのコンプレッサで3つのオプションを使用できます。
-
`class`(デフォルト:`LZ4Compressor`):使用する圧縮クラスを指定します。「高速」コンプレッサは`LZ4Compressor`と`SnappyCompressor`であり、「良好な」圧縮率コンプレッサは`ZstdCompressor`と`DeflateCompressor`です。
-
`chunk_length_in_kb`(デフォルト:`16KiB`):圧縮チャンクあたりのデータのキロバイト数を指定します。ここでの主なトレードオフは、チャンクサイズが大きいほど、圧縮アルゴリズムに多くのコンテキストが与えられ、圧縮率が向上しますが、ディスクからより多くのデータを読み込むために逆シリアライズと読み取りが必要になることです。
`LZ4Compressor`は、次の追加オプションをサポートしています。
-
`lz4_compressor_type`(デフォルト`fast`):`high`(別名`LZ4HC`)圧縮率バージョンと`fast`(別名`LZ4`)バージョンの`LZ4`のどちらを使用するかを指定します。`high`モードは設定可能なレベルをサポートしており、オペレーターは`lz4_high_compressor_level`オプションを介してパフォーマンス<→圧縮率のトレードオフを調整できます。`4.0`以降では、`Zstd`コンプレッサを使用する方が好ましい場合があります。
-
`lz4_high_compressor_level`(デフォルト`9`):より高い圧縮率を得るために費やすCPU時間を表す、`1`から`17`までの整数。一般的に、レベルが低いほど「高速」ですが、圧縮率は低く、レベルが高いほど低速ですが、圧縮率は高くなります。
`ZstdCompressor`は、さらに次のオプションをサポートしています。
-
`compression_level`(デフォルト`3`):より高い圧縮率を得るために費やすCPU時間を表す、`-131072`から`22`までの整数。レベルが低いほど、速度は速くなります(圧縮率を犠牲にして)。20から22の値は「ウルトラレベル」と呼ばれ、より多くのメモリを必要とするため、注意して使用する必要があります。`3`のデフォルトは`Deflate`の圧縮率と競合するのに適した選択肢であり、`1`は`LZ4`と競合するのに適した選択肢です。
ユーザーは以下の構文を使用して圧縮を設定できます。
CREATE TABLE keyspace.table (id int PRIMARY KEY)
WITH compression = {'class': 'LZ4Compressor'};
または
ALTER TABLE keyspace.table
WITH compression = {'class': 'LZ4Compressor', 'chunk_length_in_kb': 64};
有効にすると、`enabled`を`false`に設定することで`ALTER TABLE`を使用して圧縮を無効にできます。
ALTER TABLE keyspace.table
WITH compression = {'enabled':'false'};
ただし、オペレーターは、圧縮の変更が即時ではないことに注意する必要があります。データはSSTableが書き込まれるときに圧縮され、SSTableは不変であるため、テーブルがコンパクションされるまで圧縮は変更されません。`ALTER TABLE`を介して圧縮オプションの変更を発行すると、既存のSSTableはコンパクションされるまで変更されません。オペレーターが圧縮の変更をすぐに有効にする必要がある場合、オペレーターは`nodetool scrub`または`nodetool upgradesstables -a`を使用してSSTableの書き換えをトリガーできます。これにより、ディスク上のSSTableが再構築され、その過程でデータが再圧縮されます。
その他のオプション
-
`crc_check_chance`(デフォルト:`1.0`):読み取り中に各圧縮チャンクのチェックサムを検証するCassandraの可能性を決定し、データ破損を防ぎます。パフォーマンスの問題を示すプロファイルがない限り、これはCassandraのビット腐敗に対する唯一の保護であるため、オフにすることは強くお勧めしません。以前のバージョンのCassandraでは、このオプションの複製が圧縮設定に存在していました。後者はCassandra 3.0で非推奨となり、Cassandra 5.0で削除されました。
利点と用途
圧縮の主な利点は、ディスクに書き込まれるデータ量を削減することです。サイズが小さくなることでストレージの要件が削減されるだけでなく、データの圧縮にかかるCPUオーバーヘッドが、ディスクからより大きな量の非圧縮データを読み書きする時間よりも速いため、読み取りと書き込みのスループットが向上することがよくあります。
圧縮は、多くの行で構成され、行の性質が類似しているテーブルで最も役立ちます。類似したテキスト列(繰り返しのあるJSON BLOBなど)を含むテーブルは、非常に高い圧縮率を示すことがよくあります。既に圧縮されているデータまたはランダムデータ(ベンチマークデータセットなど)を含むテーブルは、通常、圧縮率は高くありません。
運用への影響
-
圧縮メタデータはオフヒープに格納され、ディスク上のデータとともにスケールします。これには、通常、ディスク上のデータ1テラバイトあたり1〜3GBのオフヒープRAMが必要ですが、正確な使用量は`chunk_length_in_kb`と圧縮率によって異なります。
-
ストリーミング操作には、圧縮テーブルでのデータの圧縮と解凍が含まれます。一部のコードパス(非vnodeブートストラップなど)では、圧縮のCPUオーバーヘッドが制限要因となる可能性があります。
-
低速なコンプレッサ(`Zstd`、`Deflate`、`LZ4HC`)がフラッシュを長時間ブロックするのを防ぐために、すべてデフォルトの高速`LZ4`コンプレッサでフラッシュし、通常のコンパクションに依存してデータを目的の圧縮戦略に再圧縮します。詳細については、CASSANDRA-15379を参照してください。
-
圧縮パスはデータの整合性を確保するためにチェックサムを計算します。従来のCassandraの読み取りパスにはディスク上のデータの整合性を確保する方法がありませんが、圧縮テーブルを使用すると、ユーザーは
crc_check_chance
(0.0~1.0の浮動小数点数)を設定して、読み取り時に確率的にチャンクを検証し、ディスク上のビットが破損していないことを確認できます。