コンパクションの概要
コンパクションとは?
SSTableは不変であるため、データが更新または削除された場合、古いデータは挿入や更新で上書きされたり、SSTableから削除されたりしません。 代わりに、新しいタイムスタンプで更新されたデータを含む新しいSSTableが作成され、古いSSTableは削除対象としてマークされます。 削除されたデータはトゥームストーンと呼ばれます。
時間の経過とともに、Cassandraは異なるSSTableに同じ行の複数のバージョンを書き込む場合があります。 各バージョンには、異なるタイムスタンプで格納された一意の列セットが含まれている場合があります。 SSTableが蓄積されると、データの分散により、完全な行を取得するために、アクセスする必要があるSSTableの数が増える可能性があります。
データベースを健全な状態に保つために、CassandraはSSTableを定期的にマージし、古いデータを破棄します。 このプロセスはコンパクションと呼ばれます。
なぜコンパクションを実行する必要があるのですか?
SSTableは読み取り操作中に参照されるため、SSTableの数を少なくすることが重要です。 書き込み操作を行うとSSTableの数が増えるため、コンパクションが必要になります。 トゥームストーンの問題に加えて、データは有効期限(TTL)の満了など、他の理由でも削除されます。 データの削除、更新、または期限切れはすべて、コンパクションの有効なトリガーです。
コンパクションは何を達成しますか?
コンパクションによって達成される2つの重要な要素は、パフォーマンスの向上とディスク容量の再利用です。 読み取る必要がある重複データがSSTableにある場合、読み取り操作は遅くなります。 トゥームストーンと重複が削除されると、読み取り操作は高速になります。 SSTableはディスク容量を使用し、コンパクションによってSSTableのサイズを削減することで、ディスク容量が解放されます。
コンパクションはどのように機能しますか?
コンパクションはSSTableのコレクションに対して機能します。 これらのSSTableから、コンパクションは各一意の行のすべてのバージョンを収集し、各行の列の最新バージョン(タイムスタンプ別)を使用して、1つの完全な行を組み立てます。 行は各SSTable内でパーティションキーでソートされ、マージプロセスはランダムI/Oを使用しないため、マージプロセスは高性能です。 各行の新しいバージョンは新しいSSTableに書き込まれます。 古いバージョンと削除準備のできた行は古いSSTableに残され、保留中の読み取りが完了するとすぐに削除されます。
コンパクションの種類
コンパクションの概念は、Cassandraのさまざまな種類の操作に使用されます。これらの操作に共通しているのは、1つ以上のSSTableを取得し、マージして、新しいSSTableを出力することです。 コンパクションの種類は次のとおりです。
- マイナーコンパクション
-
Cassandraでいくつかのアクションに対して自動的にトリガーされるマイナーコンパクション
-
フラッシュによってSSTableがノードに追加された場合
-
無効化された後( `nodetool enableautocompaction` )に自動コンパクションが有効になった場合
-
コンパクションによって新しいSSTableが追加された場合
-
5分ごとに新しいマイナーコンパクションのチェック
-
- メジャーコンパクション
-
メジャーコンパクションは、ユーザーがノード上のすべてのSSTableに対してコンパクションを実行したときにトリガーされます。
- ユーザー定義コンパクション
-
メジャーコンパクションと同様に、ユーザー定義コンパクションは、ユーザーが特定のSSTableセットに対してコンパクションをトリガーしたときに実行されます。
- スクラブ
-
スクラブは、破損したSSTableを修正しようとしてコンパクションをトリガーします。 データが破損している場合、これは実際に有効なデータを削除する可能性があります。 その場合は、ノードで完全なリペアを実行する必要があります。
- UpgradeSSTables
-
SSTableを最新バージョンにアップグレードすると、コンパクションが発生します。 新しいメジャーバージョンにアップグレードした後、これを実行します。
- クリーンアップ
-
コンパクションは、ノードが所有しなくなった範囲を削除するために実行されます。 このタイプのコンパクションは、通常、ノードがブートストラップされた後に隣接ノードでトリガーされます。これは、ブートストラップノードがこれらのノードから一部の範囲の所有権を取得するためです。
- セカンダリインデックスの再構築
-
ノードでセカンダリインデックスが再構築されると、コンパクションがトリガーされます。
- アンチコンパクション
-
リペア後、実際にリペアされた範囲は、リペア開始時に存在していたSSTableから分割されます。 このタイプのコンパクションは、このタスクを実行するためにSSTableを書き直します。
- サブレージコンパクション
-
特定のサブレージのみをコンパクションすることが可能です。このアクションは、多くの更新または多くの削除を収集している誤動作しているトークンを知っている場合に役立ちます。 コマンド `nodetool compact -st x -et y` は、xとyの間の範囲を含むすべてのSSTableを選択し、それらのSSTableのコンパクションを発行します。 サイズ階層型コンパクション戦略の場合、これにはほとんどすべてのSSTableが含まれますが、レベルコンパクション戦略では、SSTableのサブセットのコンパクションを発行できます。 LCSを使用すると、結果のSSTableはL0になります。
戦略
さまざまなワークロードを最適化するために、さまざまなコンパクション戦略が利用可能です。 ワークロードに適したコンパクション戦略を選択することで、クエリとコンパクション自体の両方で最高のパフォーマンスが確保されます。
統合コンパクション戦略(UCS)
-
UCSはほとんどのワークロードに適した選択肢であり、新しいワークロードに推奨されます。 このコンパクション戦略は、さまざまなワークロードを処理するように設計されています。 不変な時系列データと、多くの更新と削除を含むワークロードの両方を処理できるように設計されています。 また、スピニングディスクとSSDの両方を処理できるように設計されています。
サイズ階層型コンパクション戦略(STCS)
-
STCSはデフォルトのコンパクション戦略です。これは、他の戦略がワークロードに適合しない場合のフォールバックとして役立つためです。 厳密な時系列ワークロードではないスピニングディスク、または `LCS` からのI/Oが高すぎる場合に最も役立ちます。
レベルコンパクション戦略(LCS)
-
レベルコンパクション戦略(LCS)は、読み取りが多いワークロード、または更新と削除が多いワークロードに最適化されています。 不変な時系列データには適していません。
タイムウィンドウコンパクション戦略(TWCS)
-
タイムウィンドウコンパクション戦略は、TTL付きの、ほとんど不変な時系列データ向けに設計されています。
トゥームストーン
トゥームストーンとは何ですか?
Cassandraのデータ削除プロセスは、パフォーマンスを向上させ、Cassandraのデータ分散とフォールトトレランスの組み込みプロパティと連携するように設計されています。
Cassandraは削除を挿入として扱い、トゥームストーンと呼ばれるタイムスタンプ付きの削除マーカーを挿入します。 トゥームストーンはCassandraの書き込みパスを通過し、1つ以上のノードのSSTableに書き込まれます。 トゥームストーンの主な機能の違いは、組み込みの有効期限/時刻を持っていることです。 有効期限(猶予期間)が終了すると、トゥームストーンはCassandraの通常のコンパクションプロセスの一部として削除されます。
Cassandraの行または列に有効期限(TTL)値をマークすることもできます。 この時間が経過すると、Cassandraはオブジェクトにトゥームストーンをマークし、他のトゥームストーンオブジェクトと同様に処理します。 |
なぜトゥームストーンなのですか?
トゥームストーンは、行または列の値のいずれかのオブジェクトの削除を表します。 このアプローチは、Cassandraの分散された性質のため、値を削除する代わりに使用されます。 オブジェクトがトゥームストーンとしてマークされると、クエリはトゥームストーンの挿入前にタイムスタンプが付けられたすべての値を無視します。
ゾンビ
マルチノードクラスターでは、Cassandraは同じデータのレプリカを2つ以上のノードに格納する場合があります。 これはデータの損失を防ぐのに役立ちますが、削除プロセスが複雑になります。 ノードがローカルに格納しているデータの削除コマンドを受信すると、ノードは指定されたオブジェクトにトゥームストーンを付け、そのオブジェクトのレプリカを含む他のノードにトゥームストーンを渡そうとします。 ただし、その時点で1つのレプリカノードが応答しない場合、トゥームストーンをすぐに受信しないため、削除前のバージョンのオブジェクトが引き続き含まれます。 トゥームストーンオブジェクトがそのノードが回復する前にクラスターの残りの部分からすでに削除されている場合、Cassandraは回復されたノード上のオブジェクトを新しいデータとして扱い、クラスターの残りの部分に伝播します。 この種の削除されたが永続的なオブジェクトは、ゾンビと呼ばれます。
猶予期間
ゾンビの再出現を防ぐため、Cassandraは各トゥームストーンに猶予期間を与えます。トゥームストーンの猶予期間は、テーブルプロパティ `WITH gc_grace_seconds` で設定されます。デフォルト値は864000秒(10日間)で、この期間が経過するとトゥームストーンは期限切れとなり、コンパクション中に削除できます。猶予期間が満了するまでは、Cassandraはコンパクションイベントを通じてトゥームストーンを保持します。各テーブルはこのプロパティに独自の値を持つことができます。
猶予期間の目的は、応答しないノードにリカバリしてトゥームストーンを正常に処理する時間を与えることです。クライアントが猶予期間中にトゥームストーン化されたオブジェクトに新しい更新を書き込むと、Cassandraはトゥームストーンを上書きします。クライアントが猶予期間中にそのオブジェクトの読み取りを送信すると、Cassandraはトゥームストーンを無視し、可能であれば他のレプリカからオブジェクトを取得します。
応答しないノードが回復すると、Cassandraはヒント付きハンドオフを使用して、ノードがダウンしている間に見逃したデータベースの変更を再生します。Cassandraは、猶予期間中にトゥームストーン化されたオブジェクトの変更を再生しません。ただし、猶予期間が終了するまでノードが回復しない場合、Cassandraは削除を見逃す可能性があります。
トゥームストーンの猶予期間が終了すると、Cassandraはコンパクション中にトゥームストーンを削除します。
削除
gc_grace_seconds
が経過すると、トゥームストーンは削除される可能性があります(つまり、特定のデータが削除されたことを示すオブジェクトは存在しなくなります)。ただし、削除に関する1つの問題は、トゥームストーンが1つのSSTableに存在し、削除対象としてマークするデータが別のSSTableに存在する可能性があるため、コンパクションでは両方のSSTableも削除する必要があることです。より正確には、実際のトゥームストーンを削除するには
-
トゥームストーンは
gc_grace_seconds
より古い必要があります。gc_grace_seconds
が経過しても、コンパクションイベントが発生するまでトゥームストーンは削除されないことに注意してください。 -
パーティションXにトゥームストーンが含まれている場合、パーティションを含むSSTableと、Xを含むトゥームストーンよりも古いデータを含むすべてのSSTableは、同じコンパクションに含める必要があります。パーティションXを含むSSTableのすべてのデータがトゥームストーンよりも新しい場合、無視できます。
-
オプション
only_purge_repaired_tombstones
が有効になっている場合、データも修復されている場合にのみトゥームストーンが削除されます。このプロセスについては、「トゥームストーンによる削除」セクションで説明しています。
ノードが gc_grace_seconds
より長くダウンまたは切断されたままの場合、削除されたデータは他のノードに修復され、クラスターに再び表示されます。これは基本的に「トゥームストーンなしの削除」セクションと同じです。
トゥームストーンなしの削除
値[A]がすべてのノードにレプリケートされている3ノードクラスターを想像してみてください。
[A], [A], [A]
ノードの1つに障害が発生し、削除操作で既存の値のみが削除された場合、次のようなクラスターになる可能性があります。
[], [], [A]
その後、修復操作により、値[A]が値のない2つのノードに置き換えられます。
[A], [A], [A]
これにより、データが削除されたにもかかわらず、ゾンビとして復活します。
トゥームストーンによる削除
値[A]がすべてのノードにレプリケートされている3ノードクラスターから再び始めます。
[A], [A], [A]
データを削除する代わりにトゥームストーンオブジェクトを追加すると、単一ノード障害の状況は次のようになります。
[A, Tombstone[A]], [A, Tombstone[A]], [A]
これで、修復を実行すると、削除されたデータが復活するのではなく、トゥームストーンがレプリカにコピーされます。
[A, Tombstone[A]], [A, Tombstone[A]], [A, Tombstone[A]]
修復操作により、オブジェクト[A]がすべてのノードで削除済みとしてマークされた状態で、システムの状態が期待どおりに正しく設定されます。これは、ディスク容量を永久に蓄積するトゥームストーンが最終的に発生することを意味します。トゥームストーンを永久に保持しないようにするために、Cassandraのすべてのテーブルに gc_grace_seconds
を設定します。
完全に期限切れのSSTable
SSTableにトゥームストーンのみが含まれており、そのSSTableが他のSSTableのデータをシャドウイングしていないことが保証されている場合、コンパクションはそのSSTableを削除できます。トゥームストーンのみを含むSSTable(有効期限が切れたTTLデータはトゥームストーンと見なされます)が表示されても、コンパクションによって削除されていない場合は、他のSSTableに古いデータが含まれている可能性があります。削除可能なSSTableと、削除をブロックしているSSTableを一覧表示する sstableexpiredblockers
というツールがあります。TimeWindowCompactionStrategy
を使用すると、unsafe_aggressive_sstable_expiration
を有効にすることで、保証を削除する(シャドウイングデータをチェックしない)ことができます。
TTL
Cassandraのデータには、Time To Liveと呼ばれる追加のプロパティを設定できます。これは、時間が経過すると期限切れのデータを自動的に削除するために使用されます。TTLが期限切れになると、データはトゥームストーンに変換され、少なくとも gc_grace_seconds
の間保持されます。TTL付きのデータとTTLなしのデータ(またはTTLの長さが異なるだけ)を混在させると、パーティションが多くのSSTableにまたがり、すべてが一度にコンパクションされるわけではないため、Cassandraは作成されたトゥームストーンの削除に苦労することに注意してください。
修復済み/未修復のデータ
増分修復では、Cassandraはどのデータが修復され、どのデータが未修復かを追跡する必要があります。アンチコンパクションにより、修復されたデータは修復済みと未修復のSSTableに分割されます。データを再び混在させないために、2つのデータセットに対して個別のコンパクション戦略インスタンスが実行され、各インスタンスは修復済みまたは未修復のSSTableのいずれかのみを認識します。これは、増分修復を1回だけ実行し、その後二度と実行しない場合、修復済みSSTableに非常に古いデータが存在し、未修復(おそらく新しい)SSTableのトゥームストーンの削除をコンパクションがブロックする可能性があることを意味します。
データディレクトリ
トゥームストーンとデータは異なるSSTableに存在する可能性があるため、SSTableを失うとデータが再びライブになる可能性があることを理解することが重要です。SSTableを失う最も一般的な方法は、ハードドライブの故障です。データをライブにしないようにするために、トゥームストーンと実際のデータは常に同じデータディレクトリにあります。こうすることで、ディスクが失われた場合、パーティションのすべてのバージョンが失われ、データが削除解除されることはありません。これを達成するために、修復済み/未修復データを含むコンパクション戦略インスタンスに加えて、データディレクトリごとにコンパクション戦略インスタンスが実行されます。これは、4つのデータディレクトリがある場合、8つのコンパクション戦略インスタンスが実行されることを意味します。これには、データの削除解除を防ぐ以上のメリットがいくつかあります。
-
より多くのコンパクションを並行して実行できます。レベリングコンパクションには、いくつかの完全に独立したレベリングがあり、それぞれが他のレベリングとは独立してコンパクションを実行できます。
-
ユーザーは単一のデータディレクトリをバックアップおよびリストアできます。
-
ただし、現時点ではすべてのデータディレクトリが等しいと見なされるため、小さなディスクと大きなディスクが2つのデータディレクトリをバッキングしている場合、大きなディスクは小さなディスクによって制限されることに注意してください。これに対する1つの回避策は、大きなディスクによってバッキングされるデータディレクトリをさらに作成することです。
単一SSTableトゥームストーンコンパクション
SSTableが書き込まれると、トゥームストーンの有効期限を含むヒストグラムが作成され、これを使用してトゥームストーンが非常に多いSSTableを見つけ、そのSSTableで単一SSTableコンパクションを実行して、そのSSTableのトゥームストーンを削除できるようになります。これを開始する前に、トゥームストーンが実際に削除できる可能性、このSSTableが他のSSTableとどの程度重複しているかもチェックされます。これらのチェックのほとんどを回避するために、コンパクションオプション unchecked_tombstone_compaction
を有効にすることができます。
共通オプション
すべてのコンパクション戦略に共通のオプションがいくつかあります。
enabled
(デフォルト:true)-
マイナーコンパクションを実行するかどうか。コンパクションオプションとして 'enabled':trueを設定し、 'nodetool enableautocompaction' を実行してコンパクションを開始できることに注意してください。
tombstone_threshold
(デフォルト:0.2)-
SSTableの単一SSTableコンパクションを実行することを検討するために、SSTableのどれだけがトゥームストーンであるべきか。
tombstone_compaction_interval
(デフォルト:86400秒(1日))-
単一SSTableコンパクションを実行してもトゥームストーンを削除できない場合があるため、1つのSSTableが常に再コンパクションされないようにする必要があります。このオプションは、特定のSSTableに対してどのくらいの頻度で試行する必要があるかを指定します。
log_all
(デフォルト:false)-
新しい詳細なコンパクションロギング。以下「詳細なコンパクションロギング」を参照してください。
unchecked_tombstone_compaction
(デフォルト:false)-
単一SSTableコンパクションには、開始する必要があるかどうかについて非常に厳密なチェックがあります。このオプションはそれらのチェックを無効にし、一部のユースケースではこれが必要になる場合があります。これは実際のコンパクションについては何も変更せず、安全な場合にのみトゥームストーンが削除されることに注意してください。トゥームストーンを削除できなくても、SSTableを書き換えるだけの場合があります。
only_purge_repaired_tombstone
(デフォルト:false)-
データが修復されている場合にのみトゥームストーンが削除されるようにするという追加の安全性を有効にするオプション。
min_threshold
(デフォルト:4)-
コンパクションがトリガーされるまでのSSTable数の最小制限。
LeveledCompactionStrategy
には使用されません。 max_threshold
(デフォルト:32)-
コンパクションがトリガーされるまでのSSTable数の上限。
LeveledCompactionStrategy
には使用されません。
さらに、具体的な追加オプションについては、各戦略に関するセクションを参照してください。
コンパクションnodetoolコマンド
nodetool
ユーティリティは、コンパクションに関連する多くのコマンドを提供します。
enableautocompaction
-
コンパクションを有効にします。
disableautocompaction
-
コンパクションを無効にします。
setcompactionthroughput
-
コンパクションを最大でどのくらいの速度で実行するか - デフォルトは64MiB/sです。
compactionstats
-
現在および保留中のコンパクションに関する統計。
compactionhistory
-
最後のコンパクションに関する詳細を一覧表示します。
setcompactionthreshold
-
コンパクションをトリガーするタイミングの最小/最大SSTable数を設定します。デフォルトは4/32です。
JMXを使用したコンパクション戦略とオプションの切り替え
JMXを使用して単一ノードのコンパクション戦略とそのオプションを切り替えることができます。これは、クラスター全体に影響を与えることなく設定を試すのに最適な方法です。mbeanは
org.apache.cassandra.db:type=ColumnFamilies,keyspace=<keyspace_name>,columnfamily=<table_name>
であり、変更する属性は、jconsoleまたはjmcを使用する場合は CompactionParameters
または CompactionParametersJson
です。たとえば、jsonバージョンの構文は、ALTER TABLE
ステートメントで使用する構文と同じです。
{ 'class': 'LeveledCompactionStrategy', 'sstable_size_in_mb': 123, 'fanout_size': 10}
設定は、コンパクション設定に触れるか、ノードを再起動する ALTER TABLE
が実行されるまで保持されます。