【部落格383】etcd儲存結構

想成為大程式設計師的小程式設計師發表於2020-10-06

內容:記錄etcd的儲存結構

etcd框架:
在這裡插入圖片描述
模組解析:

etcd server:對外接收客戶端的請求,對應etcd程式碼中的etcdserver目錄,其中還有一個
raft.go的模組與etcd-raft庫進行通訊。etcdserver中與儲存相關的模組是applierV3,
這裡封裝了V3版本的資料儲存,WAL(write ahead log),用於寫資料日誌,etcd啟動時
會根據這部分內容進行恢復。

etcd raft:etcd的raft庫,前面的文章已經具體分析過這部分程式碼。除了與本節點的etcd
server通訊之外,還與叢集中的其他etcd server進行互動做一致性資料同步的工作

etcd的資料處理步驟:

一個請求與一個etcd叢集互動的主要流程分為兩大部分:

1.	寫資料到某個etcd server中。
2.	該etcd server與叢集中的其他etcd節點進行互動,當確保資料已被儲存之後應答客戶端。

請求流程劃分為了以下的子步驟:
•	1.1:etcd server收到客戶端請求。
•	1.2:etcd server將請求傳送給本模組的raft.go,它負責與etcd raft模組進行通訊。
•	1.3:raft.go將資料封裝成raft日誌的形式提交給raft模組。
•	1.4:raft模組會首先儲存到raftLog的unstable儲存部分。
•	1.5:raft模組通過raft協議與叢集中其他etcd節點進行互動。

注意:
如果寫入資料的etcd是leader節點,則直接在leader節點處理提交的資料。
如果提交資料到非leader節點的話需要路由到etcd leader節點去。

而應答步驟如下:
•	2.1:叢集中其他節點向leader節點應答接收這條日誌資料。
•	2.2:當超過叢集半數以上節點應答接收這條日誌資料時,etcd raft通過Ready結構體
         通知etcd server中的raft該日誌資料已經commit。
•	2.3:raft.go收到Ready資料將首先將這條日誌寫入到WAL模組中。
•	2.4:通知最上層的etcd server該日誌已經commit。
•	2.5:etcd server呼叫applierV3模組將日誌寫入持久化儲存中。
•	2.6:etcd server應答客戶端該資料寫入成功。
•	2.7:最後etcd server呼叫etcd raft,修改其raftLog模組的資料,將這條日誌寫入到
         raftLog的storage中。

注意:

•	etcd raft模組在應答某條日誌資料已經commit之後,是首先寫入到WAL模組中的,
    因為這個模組只是新增一條日誌,所以速度會很快,即使在後面applierV3寫入失敗,
    重啟的時候也可以根據WAL模組中的日誌資料進行恢復。
    
•	etcd raft中的raftLog,按照前面文章的分析,其中的資料是儲存到記憶體中的,
    重啟即失效,上層應用真實的資料是持久化儲存到WAL和applierV3中的。

相關文章