天天看點

深入淺出檔案系統中的日志系統功能

1.日志系統出現的背景

日志系統出現在20世紀末。最早的日志檔案系統出現在1990年IBM的JFS(journal file system)上。1994年,為了更好地支援高性能,SilliconGraphics引進了XFS。從20011年開始,linux系統中就開始支援ext3fs。到了今天,ext4fs、Reiser4、ceph等檔案系統都支援了日志系統。

2.日志系統的功能

日志檔案系統的功能主要是為了提高檔案系統的一緻性和性能。

2.1一緻性

通過日志系統記錄寫操作,避免異常關機、掉電等造成檔案系統中中繼資料和檔案資料的不一緻,檔案系統重新開機後能通過重放之前未完成的操作來實作一緻性。

2.1性能

在當代的檔案系統設計中,利用快速的日志裝置來提高檔案寫操作的速度,比如SSD以及一些非易失性記憶體,都可以用來當作日志裝置。此外,還可以在日志系統層次進行寫合并等優化。

3.日志系統的原理

3.1日志系統避免檔案系統崩潰的原理

在系統異常掉電、關機或者重新開機的情況下,很可能出現儲存設備上 的使用者檔案資料和檔案索引、記錄等中繼資料不一緻的情況。針對這一問題,傳統的Linux系統通過在開機時用fsck指令來檢查中繼資料和使用者檔案資料是否一緻。如果一緻,可以認為檔案系統完整無損;否則,需要定位是哪一塊裝置造成這一現象,随之進行恢複。如果fsck也不能恢複,可能需要進入單使用者模式手動進行恢複。有了日志系統之後,寫入的raw data先到了獨立于檔案系統的日志裝置或者資源上,隻有當檔案data寫入到了檔案系統磁盤或者日志裝置之後,檔案系統最後才會把raw data寫入到檔案系統磁盤裡面去。這樣就能保證檔案系統對應的磁盤裡的raw data和data的一緻性。

根據寫檔案資料和中繼資料的先後順序,日志檔案系統可以分為下面幾種:

Type

Wring file data to Log

Writing raw data to Log

comments

Write-back

Second step:

N, to disk

First step: Y

May crash when system crash before writing to disk

Ordered

First step: N, to disk

Second step: Y

Keep coherence

Data

Firste step: Y

Affect performance

日志系統上會記錄一條條待送出的寫操作,根據每次送出記錄的數目和日志裝置是否滿的狀況,又可以分成下面幾種方式:

Sub-type

Comments

One record per commit

Quickly sync between log and disk, worse performance

Several records per commit

Commit when log is full

Slowly sync between log and disk, better performance

Commit when log isn't full

由于日志裝置上記錄的資料是非易失性的,系統重新開機後檔案系統的初始化過程中會把日志裝置上記錄的、尚未寫到檔案系統盤上的raw data乃至檔案資料寫到檔案系統盤。這個過程就像把之前記錄的寫操作一個個複現,也叫做重放或者重演。

3.2日志檔案系統加速檔案寫操作的原理

日志對寫操作的優化來自于日志裝置較之于普通檔案系統磁盤寫操作快得多的速度。兩種裝置寫操作的速度差異越大,日志系統對寫操作的性能提升就越多。和不用快速裝置做log device的檔案系統相比,每一次IO寫操作,這種方案能節省的時間是之前一次檔案系統盤寫的時間減去一次log device寫的時間。

當檔案系統把中繼資料乃至檔案資料寫到日志裝置後,就可以向上級傳回寫操作完成。此時,雖然資料還沒有真正落到檔案系統盤,但是背景會有線程或者類似機制把log device上的資料自動送出到檔案系統盤上去。是以,日志檔案系統隻是盡快迅速地把寫請求傳回,以提高性能。代價就是中繼資料乃至檔案資料在日志裝置上額外的寫操作。

4.日志系統舉例

4.1 ZFS

ZFS檔案系統中的ZIL層對日志功能的支援非常靈活,既提供了CLI來指定用作日志功能的裝置,又提供了參數來配置同步政策。ZFS中關于日志功能的最主要的操作有三個:

zil_commit 往日志裝置添加記錄

當寫操作建立好transaction并把它放到目标裝置的操作隊列之後,會直接調用zil_commit操作,把log record寫到日志裝置上去,也就是把記憶體中的metadata乃至data寫到ZIL的日志裝置上去。

zil_sync 從日志裝置删除記錄

當目标裝置上的某個transaction完成之後,會通過zil_sync從ZIL log device上找到transaction number一緻的log record,把它從日志裝置中删除。

zil_replay 重新開機時重放ZIL log

當ZFS檔案系統重新起來之後,如果發現ZIL log device上還有沒有log record,就把它zil_sync到磁盤。

由于ZIL的log device也是基于ZFS裡的邏輯裝置,是以理論上它也能夠實作對log device上資料的checksum乃至壓縮。此外,它還支援重複寫操作的合并。

4.2 ext3fs

Ext3差別于ext2的最主要特性就在于引進了日志功能,嫩夠記錄metadata,是以提供了更好的一緻性。當然,由于ext3的日志裝置也是普通的磁盤裝置,對性能的影響很大。

4.3 ext4fs

ext4檔案系統通過在磁盤上保留一段小的連續區域(預設128MB)作為JBD。被送出的資料一份記錄也被寫到日志。一旦資料事務完全寫到磁盤,将其從JBD中刷出。這樣保證日志在擦除送出記錄前将事務寫到它們在磁盤上的最終位置(可能包含大量的尋道或者大量的讀-寫-擦除)。從一緻性方面考慮,Ext4預設直接将檔案系統中繼資料寫到日志,而沒有同時寫檔案資料到JBD2,因而不能提供最強的檔案資料塊的一緻性。ext4fs日志檔案在檔案系統中是普通檔案,通常隐藏不可見。日志檔案消耗完整的塊組,通過mke2fs可以将日志檔案放在磁盤的中間。

此外,在ext3fs檔案系統日志機制的基礎上,ext4fs添加了對日志内容的checksum,這樣對資料的一緻性和正确性有了更多更及時的保護。

4.4 ReiserFS

ReiserFS 是從一開始就按照記錄日志的意圖而開發的日志檔案系統。ReiserFS 于 2001 年被引進到主流 2.4 核心(Linux 采用的第一個日志檔案系統)。其預設的日志記錄方法為預定,且支援以線上調整大小的方式擴充檔案系統。

4.5 ceph

ceph檔案系統日志基于ceph OSD的關鍵組成部分,能提高存儲系統的一緻性和性能。ceph檔案系統裡能夠指定同步日志和檔案系統盤的時間間隔,當間隔時間到,ceph OSD daemon會停止寫操作,把所有日志系統上記錄的寫操作重放到磁盤上去。這樣就保證了檔案系統的一緻性。此外,Ceph能将小的随機IO順序地寫入日志,讓後端檔案系統有更多時間來合并IO,提升系統的突發負載能力。美中不足的是,這可能帶來劇烈的性能抖動,表現為一段時間内的高速寫入,而之後一段時間内沒有任何寫入直至直至日志裝置又有空閑空間能夠啟用。

4.6 GFS

GFS是Google設計的一個可擴充的分布式檔案系統。GFS日志系統包含了對中繼資料所作的修改的曆史記錄。它作為邏輯時間線定義了并發操作的執行順序。檔案、塊以及它們的版本号都由它們被建立時的邏輯時間而唯一地、永久地被辨別。由于GFS是分布式檔案系統,是以隻有記錄檔複制到數個遠端的機器上,并且确實寫到本地和遠端的磁盤上之後才回答使用者的請求。

在一緻性方面,GFS Master節點同樣可以用記錄檔來恢複它的檔案系統的狀态。但為了将啟動時間減至最小,日志就必須要比較小。每當日志的長度增長到超過一定的規模後,master就要檢查它的狀态,它可以從本地磁盤裝入最近的檢查點來恢複狀态。

4.7 JFS

( JOURNAL FILE SYSTEM)一種位元組級日志檔案系統,借鑒了資料庫保護系統的技術,以日志的形式記錄檔案的變化。JFS通過記錄檔案結構而不是資料本身的變化來保證資料的完整性。這種方式可以確定在任何時刻都能維護資料的可通路性。

需要注意的是:JFS隻記錄中繼資料上的操作,是以,重放這些日志隻能恢複檔案系統中結構關系和資源配置設定狀态的一緻性。它沒有記錄檔案資料,也沒有将這些資料恢複到一緻狀态。是以,恢複後某些檔案資料可能丢失或失效,對資料一緻性有關鍵性需求的使用者應該使用同步I/O。

如果媒介出錯,日志記錄不是特别有效。特别地,在将日志或中繼資料寫入磁盤的期間發生的I/O錯誤,意味着在系統崩潰後,要将檔案系統恢複到一緻狀态,需要耗時并且有可能強加的全面完整性檢查。

JFS日志記錄的語義如下:當涉及中繼資料更改的檔案系統操作--例如,unlink()--傳回成功執行的傳回碼時,操作的結果已經送出到檔案系統,即使系統崩潰了也可以發現。例如,一旦成功删除了檔案,即使系統崩潰然後重新開機,它仍然是删除的并且不會再重新出現。

與其它日志檔案系統相比,JFS沒有提供寫合并,在性能上處于劣勢。其它日志檔案系統,如Veritas VxFS 和Transarc Episode,使用不同的日志風格并且緩慢地将日志資料寫入磁盤。在執行多個并行操作的伺服器環境中,通過将多個同步寫操作組合成單一寫操作的組送出來減少這種性能損失。JFS日志記錄風格随着時間推移而得到不斷改進,現在提供了異步日志記錄,異步日志記錄提高了檔案系統的性能。

4.8 XFS

XFS一種高性能的日志檔案系統,最早于1993年,由Silicon Graphics為他們的IRIX作業系統而開發,是IRIX 5.3版的預設檔案系統。2000年5月,Silicon Graphics以GNU通用公共許可證釋出這套系統的源代碼,之後被移植到Linux核心上。XFS特别擅長處理大檔案,同時提供平滑的資料傳輸。

當檔案系統更新時,中繼資料會在實際的磁盤塊被更新之前順序寫入日志。XFS的日志被儲存在磁盤塊的循環緩沖區上,不會被正常的檔案系統操作影響。XFS日志大小的上限是64k個塊和128MB中的較大值,下限取決于已存在的檔案系統和目錄的塊的大小。在外置裝置上部署日志會浪費超過最大日志大小的空間。XFS日志也可以被存在檔案系統的資料區(稱為内置日志),或者一個額外的裝置上(以減少磁盤操作)。XFS的日志儲存的是在更高層次上描述已進行的操作的“邏輯”實體。相比之下,“實體”日志存儲每次事務中被修改的塊。為了保證性能,日志的更新是異步進行的

5.日志檔案系統發展想法

現在nvme、3D-Xpoint等新型技術和硬體的出現和推廣,既對檔案系統中日志系統的設計提出了心的要求和挑戰,比如如何充分利用新技術和硬體的特性,更好地日志系統的組織結構、工作機制,以充分提高性能;同時,又為新的日志系統的設計提供了更多的日志裝置的硬體選擇空間。

6.參考文檔和引用連結

1.http://blog.sina.com.cn/s/blog_701bb13a0100n9k6.html

2.http://www.cnblogs.com/vamei/p/3506566.html

3.http://blog.csdn.net/lzw06061139/article/details/51169117

4.http://baike.baidu.com/link?url=TzCHwaidRBo8WzT772s7zeiqf4imd40zuZoMmOtVBuDtRFDmjDjZzF60bJPXWggeUy6OGGKVl9NGqDIWnmkJXYhfPdwXJ8ezMaI8LMh7DBS

5.http://blog.sina.com.cn/s/blog_573860a90101032h.html

6.http://blog.chinaunix.net/uid-25052030-id-2236173.html

7.http://www.cnblogs.com/wuchanming/p/3737761.html

8.http://baike.baidu.com/link?url=vZxSHOgtyXlCtkTtQyoiCZoTnsZvyMHjC2G_JLK8hTWnaP_8K-yQBndcLlUtIZTW260sumi2AOwm8_GUIo0WI_

9.http://baike.baidu.com/view/1494218.htm

本文轉自存儲之廚51CTO部落格,原文連結:http://blog.51cto.com/xiamachao/1843607 ,如需轉載請自行聯系原作者