1ノードの Cassandra クラスターを 2 ノードに動的に変更する

1ノードの Cassandra クラスターを 2 ノードに動的に変更する

つまり、ほとんどの時間は非常に休止状態ですが、月に数日は高バーストを必要とするアプリケーションがあります。EC2 にデプロイしているので、ほとんどの時間 Cassandra サーバーを 1 台だけ稼働させ、バースト日には負荷に対応するためにもう 1 台のサーバー (最初のサーバーよりも RAM と CPU が多い) を稼働させたいと思います。これを行う最善の方法は何でしょうか。別のアプローチを取るべきでしょうか。

私が計画していることについてのいくつかのメモ:

  • ノードを起動してすぐに修復してください
  • バースト時間が終了したら、強力なノードを廃止する
  • 常時接続サーバーをシードノードとして使用する

私の主な質問は、レプリケーション係数を 2 にしたいので (つまり、両方のノードにすべてのデータがある)、ノードですべてのデータを共有するにはどうすればよいかということですが、サーバーが 1 つしかない場合は機能しません。1 台ではなく 2 台のサーバーを追加で起動する必要がありますか?

答え1

かなり簡単にできるようです複製係数を変更する

これについては、カサンドラウィキ、ここでは複製係数を増やす方法と減らす方法の両方の手順を見つけることができます。

つまり、次のことが可能になるはずです:

  • 複製係数を1から2に変更する
  • バーストノードを起動して修復し、すべてのデータのコピーを受け取るようにします。
  • ... 仕事する ...
  • バーストノードの廃止
  • レプリケーション係数を 2 から 1 に戻す
  • クリーンアップを実行する

答え2

私の経験では、レプリケーション係数をその場で変更することは、あまりうまくいきません :-( 少なくとも私の場合は、修正に時間のかかるスキーマの不一致が発生する可能性があります。

ただ声に出して考えているだけですが、別の可能なルートとしては次のようなものがあります (タイミングは適宜変更してください)。

  1. cassandra.yaml の GC 猶予期間 (これは、ディスクから削除されるまでのトゥームストーンの存続期間を決定します) を 30 日間に増やします。
  2. 必要かどうかに関わらず、15日ごとに2番目のノードを起動します。実行間でデータやコミットログなどが保存されていることを確認します。これにより、2番目のノードを起動する必要があるときに、より迅速に開始できるようになります。
  3. 初代よりもRAMとCPUが充実

Cassandra は、各ノードが担当するリングの量によってワークロードを効果的に分割します。リングの分割を容易にするために、2 番目のノードの容量を最初のノードの 2 倍にするか、最初のノードと同じサイズのノードを 2 つ追加する方が簡単かもしれません。

ただし、ヒント付きハンドオフによって残りのノードのディスクが不必要にいっぱいになるため、ノードを削除するときには手動での nodetool の介入が必要になります。

関連情報