Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

followerノードの再起動を正しく認識する #11

Open
sile opened this issue Oct 12, 2018 · 3 comments
Open

followerノードの再起動を正しく認識する #11

sile opened this issue Oct 12, 2018 · 3 comments
Assignees

Comments

@sile
Copy link
Member

sile commented Oct 12, 2018

リーダノードは、各followerノード毎に状態(e.g., ログの長さ)を保持しているが、今はfollowerノードの再起動を上手く認識できないことがあるので改善する。

案: ノードにインスタンスIDを付与して、それが変わっている場合には、リーダが保持するそのノードの状態を初期化する

問題の再現方法①:

  • 三ノードでクラスタを組んで、適当にpropose
  • その内の一つを落としてデータを削除
  • 落としたノードを再起動
    • => この状態では、リーダが再選出されたり同期されたりしないことがある?
    • => おそらく、既存のリーダがダウンノードの状態をダウンする前の情報をもとに判断してしまっているのが原因

問題の再現方法②:

  • クラスタ内の一つのノードを停止
  • ストレージを削除
  • 再起動
    • => この時点で同期が走らないのは想定通り
  • 新しいログがコミットされた
  • => 再起動ノードはbusy-loop状態に

考察:

  • ストレージが消えていないなら、状態を初期化する必要はない(逆に、初期化したら何か問題が発生するかもしれない)
  • ストレージのUUIDをインスタンスのIDとして使うのが良いかもしれない?
    • ただ、本当にちゃんとやるなら、クラスタ構成の変更を走らせるのが正しい(データが消えているなら、それは別ノードとして扱わないと整合性が崩れる可能性がある)
@shinnya
Copy link
Contributor

shinnya commented Jan 16, 2019

別件の検証中に "問題の再現方法1" に関して1つ判明していて、データを削除後にノードを再起動したからといって同期(スナップショット同期)されなくなることはない。

以下その理由。

ダウンからの再起動で1回目の AppendEntriesCall で

AppendEntriesReply { log_tail, .. } if follower.synced => {

に来てしまう。(本来はデータ削除後は sync していないが過去の状態が反映されてしまう。)

follower.synced = false;

で同期状態がクリアされる。

で、2回目の AppendEntriesCall で

follower.log_tail = log_tail.index.as_u64().saturating_sub(1).into();

を通り、log_tail が正常に同期される。

@shinnya
Copy link
Contributor

shinnya commented May 15, 2019

問題の再現方法①:

現在の master では再現しないようです。

@sile
Copy link
Member Author

sile commented May 20, 2019

了解です。確認ありがとうございます。 > 現在の master では再現しないようです。

@shinnya shinnya self-assigned this Dec 28, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants