* What algorithms there are for doing failover in a distributed system?
おそらくアルゴリズムではなく、システムです。尋ねた質問に基づいてアーキテクチャを設計する必要があります。
* What algorithms there are for consensus in a distributed system?
おそらく Paxos を実装したいと思うでしょう。シンプルな Paxos を正しく理解するのはそれほど難しくありません。防弾にしようとしている場合は、Google の「Paxos Made Live」の論文を読んでください。高性能にしたい場合は、Multi-Paxos を検討してください。
* How should the nodes in the cluster determine that a node is down?
依存します。ハートビートは、実際にはこれを行うための非常に優れた方法です。問題は、誤検知があることですが、それは一種の避けられないことであり、管理可能な負荷を持つ同じ LAN 上のクラスターでは正確です。Paxos の良いところは、誤検知が自動的に処理されることです。ただし、他の目的で実際に障害情報が必要な場合は、ノードが障害として検出されても問題ないことを確認する必要がありますが、実際には負荷がかかっており、ハートビートに応答するのに時間がかかっています。
* How should the nodes determine that what database entries had their master copy on the failed node at the time of failure, so that other nodes may recover those entries?
* How to decide that which node(s) has the latest secondary copy of some entry?
* How to decide that which node's secondary copy should be promoted to be the new master copy?
Google FileSystem の論文を読むと本当に役立つと思います。GFS には、どのノードがどのブロックを持っているかを追跡する専用のマスター ノードがあります。このスキームはうまくいくかもしれませんが、重要なのは、このマスターへのアクセスを最小限に抑えることです。
この情報を専用ノードに保存しないと、どこにでも保存する必要があります。マスター ホルダーの ID でデータをタグ付けしてみてください。
* How to handle it, if the node which was though to be down, suddenly comes back as if nothing happened?
上記を参照してください。ただし、基本的なポイントは、マスターでなくなったノードがマスターであると考える可能性があるため、注意する必要があるということです。あなたが解決していないと思うことの1つは、更新がマスターに到達する方法、つまり、クライアントが更新を送信するノードをどのように知るかです。
* How to avoid split-brain scenarios, where the network is temporarily split into two, and both sides think that the other side has died?
Paxos は、完全な分割の場合に進行を妨げることによってここで機能します。それ以外の場合は、以前と同様に、非常に注意する必要があります。
一般に、どのノードがどのデータ項目をマスターとして取得するかを知るという問題を解決すれば、アーキテクチャの修正に向けて長い道のりを歩むことができます。更新を受信するノードだけをマスターにすることはできないことに注意してください。2 つの更新が同時に発生した場合はどうなるでしょうか。同期されたグローバル クロックにも依存しないでください。可能であれば、すべての書き込みでコンセンサスを実行することを避けたいと思われるので、代わりに、低速のマスター フェイルオーバー プロトコルと高速の書き込みパスを使用することをお勧めします。
詳細をお知りになりたい場合は、お気軽にメールでお問い合わせください。私のブログhttp://the-paper-trail.orgでは、このようなことをたくさん扱っています。
乾杯、
ヘンリー