設定した冗長度以上の数のサーバが落ちて、冗長度が0になってしまった場合のROMAの挙動と、その際の対処法です。
環境
server: 3台
冗長度: 2
vnode数: 512
冗長度が0になった時の挙動
冗長度0(data lost)したvnodesの数
上記の環境でサーバが2台落ちて、1台しかインスタンスが生き残っていない場合、計算上170のvnodesが冗長度0になりデータのwriteもreadもできなくなります
512 - {(512(vnodes)/3(server)) * 2(冗長度)}
- 生き残ったインスタンスが担当しているvnodesは342
- primary vnodesが 512(vnodes)/3(server) ≒ 171
- 同じくsecondary vnodesが512(vnodes)/3(server) ≒ 171
- primaryとsecondaryを同じインスタンスが担当することはないので合わせて342
- primaryかsecondaryどちらか生き残っていればdataの読み書きは出来るので、完全にアクセス出来ないvnodesは512-342=170vnodesになる
- このvnodesのことをlost_vnodesと言います
> stat lost_vnodes
routing.lost_vnodes 0 # 正常時は0
挙動
lost_vnodesが発生した場合のROMAの挙動はconfigファイルの設定によって3パターンに分かれます。
no_action
- 何もしません
- lostしたvnodesにはwriteもreadも出来ないままです
auto_assign(デフォルト設定)
- 新たに生き残っているinstanceにlostしたvnodesを再アサインします
- lostする前のdataはread出来ませんが、writeと、lost後にwriteしたdataはreadできます
shutdown
- lostが発生した時点でROMAクラスターを停止します
設定の確認方法
config.rb
config.rb
.
.
# :no_action | :auto_assign | :shutdown
DEFAULT_LOST_ACTION = :auto_assign
.
.
stat
> stat lost_action
routing.lost_action auto_assign
lostが発生した時の対処法
no_action, auto_assignの場合
- 新しいインスタンスを追加(join)します
- no_actionの場合はlostしたvnodesを優先的に、auto_assignの場合は全体のvnodesから満遍なくjoinされたインスタンスに再アサインされます
- (落ちたサーバのinstanceをそのままjoinして戻しても構いませんが、落ちた原因を調べてからにした方がbetterでしょう)
joinの方法
shutdown
- ROMAが停止した状態になるので、再度全インスタンスを立ち上げなおします