NameNode?重啟恢復(fù)數(shù)據(jù)的流程詳解
NameNode 重啟恢復(fù)數(shù)據(jù)的流程
我們都知道 NameNode 中存儲(chǔ)的是分布式存儲(chǔ)系統(tǒng)的元數(shù)據(jù),在 NameNode 重啟之后,內(nèi)存的數(shù)據(jù)已經(jīng)丟失了的,所以需要重新加載數(shù)據(jù)。
這時(shí)候我們采用的方法是 FsImage 快照 + editslog 操作日志兩種結(jié)合的方法;
那它們是怎么結(jié)合的呢?換句話(huà)說(shuō),這兩種機(jī)制是通過(guò)什么聯(lián)系起來(lái)的呢??
FsImage 和 editslog 的聯(lián)系
在內(nèi)存時(shí)的標(biāo)識(shí)
FsImage 是由 editslog 經(jīng)過(guò) checkpoint 機(jī)制而得到的,也就是說(shuō)先有 editslog 再有 FsImage,那么我們來(lái)回顧一下 editslog 的組織格式:
message EditLog { int64 txId = 1; // 操作類(lèi)型 int32 opType = 2; string path = 3; map<string, string> attr = 4; }
可以看到 editslog 中是有一個(gè) txId 的屬性的,這個(gè)屬性是自增的(long 類(lèi)型,64位取值范圍非常大,理論上不會(huì)超出了的);txId 是 editslog 的唯一標(biāo)識(shí)。
txId 是在內(nèi)存中維護(hù)著的,每生成一個(gè) editslog 都會(huì)將當(dāng)前 txid 賦值給它,并將 txid + 1;這個(gè)在內(nèi)存維護(hù)的 txid 是當(dāng)前系統(tǒng)中最大的 txid 即 max_txid ,在生成 FsImage 會(huì)將系統(tǒng)中所有數(shù)據(jù)生成快照,并將當(dāng)前 max_txid 賦值給它。
我們都知道 FsImage 中有兩個(gè)重要的屬性:
public class FsImage { ...... /** * 當(dāng)前最大的txId */ private long maxTxId; /** * 內(nèi)容 */ private INode iNode; ...... }
iNode 其實(shí)就是元數(shù)據(jù),而 maxTxId 其實(shí)就是生成 FsImage 時(shí),系統(tǒng)中的 max_txid。
在磁盤(pán)中的標(biāo)識(shí)
上述我們介紹了 FsImage 和 editslog 數(shù)據(jù)在內(nèi)存中的標(biāo)識(shí),但是這兩樣數(shù)據(jù)都是需要持久化的,那么在持久化之后,怎么標(biāo)識(shí)他們呢?
我們都知道他們的數(shù)據(jù)中包含了 txid ,可是這個(gè)數(shù)據(jù)是需要加載進(jìn)內(nèi)存才能看到的。。。
為了在剛恢復(fù)數(shù)據(jù)的時(shí)候,也能看到 txid (系統(tǒng)是根據(jù) txid 來(lái)聯(lián)系 FsImage 和 editslog, 進(jìn)行數(shù)據(jù)恢復(fù)的),所以在持久化的時(shí)候,我們對(duì)這兩種文件的命名進(jìn)行了特殊的組織格式:
fsimage文件的文件名是"fsimage_txid",其中 txid 是文件系統(tǒng)狀態(tài)的事務(wù)ID
editslog 文件的文件名是類(lèi)似 “1_1000.log” 這種格式(editslog 記錄的可能是多條數(shù)據(jù))
恢復(fù)元數(shù)據(jù)的流程
- 根據(jù)指定路徑,找到 FsImage 文件的存放地點(diǎn)
- 排序,找出 txid 最大的 FsImage (即最新的 FsImage)
- 解析最新的 FsImage 數(shù)據(jù)進(jìn)內(nèi)存
- 找到 editslog,并將其排序,找出 txid 比最新 FsImage 的 txid 還大的所有 editslog 文件
- 將返回的editslog文件數(shù)據(jù)解析進(jìn)內(nèi)存
以上就是NameNode 重啟恢復(fù)數(shù)據(jù)的流程詳解的詳細(xì)內(nèi)容,更多關(guān)于NameNode 重啟恢復(fù)數(shù)據(jù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring攔截器之HandlerInterceptor使用方式
這篇文章主要介紹了Spring攔截器之HandlerInterceptor使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Java 解決讀寫(xiě)本地文件中文亂碼的問(wèn)題
這篇文章主要介紹了Java 解決讀寫(xiě)本地文件中文亂碼的問(wèn)題的相關(guān)資料,需要的朋友可以參考下2017-01-01Mybatis 動(dòng)態(tài)sql的編寫(xiě)與開(kāi)啟二級(jí)緩存
二級(jí)緩存是Mapper級(jí)別的緩存,多個(gè)SqlSession去操作同一個(gè)Mapper中的SQL語(yǔ)句,則這些SqlSession可以共享二級(jí)緩存,即二級(jí)緩存是跨SqlSession的,這篇文章主要介紹了Mybatis 動(dòng)態(tài)sql的編寫(xiě)|開(kāi)啟二級(jí)緩存,需要的朋友可以參考下2023-02-02SpringBoot在IDEA中實(shí)現(xiàn)熱部署的步驟
這篇文章主要介紹了SpringBoot在IDEA中實(shí)現(xiàn)熱部署的步驟,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-11-11Java使用wait和notify實(shí)現(xiàn)線(xiàn)程之間的通信
Java 線(xiàn)程通信是將多個(gè)獨(dú)立的線(xiàn)程個(gè)體進(jìn)行關(guān)聯(lián)處理,使得線(xiàn)程與線(xiàn)程之間能進(jìn)行相互通信,下面這篇文章主要給大家介紹了關(guān)于Java使用wait和notify實(shí)現(xiàn)線(xiàn)程之間通信的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04idea在運(yùn)行期間,實(shí)現(xiàn)讓修改的頁(yè)面實(shí)時(shí)生效
這篇文章主要介紹了idea在運(yùn)行期間,實(shí)現(xiàn)讓修改的頁(yè)面實(shí)時(shí)生效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01IntelliJ IDEA的數(shù)據(jù)庫(kù)管理工具實(shí)在太方便了(推薦)
這篇文章主要介紹了IntelliJ IDEA的數(shù)據(jù)庫(kù)管理工具實(shí)在太方便了,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09