1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Linux 日志文件系統(tǒng)原來(lái)是這樣工作的

        共 3303字,需瀏覽 7分鐘

         ·

        2020-11-13 11:18



        公眾號(hào)關(guān)注杰哥的IT之旅”,
        選擇“星標(biāo)”,重磅干貨,第一時(shí)間送達(dá)!

        文件系統(tǒng)要解決的一個(gè)關(guān)鍵問(wèn)題是怎樣防止掉電或系統(tǒng)崩潰造成數(shù)據(jù)損壞,在此類(lèi)意外事件中,導(dǎo)致文件系統(tǒng)損壞的根本原因在于寫(xiě)文件不是原子操作,因?yàn)閷?xiě)文件涉及的不僅僅是用戶數(shù)據(jù),還涉及元數(shù)據(jù)(metadata)包括 Superblock、inode bitmap、inode、data block bitmap等,所以寫(xiě)操作無(wú)法一步完成,如果其中任何一個(gè)步驟被打斷,就會(huì)造成數(shù)據(jù)的不一致或損壞。

        舉一個(gè)簡(jiǎn)化的例子,我們對(duì)一個(gè)文件進(jìn)行寫(xiě)操作,要涉及以下步驟:

        1. 從data block bitmap中分配一個(gè)數(shù)據(jù)塊;

        2. 在inode中添加指向數(shù)據(jù)塊的指針;

        3. 把用戶數(shù)據(jù)寫(xiě)入數(shù)據(jù)塊。


        • 如果步驟2完成了,3未完成,結(jié)果是數(shù)據(jù)損壞,因?yàn)樵撐募J(rèn)為數(shù)據(jù)塊是自己的,但里面的數(shù)據(jù)其實(shí)是垃圾;

        • 如果步驟2完成了,1未完成,結(jié)果是元數(shù)據(jù)不一致,因?yàn)樵撐募呀?jīng)把數(shù)據(jù)塊據(jù)為己有,然而文件系統(tǒng)卻還認(rèn)為該數(shù)據(jù)塊未分配、隨后又可能會(huì)把該數(shù)據(jù)塊分配給別的文件、造成數(shù)據(jù)覆蓋;

        • 如果步驟1完成了、2未完成,結(jié)果就是文件系統(tǒng)分配了一個(gè)數(shù)據(jù)塊,但是沒(méi)有任何文件用到這個(gè)數(shù)據(jù)塊,造成空間浪費(fèi);

        • 如果步驟3完成了,2未完成,結(jié)果就是用戶數(shù)據(jù)寫(xiě)入了硬盤(pán)數(shù)據(jù)塊中,但白寫(xiě)了,因?yàn)槲募恢肋@個(gè)數(shù)據(jù)塊是自己的。


        日志文件系統(tǒng)(Journal File System)就是為解決上述問(wèn)題而誕生的。

        它的原理是在進(jìn)行寫(xiě)操作之前,把即將進(jìn)行的各個(gè)步驟(稱(chēng)為transaction)事先記錄下來(lái),保存在文件系統(tǒng)上單獨(dú)開(kāi)辟的一塊空間上,這就是所謂的日志(journal),也被稱(chēng)為write-ahead logging,日志保存成功之后才進(jìn)行真正的寫(xiě)操作、把文件系統(tǒng)的元數(shù)據(jù)和用戶數(shù)據(jù)寫(xiě)進(jìn)硬盤(pán)(稱(chēng)為checkpoint),這樣萬(wàn)一寫(xiě)操作的過(guò)程中掉電,下次掛載文件系統(tǒng)之前把保存好的日志重新執(zhí)行一遍就行了(術(shù)語(yǔ)叫做replay),避免了前述的數(shù)據(jù)損壞場(chǎng)景。

        有人問(wèn)如果保存日志的過(guò)程中掉電怎么辦?最初始的想法是把一條日志的數(shù)據(jù)一次性寫(xiě)入硬盤(pán),相當(dāng)于一個(gè)原子操作,然而這并不可行,因?yàn)橛脖P(pán)通常以512字節(jié)為單位進(jìn)行操作,日志數(shù)據(jù)一超過(guò)512字節(jié)就不可能一次性寫(xiě)入了。所以實(shí)際上是這么做的:給每一條日志設(shè)置一個(gè)結(jié)束符,只有在日志寫(xiě)入成功之后才寫(xiě)結(jié)束符,如果一條日志沒(méi)有對(duì)應(yīng)的結(jié)束符就會(huì)被視為無(wú)效日志,直接丟棄,這樣就保證了日志里的數(shù)據(jù)是完整的。

        一條日志在它對(duì)應(yīng)的寫(xiě)操作完成之后就沒(méi)用了,占用的硬盤(pán)空間就可以釋放。保存日志的硬盤(pán)空間大小是有限的,被循環(huán)使用,所以日志也被稱(chēng)為circular log。

        至此可以總結(jié)一下日志文件系統(tǒng)的工作步驟了:

        1. Journal write : 把transaction寫(xiě)入日志中;

        2. Journal commit : 在一條日志保存好之后,寫(xiě)入結(jié)束符;

        3. Checkpoint : 進(jìn)行真正的寫(xiě)操作,把元數(shù)據(jù)(metadata)和用戶數(shù)據(jù)(user data)寫(xiě)入文件系統(tǒng);

        4. Free : 回收日志占用的硬盤(pán)空間。


        以上方式把用戶數(shù)據(jù)(user data)也記錄在日志中,稱(chēng)為Data Journaling,Linux EXT3文件系統(tǒng)就支持這種方式,這種方式存在效率問(wèn)題:

        就是每一個(gè)寫(xiě)操作涉及的元數(shù)據(jù)(metadata)和用戶數(shù)據(jù)(user data)實(shí)際上都要在硬盤(pán)上寫(xiě)兩次,一次寫(xiě)在日志里,一次寫(xiě)在文件系統(tǒng)上。元數(shù)據(jù)倒也罷了,用戶數(shù)據(jù)通常比較大,拷貝幾個(gè)GB的電影文件也要乘以2實(shí)在是降低了效率。

        一個(gè)更高效的方式是Metadata Journaling,不把用戶數(shù)據(jù)(user data)記錄在日志中,它防止數(shù)據(jù)損壞的方法是先寫(xiě)入用戶數(shù)據(jù)(user data)、再寫(xiě)日志,即在上述”Journal write”之前先寫(xiě)用戶數(shù)據(jù),這樣就保證了只要日志是有效的,那么它對(duì)應(yīng)的用戶數(shù)據(jù)也是有效的,一旦發(fā)生掉電故障,最壞的結(jié)果也就是最后一條日志沒(méi)記完,那么對(duì)應(yīng)的用戶數(shù)據(jù)也會(huì)丟,效果與Data Journaling丟棄日志一樣,重要的是文件系統(tǒng)的一致性和完整性是有保證的。

        Metadata Journaling又叫Ordered Journaling,大多數(shù)文件系統(tǒng)都采用這種方式。像Linux EXT3文件系統(tǒng)也是可以選擇Data Journaling還是Ordered Journaling的。

        參考資料:
        Crash Consistency: FSCK and Journaling

        來(lái)源:http://linuxperf.com/?p=153

        如果您覺(jué)得這篇文章對(duì)您有點(diǎn)用的話,麻煩您為本文來(lái)個(gè)四連:轉(zhuǎn)發(fā)分享、點(diǎn)贊、點(diǎn)在看、留言,因?yàn)檫@將是我寫(xiě)作與分享更多優(yōu)質(zhì)文章的最強(qiáng)動(dòng)力!


        本公眾號(hào)全部博文已整理成一個(gè)目錄,請(qǐng)?jiān)诠娞?hào)后臺(tái)回復(fù)「m」獲??!

        推薦閱讀:

        1、Linux 網(wǎng)絡(luò)狀態(tài)工具 ss 命令使用詳解
        2、一文理解 Linux 平均負(fù)載,附排查工具
        3、Linux 系統(tǒng)常用命令速查手冊(cè)
        4、Linux!為何他一人就寫(xiě)出這么強(qiáng)的系統(tǒng),中國(guó)卻做不出來(lái)?
        5、5分鐘帶你了解 Linux 常用命令全稱(chēng)!
        6、Linux 的文件系統(tǒng)及文件緩存知識(shí)點(diǎn)整理
        關(guān)注微信公眾號(hào)「杰哥的IT之旅」,后臺(tái)回復(fù)「1024」查看更多內(nèi)容,回復(fù)「加群備注:地區(qū)-職業(yè)方向-昵稱(chēng) 即可加入讀者交流群。

             
               
        點(diǎn)個(gè)[在看],是對(duì)杰哥最大的支持!
        瀏覽 20
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲欧美中文日韩在线v日本野外 | 天天操综合 | 黄色A片免费 | 欧美精品秘 日韩少妇 | 无码影音 | 99婷婷久久 | 男女插视频 | 国产欧美一区二区三区在线看蜜臀 | 色婷婷色99国产综合精品 | 国产一区亚洲 |