スワップリバランスとは、同じ数のノードの追加と削除を一度のオペレーションで実行した時にデータの移動を最適化する自動機能です。スワップリバランスは、削除するノードから追加するノードに直接データを移行することで、リバランスを最適化します。これは、通常、クラスタ全体のデータを移動する標準リバランスよりも効率的です。
スワップリバランスは、以下の場合のみに実行されます。
リバランス時に、追加するノードと削除するノードの数が同じである場合です。例えば、クラスタから2つのノードを削除するようマークし、2つのノードを新規に追加しようとスタンバイしている状態です。
追加および削除されたノードの数が同一であれば、スワップリバランスが自動的に行われます。スワップリバランスを強制的に実行するための設定や選択する仕組みはありません。スワップリバランスが行われない場合は、代わりに通常のリバランスが行われます。
CouchbaseServerが、リバランスが実行されクラスタに追加するノードと削除するノード数が同じであると認識すると、スワップリバランスがリバランス操作として実行されます。
スワップリバランスが行われるとき、リバランスは次のように動作します:
データは、削除されるノードから追加するノードに対して1体1対応で移動します。これにより全体のvBucketマップを再構築する必要がなくなります。
アクティブなvBucketsは、ソースノードから宛先ノードまで、一度に1つずつ移動されます。
レプリカvBucketsは、ライブレプリカバケットとして活性化される前に、新しいノードに作成され、データが移行されます。このことにより、リバランス中に障害が発生しても、レプリカが元の場所に残っていることが保証されます。
たとえば、20ノードからなるクラスタがあり、「2つのノード(X,Y)を追加、2つのノードを削除(A,B)」という設定をした場合:
ノードAのvBucketはノードXに移行されます。
ノードBのvBucketはノードYに移行されます。
スワップリバランスの利点は次のとおりです:
リバランスにかかる時間を短縮します。削除するノードから追加するノードに直接データを移行するからです。
リバランス中のクラスタ負荷を減少させます。
リバランス中のネットワークのオーバーヘッドを減少させます。
リバランス中に障害が発生する可能性を減少させます。なぜなら、古いノードのレプリカが有効なままで新しいノード上にレプリカを作成し、2重化しているからです。
すべてのリバランスを行うのではなく、ノード上のデータのみを交換するため、リバランスによって変更される領域は小さくなります。よって、パフォーマンスとフェイルオーバーの面からも利点があります。
フェイルオーバー中のクラスタの動作と、スワップリバランス機能によるリバランス操作は、以下の状況下で影響を与えます:
リバランスの停止
リバランスが失敗したり、故意に停止した場合に、移行されたアクティブ/レプリカvBucketは、アクティブなvBucketマップの一部となります。まだ進行中の移行はキャンセルされます。リバランス操作を再起動すると、中断したところからリバランスを再開します。
障害ノードの再追加
ノードに障害が発生した時、そのノードを削除し代わりとなるノードを追加する、もしくはノードをクラスタに戻した場合、それはスワップリバランスとして扱われます。
スワップリバランス機能を使うと、ノードがフェイルオーバーした後、クリーンアップしてフェイルオーバーしたノードを追加し直すか、新しいノードを追加して通常のリバランスを実行する必要があります。 リバランスは、クラスタ全体の容量に影響をあたえることなく、データの移動を最小限にするスワップリバランスとして処理されます。