elasticsearch入門系列">elasticsearch入門系列
1020
2022-05-29
1.4.4日志壓縮與快照
在實際的系統中,Raft節點上的日志記錄不可能無限制地增加下去。一方面日志記錄會對節點的存儲空間造成壓力,另一方面當Raft節點重啟時需要花費大量的時間進行日志回放(replay),進而影響系統的可用性。
使用快照進行日志壓縮的方法并不少見,ZooKeeper和Chubby中都有應用。在快照系統中,系統的全部狀態都以快照的形式寫入持久化存儲,然后刪除那個時間點之前的全部日志。下文將詳細介紹Raft的快照原理。
圖1-21展示了Raft快照的基本原理,一個Raft節點從1號到5號位置的日志條目生成了一個新的快照文件。從圖1-21可以看出,Raft的快照文件具有如下特點。
每個節點獨立創建,只包含已經被提交的日志條目。
存儲了節點某一時刻復制狀態機的狀態。
全量式,非增量式的(即使數據沒有改變)。
在快照中存儲少量元數據,比如,被快照取代的最后一個日志條目的索引位置和對應的任期號。
圖1-21 Raft快照原理圖
Raft快照元數據中會存儲被快照取代的最后一個日志條目的索引位置和對應的任期號,這是為了支持快照后第一個日志條目的AppendEntries RPC一致性檢查(因為這個日志條目需要它前一個日志條目的索引值和任期號)。為了支持集群成員關系列表的更新(將在下文展開討論),快照文件也會將最后一次的配置作為最后一條日志保持。一旦Raft節點成功生成快照文件,就可以刪除最后的索引位置及其之前的所有日志和快照了。
盡管在通常情況下,Raft節點之間都是獨立創建快照的,但是Leader偶爾也需要向一些過于落后的Follower發送快照。這種情況通常發生在Leader因為做快照刪除了還未發送給Follower的日志條目的情況下。當然,其實與Leader保持同步的Follower通常不需要Leader做這個操作,需要Leader發送的對象往往是一個運行非常緩慢的Follower或者是一個新加入集群的節點。因此,通過網絡傳輸快照文件也是讓Follower盡快同步Leader狀態的一種方式。但是,當快照文件較大時,就不能忽視網絡和磁盤的開銷了。
Raft算法的InstallSnapshot RPC實現了Leader和Follower之間發送和接收快照文件的過程。當有些快照文件過大時,需要對其進行分塊傳輸。對于每個節點,領導人總是順序執行InstallSnapshot RPC,即順序發送快照分塊。
InstallSnapshot RPC的參數說明如表1-5所示。
InstallSnapshot RPC的返回值說明如表1-6所示。
接收者實現快照的步驟具體如下。
1)與前文介紹的RPC類似,如果term < currentTerm,則立刻返回currentTerm,即如果節點的當前任期號大于Leader的任期號,則拒絕該快照;否則執行步驟2)。
2)如果是第一個分塊(offset為0),則新建一個快照。
3)在指定偏移量處將分塊數據寫入快照文件,并響應Leader。
4)如果done是false,則表示快照文件尚未傳輸完成,需要繼續等待更多的數據塊。
5)當接收到的done是true時,保存該快照文件,丟棄本地的lastIncluded-Index值較小(較舊)的現存快照。
6)節點將根據快照包含的最后一條日志的索引值和任期號搜索與之匹配的日志項,如果存在,則繼續保留后面該日志項之后的日志,前面的日志項將全部刪除。
7)應用快照內容重置節點狀態機,并且加載快照文件中的集群配置信息。
以上便是關于InstallSnapshot RPC的一個簡要概述。快照分塊除了要便于傳輸之外,還可作為每個領導人的心跳包,Leader每次接收到快照分塊都需要重置一次選舉超時定時器。
1)發送快照會浪費網絡帶寬并且增加了快照處理的時延。每個Follower本地已經擁有了產生快照需要的所有信息,從本地狀態創建快照顯然比通過網絡接收別人發來的要經濟得多。
2)增加領導人實現的復雜性。例如,領導人需要在發送快照的同時并行地將新的日志條目發送給跟隨者,這樣才不會阻塞新的客戶端請求。
快照操作會對系統的性能造成一定的影響,集群管理員需要決定創建快照的時機。如果快照操作太頻繁,則會消耗大量的I/O帶寬和CPU資源。如果超過時間不做快照,那么節點存儲空間就有被日志文件耗盡的風險,而且Raft節點一旦重啟就需要回放大量日志,進而影響系統的可用性。我們推薦的解決方法是當日志達到某個固定的大小時做一次快照。
另外,一次寫入快照文件可能會消耗較長的時間,如果不希望影響正常日志條目的復制,則可以通過使用寫時復制(copy-on-write)的技術來解決。這樣就能在接受寫日志請求的同時而不影響正在被寫入的快照文件。另外,操作系統的寫時復制技術的支持(如Linux上的fork)可以被用來創建完整的狀態機內存快照。
后面的章節會專門介紹etcd的快照實現細節。
專屬分布式存儲服務 云計算
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。