ETCD 原始碼學習 lease 二

2021-10-21 05:51:27 字數 1587 閱讀 1111

在 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...