国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

Linux中如何保證數據安全落盤

2020-03-01 11:18:01
字體:
來源:轉載
供稿:網友

背景

在很多IO場景中,我們經常需要確保數據已經安全的寫到磁盤上,以便在系統宕機重啟之后還能讀到這些數據。但是我們都知道,linux系統的IO路徑還是很復雜的,分為很多層,每一層都可能會有buffer來加速IO讀寫。同時,用戶態的html' target='_blank'>應用程序和庫函數也可能擁有自己的buffer,這又給IO路徑增加了一些復雜性。可見,要想保證數據安全的寫到磁盤上,并不是簡單調一個write/fwrite就可以搞定的。

那么要怎么做呢?很多人會想到很多辦法,比如:fflush()、fsync()、fdatasync()、sync()、open()使用O_DIRECT或O_SYNC標志等。嗯,這些手段(或者某些組合)的確可以保證數據安全的持久化,那么它們之間有什么區別呢?fflush()和fsync()有啥區別?O_DIRECT是啥意思,它可以保證數據安全的持久化嗎?O_DIRECT和O_SYNC區別什么?O_SYNC和fsync()呢?fsync能完成msync的功能嗎?本文將試圖理解、解釋這些概念的作用和區別。

Linux IO

所謂一圖勝千言,為了解析清楚這些概念的區別,我特意畫了一張圖,仔細看,應該可以清晰的看出它們的作用和區別。

8e7941d0-51d1-415d-b7a3-c7db93325f12.jpg

這里重點說一下O_DIRECT和O_SYNC,首先要明確的是,O_DIRECT只是說數據不會經過page cache(一般用在用戶態自己管理buffer)而是直接提交給塊設備層,但是不會同步等待數據安全寫入磁盤之后才返回(比如數據可能還在塊層排隊或者在磁盤自己的cache中)。而O_SYNC標志,雖然數據還是會寫page cache,但是此時會采用write through的策略,并同步等待數據安全寫入磁盤后才會返回。因此如果同時使用O_DIRECT和O_SYNC,則表示數據不會經過page cache并同步等待數據安全寫入磁盤才返回,當然這樣IO的性能會非常低下。

由于O_DIRECT會bypass page cache,因此如果有另一個進程使用普通的方式讀文件,有可能會出現數據不一致的現象,這個也需要注意。

為了做一下輔助說明,此處我貼一下我探討過程中看過的一些資料。首先是引用open系統調用:http://man7.org/linux/man-pages/man2/open.2.html 相關參數的說明:

19937a72-2263-4fe7-bedf-8f6a544cab28.jpg

d26b1c59-e4fd-48a3-97a9-31425ed492da.jpg

c7710d272b1f0da876969c0ed2538cceb4a.jpg

以及innodb相關的文檔:https://lwn.net/Articles/457667/

3f37624f-bcda-4c5f-9ac7-e7edf6acdefd.jpg

fsync和fdatasync的區別:http://man7.org/linux/man-pages/man2/fsync.2.html


0dc08f91-a566-40d8-96eb-6053698feb99.jpg8bcb6de2-116c-4a5b-b9fd-66a221e54769.jpg

msync:http://man7.org/linux/man-pages/man2/msync.2.html

bf337acf-7a34-4ed6-9050-f060bce1f396.jpg

DAX

其實還有一種IO模式,就是DAX(Direct Access ),是不是看上去和O_DIRECT很像。這種模式需要filesystem和block driver都支持才可以,一般主要用在non volatile memory上,本質上也是繞過page cache直接操作設備。DAX本文先不做深入探討,后面我會自己寫一個支持DAX模式的ramdisk塊設備驅動,然后格式化為ext4文件系統并-o dax模式掛載,再來詳細研究DAX的IO路徑。

更多Linux文章,請訪問Linux教程欄目進行學習!

以上就是Linux中如何保證數據安全落盤的詳細內容,更多請關注 其它相關文章!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东台市| 本溪市| 张家川| 安吉县| 上栗县| 石阡县| 新干县| 自治县| 伊春市| 于田县| 长子县| 攀枝花市| 孟村| 关岭| 靖西县| 溆浦县| 刚察县| 台北市| 盱眙县| 获嘉县| 当雄县| 高邑县| 北川| 呼图壁县| 汕尾市| 潮安县| 高密市| 太仆寺旗| 合江县| 潞西市| 延长县| 桂阳县| 鞍山市| 铁岭市| 新沂市| 永城市| 津市市| 乌什县| 吉林市| 博白县| 常州市|