大綱
1、日志式文件系統(tǒng)
2、ext3的優(yōu)點(diǎn)
3、ext3的三種日志模式
4、選擇日志模式
1、日志式文件系統(tǒng)
通常在系統(tǒng)運(yùn)行中寫入文件內(nèi)容的同時(shí),并沒有寫入文件的元數(shù)據(jù)(如權(quán)限、所有者及創(chuàng)建和訪問時(shí)間),如果在寫入文件內(nèi)容之后與寫入文件元數(shù)據(jù)之前的時(shí)間差里,系統(tǒng)非正常關(guān)閉,處于寫入過程中的文件系統(tǒng)會(huì)非正常卸載,那么文件系統(tǒng)就會(huì)處于不一致的狀態(tài)。當(dāng)重新啟動(dòng)時(shí),Linux會(huì)運(yùn)行fsck程序,掃描整個(gè)文件系統(tǒng),保證所有的文件塊都被正確地分配或使用,找到被損壞的目錄項(xiàng)并試圖修復(fù)它。但是,fsck不保證一定能夠修復(fù)損壞。出現(xiàn)這種情況時(shí),文件中不一致的元數(shù)據(jù)會(huì)填滿已丟失文件的空間,目錄項(xiàng)中的文件項(xiàng)可能會(huì)丟失,也就造成文件的丟失。
為了盡量減少文件系統(tǒng)的不一致性,縮短操作系統(tǒng)的啟動(dòng)時(shí)間,文件系統(tǒng)需追蹤引起系統(tǒng)改變的記錄,這些記錄存放在與文件系統(tǒng)相分離的地方,通常我們叫“日志”。一旦這些日志記錄被安全地寫入,日志文件系統(tǒng)就可以應(yīng)用它們清除引起系統(tǒng)改變的記錄,并將它們組成一個(gè)引起文件系統(tǒng)改變的集,將它們放在數(shù)據(jù)庫的事務(wù)處理中,保持在狀態(tài)下有效數(shù)據(jù)的正常運(yùn)行,不與整個(gè)系統(tǒng)的性能發(fā)生沖突。在任何系統(tǒng)發(fā)生崩潰或需要重新啟動(dòng)時(shí),數(shù)據(jù)就遵從日志文件中的信息記錄進(jìn)行恢復(fù)。由于日志文件中有定期的檢查點(diǎn),通常非常整齊。文件系統(tǒng)的設(shè)計(jì)主要考慮效率和性能方面的問題。
Linux可以支持許多日志文件系統(tǒng),包括FAT、VFAT、HPFS(OS/2)、NTFS(Windows NT)、UFS、XFS、JFS、ReiserFS、ext2、ext3等。
2、ext3的優(yōu)點(diǎn)
為什么你需要從ext2遷移到ext3呢?以下有四個(gè)主要原因:可用性、數(shù)據(jù)完整性、速度、易于遷移。
可用性
在非正常當(dāng)機(jī)后(停電、系統(tǒng)崩潰),只有在通過e2fsck進(jìn)行一致性校驗(yàn)后,ext2文件系統(tǒng)才能被裝載使用。運(yùn)行e2fsck的時(shí)間主要取決于 ext2文件系統(tǒng)的大小。校驗(yàn)稍大一些的文件系統(tǒng)(幾十GB)需要很長時(shí)間。如果文件系統(tǒng)上的文件數(shù)量多,校驗(yàn)的時(shí)間則更長。校驗(yàn)幾百個(gè)GB的文件系統(tǒng)可能需要一個(gè)小時(shí)或更長。這極大地限制了可用性。相比之下,除非發(fā)生硬件故障,即使非正常關(guān)機(jī),ext3也不需要文件系統(tǒng)校驗(yàn)。這是因?yàn)閿?shù)據(jù)是以文件系統(tǒng)始終保持一致方式寫入磁盤的。在非正常關(guān)機(jī)后,恢復(fù)ext3文件系統(tǒng)的時(shí)間不依賴于文件系統(tǒng)的大小或文件數(shù)量,而依賴于維護(hù)一致性所需“日志”的大小。使用缺省日志設(shè)置,恢復(fù)時(shí)間僅需一秒(依賴于硬件速度)。
數(shù)據(jù)完整性
使用ext3 文件系統(tǒng),在非正常關(guān)機(jī)時(shí),數(shù)據(jù)完整性能得到可靠的保障。你可以選擇數(shù)據(jù)保護(hù)的類型和級(jí)別。你可以選擇保證文件系統(tǒng)一致,但是允許文件系統(tǒng)上的數(shù)據(jù)在非正常關(guān)機(jī)時(shí)受損;這是可以在某些狀況下提高一些速度(但非所有狀況)。你也可以選擇保持?jǐn)?shù)據(jù)的可靠性與文件系統(tǒng)一致;這意味著在當(dāng)機(jī)后,你不會(huì)在新近寫入的 文件中看到任何數(shù)據(jù)垃圾。這個(gè)保持?jǐn)?shù)據(jù)的可靠性與文件系統(tǒng)一致的安全的選擇是缺省設(shè)置。
速度
盡管ext3寫入數(shù)據(jù)的次數(shù)多于ext2,但是ext3常??煊趀xt2(高數(shù)據(jù)流)。這是因?yàn)閑xt3的日志功能優(yōu)化硬盤磁頭的轉(zhuǎn)動(dòng)。你可以從3種日志模式中選擇1種來優(yōu)化速度,有選擇地犧牲一些數(shù)據(jù)完整性。第 一種模式,data=writeback,有限地保證數(shù)據(jù)完整,允許舊數(shù)據(jù)在當(dāng)機(jī)后存在于文件當(dāng)中。這種模式可以在某些情況下提高速度。(在多數(shù)日志文件 系統(tǒng)中,這種模式是缺省設(shè)置。這種模式為ext2文件系統(tǒng)提供有限的數(shù)據(jù)完整性,更多的是為了避免系統(tǒng)啟動(dòng)時(shí)的長時(shí)間的文件系統(tǒng)校驗(yàn))第二種模式 ,data = orderd(缺省模式),保持?jǐn)?shù)據(jù)的可靠性與文件系統(tǒng)一致;這意味著在當(dāng)機(jī)后,你不會(huì)在新近寫入的文件中看到任何垃圾數(shù)據(jù)。第三種模式,data=journal,需要大一些的日志以保證在多數(shù)情況下獲得適中的速度。在當(dāng)機(jī)后需要恢復(fù)的時(shí)間也長一些。但是在某些數(shù)據(jù)庫操作時(shí)速度會(huì)快一些。在通常情況下,建議使用缺省模式。如果需要改變模式,請(qǐng)?jiān)?etc/fstab文件中,為相應(yīng)的文件系統(tǒng)加上data=模式的選項(xiàng)。詳情可參看mount命令的man page在線手冊(cè)(執(zhí)行man mount)。
易于遷移
你可以不重新格式化硬盤,并且很方便的從ext2遷移至ext3而享受可靠的日志文件系統(tǒng)的好處。對(duì),不需要做長時(shí)間的、枯燥的、有可能失誤的“備份-重新格式化-恢復(fù)”操作,就可以體驗(yàn)ext3的優(yōu)點(diǎn)。有兩種遷移的方法:
如果你升級(jí)你的系統(tǒng),Red Hat Linux安裝程序會(huì)協(xié)助遷移。需要你做的工作 就是為每一個(gè)文件系統(tǒng)按一下選擇按鈕。
使用tune2fs程序可以為現(xiàn)存的ext2文件系統(tǒng)增加日志功能。如果文件系統(tǒng)在轉(zhuǎn)換的過程已經(jīng)被裝載了(mount),那么在root目錄下會(huì)出現(xiàn)文 件”.journal”;如果文件系統(tǒng)沒有被裝載,那么文件系統(tǒng)中不會(huì)出現(xiàn)該文件。轉(zhuǎn)換文件系統(tǒng),只需要運(yùn)行tune2fs –j /dev/hda1(或者你要轉(zhuǎn)換的文件系統(tǒng)所在的任何設(shè)備名稱),同時(shí)把文件/etc/fstab中的ext2修改為ext3。如果你要轉(zhuǎn)換自己的根文 件系統(tǒng),你必須使用initrd引導(dǎo)啟動(dòng)。參照mkinitrd的手冊(cè)描述運(yùn)行程序,同時(shí)確認(rèn)自己的LILO或GRUB配置中裝載了initrd(如果沒有成功,系統(tǒng)仍然能啟動(dòng),但是根文件系統(tǒng)會(huì)以ext2形式裝載,而不是ext3,你可以使用命令cat /proc/mounts 來確認(rèn)這一點(diǎn)。)詳情可參看tune2fs命令的man page在線手冊(cè)(執(zhí)行man tune2fs)。
3、ext3的三種日志模式
ext3提供多種日志模式,即無論改變文件系統(tǒng)的元數(shù)據(jù),還是改變文件系統(tǒng)的數(shù)據(jù)(包括文件自身的改變),ext3 文件系統(tǒng)均可支持,以下是在/etc/fstab文件引導(dǎo)時(shí)激活的三種不同日志模式:
data=journal日志模式
日志中記錄包括所有改變文件系統(tǒng)的數(shù)據(jù)和元數(shù)據(jù)。它是三種ext3日志模式中最慢的,但它將發(fā)生錯(cuò)誤的可能性降至最小。使用“data=journal”模式要求ext3將每個(gè)變化寫入文件系統(tǒng)2次、寫入日志1次,這將降低文件系統(tǒng)的總性能。所有新數(shù)據(jù)首先被寫入日志,然后才被定位。意外發(fā)生過后,日志可以被重放,將數(shù)據(jù)與元數(shù)據(jù)帶回一致狀態(tài)。由于記錄了在ext3中元數(shù)據(jù)和數(shù)據(jù)更新情況,當(dāng)一個(gè)系統(tǒng)重新啟動(dòng)的時(shí)候,這些日志將起作用。
data=ordered日志模式 (默認(rèn))
僅記錄改變文件系統(tǒng)的元數(shù)據(jù),且溢出文件數(shù)據(jù)要補(bǔ)充到磁盤中。這是缺省的ext3日志模式。這種模式降低了在寫入文件系統(tǒng)和寫入日志之間的冗余,因此速度較快,雖然文件數(shù)據(jù)的變化情況并不被記錄在日志中,但它們必須做,而且由ext3的daemon程序在與之相關(guān)的文件系統(tǒng)元數(shù)據(jù)變化前執(zhí)行,即在記錄元數(shù)據(jù)前要修改文件系統(tǒng)數(shù)據(jù),這將稍微降低系統(tǒng)的性能(速度),然而可確保文件系統(tǒng)中的文件數(shù)據(jù)與相應(yīng)文件系統(tǒng)的元數(shù)據(jù)同步。
data=writeback日志模式
僅記錄改變文件系統(tǒng)的元數(shù)據(jù),但根據(jù)標(biāo)準(zhǔn)文件系統(tǒng),寫程序仍要將文件數(shù)據(jù)的變化記錄在磁盤上,以保持文件系統(tǒng)一致性。這是速度最快的ext3日志模式。因?yàn)樗挥涗浽獢?shù)據(jù)的變化,而不需等待與文件數(shù)據(jù)相關(guān)的更新如文件大小、目錄信息等情況,對(duì)文件數(shù)據(jù)的更新與記錄元數(shù)據(jù)變化可以不同步,即ext3是支持異步的日志。缺陷是當(dāng)系統(tǒng)關(guān)閉時(shí),更新的數(shù)據(jù)因不能被寫入磁盤而出現(xiàn)矛盾,這一點(diǎn)目前尚不能很好解決。
不同日志模式間有差別,但設(shè)置的方法一樣方便??梢允褂胑xt3文件系統(tǒng)指定日志模式,由/etc/fstab啟動(dòng)時(shí)完成。例如,選擇data=writeback日志模式,可以做如下設(shè)置:
/dev/hda5 /opt ext3 data=writeback 1 0
在一般情況下,data=ordered日志模式是ext3文件系統(tǒng)的缺省模式。
要指定日志方式,可以使用如下方式:
1 向/etc/fstab的選項(xiàng)字段添加適當(dāng)?shù)淖址?data=journal
# /dev/sda3 /var ext3 defaults,data=writeback 1 2
2 在調(diào)用 mount 時(shí)直接指定 -o data=journal 命令行選項(xiàng)。
# mount -o data=journal /dev/sdb1 /mnt
如果我們想要查看某一個(gè)文件系統(tǒng)的日志方式應(yīng)該怎么查詢,這里可以通過dmesg 命令:
# dmesg | grep -B 1 "mounted filesystem"
kjournald starting. Commit interval 5 seconds
EXT3-fs: mounted filesystem with ordered data mode.
--
EXT3 FS on sda1, internal journal
EXT3-fs: mounted filesystem with ordered data mode.
--
EXT3 FS on sdb1, internal journal
EXT3-fs: mounted filesystem with journal data mode.
--
EXT3 FS on sdb1, internal journal
EXT3-fs: mounted filesystem with writeback data mode.
4、選擇日志模式
速度
在一些典型的情況下,使用選項(xiàng)data=writeback可以顯著地提高速度,但是同時(shí)會(huì)降低對(duì)數(shù)據(jù)一致性的保護(hù)。在這些情況下,數(shù)據(jù)一致性的保護(hù)基本上與ext2文件系統(tǒng)相同,不同的是在正常操作時(shí),系統(tǒng)不斷地維護(hù)文件系統(tǒng)的完整性(這是其它日志文件系統(tǒng)使用的日志模式)。這包括頻繁的共享寫操作,還包括頻繁地創(chuàng)建和刪除大量的小文件,例如發(fā)送大量的小電子郵件信息。如果你從ext2切換到ext3,發(fā)現(xiàn)應(yīng)用程序性能大幅度下降,選項(xiàng)data=writeback可能會(huì)對(duì)你提高性能有幫助。即使你沒有獲得昂貴的數(shù)據(jù)一致性保護(hù)措施,你仍然可以享受ext3的好處(文件系統(tǒng)總是保持一致)。Red Hat還在做工作,以提高ext3某些方面的性能,所以ext3的某些方面性能在將來可以獲得改善。這也意味著即使你現(xiàn)在選擇了data=writeback,你也需要以data=journal的缺省值重新測試將來的版本,來確定新版本的改變是否與自己的工作有關(guān)。
數(shù)據(jù)完整性
在大多數(shù)情況下,用戶都是在文件的末尾寫入數(shù)據(jù)。僅僅在某些情況下(例如數(shù)據(jù)庫),用戶在現(xiàn)存文件的中間寫入數(shù)據(jù)。甚至覆蓋現(xiàn)存文件的操作,是通過先截?cái)嘣撐募缓笤購奈募┪矊懭霐?shù)據(jù)來實(shí)現(xiàn)的。在data=ordered模式中,如果正在寫文件時(shí)系統(tǒng)崩潰,那么數(shù)據(jù)塊可能被部分改寫,但是寫入過程并沒有完成,所以系統(tǒng)存在不屬于任何文件的不完整數(shù)據(jù)塊。在data=ordered模式中,崩潰后殘存無序數(shù)據(jù)塊的唯一情況是在崩潰過程中一個(gè)程序正在重寫某個(gè)文件。在這種情況下,無法絕對(duì)保證寫入順序,除非該程序使用了fsync()和O_SYNC強(qiáng)制寫操作按特定順序進(jìn)行。
ext3文件系統(tǒng)還涉及到如何cache中的數(shù)據(jù)刷到硬盤上。它是通過kupdate進(jìn)程來實(shí)現(xiàn)定期刷的,默認(rèn)是5秒檢查一次,將超過30秒的臟數(shù)據(jù)刷到硬盤。
在as 3.0中可以通過修改/proc/sys/vm/bdflush來達(dá)到目的。而在as 4.0中可以通過修改/proc/sys/vm/dirty_writeback_centisecs和/proc/sys/vm/dirty_expire_centisecs來達(dá)到目的。
由于默認(rèn)是ordered模式,在這種模式下面,如果一個(gè)IO先寫數(shù)據(jù)文件,然后再寫日志文件。假如說在寫完數(shù)據(jù)文件之后,寫日志文件之前時(shí),系統(tǒng)發(fā)生crashed,則這部分?jǐn)?shù)據(jù)將會(huì)丟失,這在數(shù)據(jù)庫是絕對(duì)不允許的,不管是Oracle還是MySQL。所以對(duì)數(shù)據(jù)庫的寫來說,每一次寫操作都會(huì)先寫到pagecache中,然后通知kernelthread 將這個(gè)buffers刷到硬盤,然后再將元數(shù)據(jù)寫日志,最后才返回寫成功的操作。這樣對(duì)數(shù)據(jù)庫來說寫操作是明顯不如寫祼設(shè)備快。
所以說在采用Ext3跑數(shù)據(jù)庫的情況下,將日志模式設(shè)為journal模式,性能反而應(yīng)該會(huì)有所提升(沒有測試過,理論上分析應(yīng)該 是這樣)。 因?yàn)樵趈ournal模式下數(shù)據(jù)庫一個(gè)寫操作,先是直接將數(shù)據(jù)和文件系統(tǒng)的變化寫到日志中(繞開cache直接寫,性能較好),然后將數(shù)據(jù)寫到cache 中,接著由kupdate進(jìn)程將數(shù)據(jù)刷新到硬盤上。 相比之下,對(duì)DB來講,它的性能應(yīng)該比前面一種要快。
另外這里還提一下MySQL中的sync_binlog這個(gè)參數(shù)。如果將這個(gè)參數(shù)設(shè)為1,也就是說每次寫binlog文件將同時(shí)刷到硬盤上面去,就 像Oracle的寫IO一樣。如果將這個(gè)參數(shù)關(guān)閉,則它交給OS來管理,也就是每5秒檢查一次,發(fā)現(xiàn)有30秒以前的老數(shù)據(jù)則刷到硬盤上。 innodb_flush_log_at_trx_commit參數(shù)來也涉及到刷硬盤的問題。
ext3作為ext2的增強(qiáng)版,和ext2使用的superblock、inode、group descriptor等數(shù)據(jù)結(jié)構(gòu)幾乎一模一樣,所以ext3前向兼容ext2。在不用備份ext2文件系統(tǒng)數(shù)據(jù)的情況下,可以用:
1
# tune2fs –j/dev/sd1
在不用卸載分區(qū)的狀態(tài)下直接將ext2文件系統(tǒng)轉(zhuǎn)換成ext3文件系統(tǒng)。
假如說,我們?cè)诰庉嬑募r(shí),突然停電了、或系統(tǒng)被鎖定被迫得重啟,會(huì)出現(xiàn)什么后果?輕則文件丟失部分內(nèi)容,重則整個(gè)文件內(nèi)容混亂,更有甚者文件系統(tǒng)直接崩潰。這將會(huì)是多么可怕的一件事兒。在linux正常關(guān)機(jī)時(shí)我們都會(huì)看到一條卸載文件系統(tǒng)的打印信息,而非正常關(guān)機(jī)會(huì)導(dǎo)致文件系統(tǒng)出現(xiàn)不一致,在系統(tǒng)重新啟動(dòng)階段掛文件系統(tǒng)時(shí)會(huì)發(fā)現(xiàn)這種不一致,然后它便會(huì)嘗試去修復(fù)它。不幸的是,隨著存儲(chǔ)設(shè)備容量的增大,這種修復(fù)工作所花費(fèi)的時(shí)間越來越無法讓人容忍。
Ext3的最大特性就是在ext2的基礎(chǔ)上增加了日志功能,所以ext3文件系統(tǒng)也經(jīng)常被人們稱之為日志文件系統(tǒng),但日志文件系統(tǒng)覺不僅僅只有ext3,還有諸如JFS、reiserFS和XFS,以及我們?cè)赪indows上經(jīng)常見到的NTFS等。
Ext3的日志特性主要是依靠其下層一個(gè)名為“日志塊設(shè)備層”的中間設(shè)備來完成,叫做JBD(Journaling Block Device layer 簡稱JBD)。JBD并不是文件系統(tǒng)規(guī)范的一部分,它和ext3文件系統(tǒng)的規(guī)范是沒有任何的關(guān)系的,而JBD正是文件系統(tǒng)事務(wù)處理功能的實(shí)現(xiàn)基礎(chǔ)。簡而言之,JBD 被設(shè)計(jì)成在任何塊設(shè)備上實(shí)現(xiàn)日志的特殊目的(越說越抽象,事務(wù)是個(gè)啥玩意兒啊⊙﹏⊙….)
關(guān)于事務(wù),有過數(shù)據(jù)庫開發(fā)經(jīng)驗(yàn)或者做數(shù)據(jù)運(yùn)維的同學(xué)肯定不會(huì)陌生。這里咱不就結(jié)概念,也不拘泥學(xué)術(shù)定義,大家只要知道事務(wù)的主要作用就是為了保證操作的原子性。這句話如何理解?比如說,在金融系統(tǒng)中,要從賬戶A轉(zhuǎn)賬X元到賬戶B。這一業(yè)務(wù)必須要確保從A賬戶成功劃出了X元,然后往B賬戶成功增加了X元。只有這兩個(gè)操作同時(shí)成功才能任務(wù)是轉(zhuǎn)賬成功,任何一個(gè)操作失敗該業(yè)務(wù)必須終止。假如從A賬戶轉(zhuǎn)出X元成功,當(dāng)往B賬戶寫入時(shí)出現(xiàn)了錯(cuò)誤,那么從A賬戶轉(zhuǎn)出的X元必須被退還到A賬戶。更極端的情況是,此時(shí)A賬戶所在的數(shù)據(jù)由于種種原因又崩潰了,那么數(shù)據(jù)庫的事務(wù)機(jī)制必須保證A賬戶的X元不會(huì)丟失。這就是數(shù)據(jù)庫業(yè)務(wù)操作的原子性。在日志文件系統(tǒng)中這種對(duì)文件數(shù)據(jù)操作的原子性是由JBD來提供保證,Ext3 通過“鉤子(hooking in)”JBD的API 來實(shí)現(xiàn)其日志記錄的功能。JBD層本身雖然代碼不多,但卻是個(gè)相當(dāng)復(fù)雜的軟件部分,這里我們先不鳥它,以后有機(jī)會(huì)再陪它玩玩兒。
日志文件系統(tǒng)當(dāng)然要記錄日志,而日志也需要占存儲(chǔ)空間。所以,日志文件系統(tǒng)就是在存儲(chǔ)介質(zhì)上開辟一個(gè)塊特殊的區(qū)域?qū)iT用于存儲(chǔ)日志信息:
我們利用一幅圖來簡單描述ext3底層的layout: