Cassandra ドキュメント

バージョン

プレリリース版のドキュメントを表示しています。

ノードの追加、交換、移動、削除

ブートストラップ

新しいノードの追加は「ブートストラップ」と呼ばれます。num_tokens パラメータは、ブートストラップ中に結合ノードに割り当てられる仮想ノード(トークン)の量を定義します。トークンは、ノードが担当するリング(トークン範囲)のセクションを定義します。

トークン割り当て

デフォルトのトークン割り当てアルゴリズムでは、新しいノードは、担当する num_tokens 個のランダムトークンを選択します。トークンはランダムに分散されるため、仮想ノードの数を増やすと負荷分散が改善されますが、トークン管理のオーバーヘッドも増加します。デフォルトの 256 個の仮想ノードは、許容可能なオーバーヘッドで適切な負荷分散を提供する必要があります。

3.0 以降では、特定のキースペースの既存の仮想ノードの負荷に基づいてトークンを割り当てる新しいトークン割り当てアルゴリズムが導入され、それにより、トークン数を少なくして負荷分散が向上します。このアプローチを使用するには、新しいノードを JVM オプション -Dcassandra.allocate_tokens_for_keyspace=<keyspace> を付けて起動する必要があります。<keyspace> は、アルゴリズムがトークン割り当てを最適化するための負荷情報を見つけることができるキースペースです。

手動によるトークン割り当て

initial_token cassandra.yaml パラメータを使用して、カンマ区切りのトークンリストを手動で指定できます。これが指定されている場合、Cassandra はトークン割り当てプロセスをスキップします。これは、外部ツールでトークン割り当てを行う場合や、以前のトークンを使用してノードを復元する場合に役立ちます。

範囲ストリーミング

トークンが割り当てられると、結合ノードは、データストリームの担当となるトークン範囲の現在のレプリカを選択します。デフォルトでは、新しいノードのデータが現在の状態と一致するように、各トークン範囲のプライマリレプリカからストリームします。

利用できないレプリカがある場合、一貫性のあるブートストラッププロセスは失敗します。この動作をオーバーライドし、利用できないレプリカからのデータを失う可能性がある場合は、JVM フラグ -Dcassandra.consistent.rangemovement=false を設定します。

失敗/ハングしたブートストラップの再開

2.2 以降では、ブートストラッププロセスが失敗した場合、nodetool bootstrap resume を呼び出すことで、以前に保存した状態からブートストラップを再開できます。何らかの理由でブートストラップがハングまたは停止した場合、ノードを再起動するだけで再開することもできます。ブートストラップの状態をクリーンアップして最初からやり直すには、JVM 起動フラグ -Dcassandra.reset_bootstrap_progress=true を設定します。

下位バージョンでは、ブートストラッププロセスが失敗した場合、ノードをワイプ(すべてのデータを削除)し、ブートストラッププロセスを再度開始することをお勧めします。

手動ブートストラップ

隠しパラメータ auto_bootstrap: false を設定することにより、ブートストラッププロセスを完全にスキップして、すぐにリングに参加することができます。これは、バックアップからノードを復元する場合や、新しいデータセンターを作成する場合に役立ちます。

ノードの削除

ライブノードに対して nodetool decommission を使用するか、デッドノードを削除する場合は(他のマシンに) nodetool removenode を使用して、ノードをクラスタから削除できます。これにより、古いノードが担当していた範囲が他のノードに割り当てられ、適切なデータがそこに複製されます。decommission が使用された場合、データは decommissioned ノードからストリームされます。removenode が使用された場合、データは残りのレプリカからストリームされます。

decommissioned ノードからデータが自動的に削除されることはないため、リング上の別のトークンでノードを再度サービスに戻したい場合は、手動で削除する必要があります。

ノードの移動

num_tokens: 1 の場合、nodetool move でリング内のノードの位置を移動できます。移動は、decommission + ブートストラップよりも便利で効率的です。ノードを移動した後、不要なデータを削除するために nodetool cleanup を実行する必要があります。

デッドノードの交換

デッドノードを交換するには、JVM 起動フラグ -Dcassandra.replace_address_first_boot=<dead_node_ip> を付けて Cassandra を起動します。このプロパティが有効になると、ノードはハイバネート状態で起動し、その間、他のすべてのノードはこのノードを DOWN (DN) と認識しますが、このノードは自身を UP (UN) と認識します。正確な交換状態は nodetool netstats で確認できます。

交換ノードは、クラスタ内の残りのノードからデータのブートストラップを開始します。交換ノードは、交換されるノードと異なる IP アドレスを持っている場合にのみ、ブートストラップフェーズ中に書き込みを受信します。(CASSANDRA-8523 および CASSANDRA-12344 を参照)

ブートストラップが完了すると、ノードは「UP」とマークされます。

次のいずれかのケースに該当する場合、ブートストラップ中/前に進行中の書き込みを見逃したため、交換したノードを一貫性のある状態に戻すために必ず修復を実行する必要があります。交換期間とは、ノードが最初にダウンしてから、新しいノードが交換プロセスを完了するまでの期間を指します。

  1. ノードが交換される前に max_hint_window より長くダウンしている場合。

  2. デッドノードと同じ IP アドレスを使用して交換しており、かつ交換に max_hint_window より時間がかかる場合。

進捗状況のモニタリング

ブートストラップ、交換、移動、削除の進捗状況は nodetool netstats を使用して監視できます。これにより、ストリーミング操作の進捗状況が表示されます。

範囲移動後のデータのクリーンアップ

安全対策として、Cassandra は、範囲移動操作(ブートストラップ、移動、交換)によってトークン範囲の一部を「失った」ノードからデータを自動的に削除しません。新しいノードが起動して動作していることに満足したら、結合ノードに範囲を失ったノードで nodetool cleanup を実行します。これを行わないと、古いデータがそのノードの負荷に対してカウントされ続けます。