準備
1、読みいかだ紙
、2を読んでいかだの理論と実践[1] -理論的な記事
3を、読んでいかだ理論と実践を[2] -lab2a
4、読ん説明[3] -lab2aいかだの理論と実践を
5を、読んでいかだ理論と実践を[4] -lab2bログ・コピー
6、私が書いたこの記事を参照してください。 アナログRPCリモートプロシージャコール
持久化
ラフトベースのサーバーが再起動されている場合は、それがサービスを中断したところから再開する必要があります。これは、再起動後も有効で、ラフトは、長期的な状態を維持する必要が。
図2の論文は、永続性を必要とするフィールドを示します。
そしてraft.goの永続的な状態を保存し、復元する方法の例が含まれています。
「実際のサービスは、毎回あなたがラフトラフトがディスクに書き込まれた永続状態の状態を変更し、あなたが回復する再起動すると、ディスクから最新の状態を読み出します。
しかし、我々はpersister.go達成シミュレートするために、構造によって実現します。
最近、永続的な状態いかだを開催存続を提供しますRaft.Make()を呼び出します。
ラフト存続は、その状態を初期化し、その永続的な状態は、各状態に変更されました変更する必要があります。
ReadRaftState()とSaveRaftState()メソッドは、主に存続のために使用されます。
この実験では、我々は()とreadPersist()メソッドでraft.goに固執改善する必要があります。
Labgobパッケージは、機能を符号化及び復号化の使用を必要とします。
あなたは、永続化する何時ニーズに明確にする必要があります。
ここではちょうど2つの重要な実現、行かないで他の意志は、達成するために、読者に委ねられています。
コーディング永続
FUNC(RF *ラフト)が(){存続 //ここにコード(2C)を。 W:=新しい(bytes.Buffer) E:= labgob.NewEncoder(W) e.Encode(rf.CurrentTerm) e.Encode(rf.VotedFor) e.Encode(rf.Logs) データ:= w.Bytes() rf.persister.SaveRaftState(データ) }
永続デコード
FUNC(RF *ラフト)readPersist(データ[]バイト){ もしデータ==ゼロ|| LEN(データ)の任意の状態なしで<1 {//ブートストラップ? リターン } //ここにコードを(2C)。 R:= bytes.NewBuffer(データ) D:= labgob.NewDecoder(R) d.Decode(&rf.CurrentTerm) d.Decode(&rf.VotedFor) d.Decode(&rf.Logs) }
テスト
>ゴーテスト-v -run = 2C
参考資料
https://でgithub.com/dreamerjacks 上/ golang-深分散ラボ