在 etcd 原始碼學習過程,不會講解太多的原始碼知識,只講解相關的實現機制,需要關注原始碼細節的朋友可以自行根據文章中的提示,找到相關原始碼進行學習。
本文主要介紹 lessor 如果發現過期鍵,server 如何處理過期鍵的過程。
lessor goroutine
func (le *lessor) runloop()
}
runloop 中,呼叫 revokeexpiredleases 找到過期的 lease,並推入 expiredc,等待被處理。
func (le *lessor) revokeexpiredleases()
le.mu.runlock()
if len(ls) != 0
}}
func (le *lessor) findexpiredleases(limit int) *lease
} }return leases
}
func (le *lessor) expireexists() (l *lease, ok bool, next bool)
//這裡重新更新時間是為了讓這個元素不要在頂部,以便下一次收集過期元素
item.time = now.add(le.expiredleaseretryinterval).unixnano()
le.leaseexpirednotifier.registerorupdate(item)
return l, true, false
}
run()
for , maxpendingrevokes)
for _, lease := range leases )
...<-c})}
})return
} }}
//server 應用提案訊息
...needresult := s.w.isregistered(id) //檢查請求是否需要響應
if needresult || !nosideeffect(&raftreq)
...}
...
switch
return ar
} l, err := a.s.lessor.grant(lease.leaseid(lc.id), lc.ttl)
resp := &pb.leasegrantresponse{}
...return resp, err
} err := a.s.lessor.revoke(lease.leaseid(lc.id))
return &pb.leaserevokeresponse, err}
1.過期鍵的發現主要通過乙個時間戳的優先順序佇列,這裡主要通過最小堆這種資料結構實現,將最小的時間戳,置於頂部,每次只需要判斷頂部元素即可。
2.過期鍵收集要在一定的範圍內,不控制每次最大的過期鍵的處理數量,如果有大量鍵同時過期,會導致 server 在一定時間內忙於處理過期鍵,而無法響應其他請求。
3.server 處理過期鍵的過程是乙個完整的提案過程。
ETCD 原始碼學習 Raft 協議介紹(二)
raft協議是分布式一致性協議的一種,所以在了解raft協議之前,我們首先要知道一致性協議的作用。1.一致性協議用於解決分布式環境下多副本之間資料一致性的問題的。2.主要包括兩個部分,一是 leader 選舉,二是日誌同步。3.一致性協議主要包括paxos zab raft及 gossip 等 le...
ETCD 原始碼學習 簡述(一)
前段時間認真學習了 etcd 原始碼實現,往後的一段時間,會陸陸續續的寫一些學習記錄。本章主要介紹 etcd 的主要幾個組成部分。ectd主要包括以下幾個部分 儲存包括兩部分組成,記憶體和磁碟。index 鍵值索引 mvcc 多版本控制 kv 原始鍵值對 mvcc 多版本控制 snaphot 資料快...
ARM下原始碼編譯etcd
可根據自己的需求將3.2.0更換對應版本 wget二 解壓編譯tar zxvf etcd 3.2.0.tar.gz cd etcd 3.2.0 build完成後會在bin目錄下生成etcd和etcdctl的可執行檔案 三 執行測試出現報錯看第四步 cd bin etcd version etcd v...