免费爱碰视频在线观看,九九精品国产屋,欧美亚洲尤物久久精品,1024在线观看视频亚洲

      Write-Ahead Log (預(yù)寫(xiě)日志)

      Write-Ahead Log (預(yù)寫(xiě)日志)

      WAL 概述

      WAL 是 write-ahead log 系統(tǒng),其核心思想是將用戶(hù)的所有修改操作(插入、刪除)寫(xiě)入日志,然后再應(yīng)用到系統(tǒng)狀態(tài)。一旦日志寫(xiě)入成功,就可以通知用戶(hù)操作成功。由于日志采用尾部追加方式寫(xiě)入,耗時(shí)較短,因此不會(huì)長(zhǎng)時(shí)間阻塞用戶(hù)線(xiàn)程。另外,為防止意外退出導(dǎo)致數(shù)據(jù)丟失,系統(tǒng)重啟時(shí)會(huì)根據(jù)日志重做用戶(hù)操作,保證數(shù)據(jù)可靠性。

      WAL – 預(yù)寫(xiě)日志

      WAL 一直是傳統(tǒng) RDBMS 系統(tǒng)中的一個(gè)共識(shí),用于幫助保證原子性和持久性(ACID 的 A 和 D)。對(duì)表的所有更新首先寫(xiě)入 WA),然后異步的方式使用。

      示例 WAL 和 WALEntry 結(jié)構(gòu):

      type WAL struct { dir string // 存放 WAL 文件的目錄。 file *os.File // 引用文件 metadata []byte // 每個(gè) WAL 解碼器頭部記錄的元數(shù)據(jù) *decoder // 解碼器解碼記錄 編碼器 *encoder // 編碼器編碼記錄 mutex sync.Mutex // To確保每個(gè)寫(xiě)入器一次更新 lastIndex uint64 // 保存到 WAL 的最后一個(gè)條目的索引} type WALEntry struct { lsn uint64 // 每個(gè)日志條目的唯一標(biāo)識(shí)符 data []byte // 實(shí)際 WAL 條目(以字節(jié)為單位) crc uint32 // crc for數(shù)據(jù)完整性驗(yàn)證 type uint32 // wal 記錄的類(lèi)型 }

      為什么需要 WAL

      為什么不將更改直接刷新到實(shí)際數(shù)據(jù)文件?

      它有2個(gè)方面——

    1. 對(duì)磁盤(pán)的寫(xiě)入永遠(yuǎn)不會(huì)真正直接刷新,數(shù)據(jù)經(jīng)過(guò)各種緩沖區(qū)(RAM/緩沖區(qū)緩存/磁盤(pán)緩存),然后才真正刷新到磁盤(pán)扇區(qū)。這些緩存有助于減少磁盤(pán)寫(xiě)入次數(shù),有助于提高性能,但是,它們的缺點(diǎn)是,如果出現(xiàn)重啟/崩潰,這些中間緩存中的數(shù)據(jù)會(huì)丟失,從而影響我們數(shù)據(jù)的持久性。如果我們開(kāi)始避免緩存,每次寫(xiě)后進(jìn)行磁盤(pán)刷新,這樣的動(dòng)作會(huì)影響系統(tǒng)的性能和吞吐量
    2. 如上面提到的,磁盤(pán)寫(xiě)入很慢,在磁盤(pán)寫(xiě)入中,與隨機(jī)磁盤(pán)寫(xiě)入相比,順序磁盤(pán)寫(xiě)入要快得多(也適用于 SSD)。
    3. WAL設(shè)計(jì)

      WAL 是一個(gè)僅附加日志,它將數(shù)據(jù)存儲(chǔ)中的每個(gè)狀態(tài)更改存儲(chǔ)為日志。

      一個(gè)單獨(dú)的異步進(jìn)程可以從 WAL 讀取操作,然后按照正常流程通過(guò)不同的緩存將數(shù)據(jù)更新應(yīng)用于磁盤(pán)上的實(shí)際數(shù)據(jù)文件,有助于提高數(shù)據(jù)存儲(chǔ)的寫(xiě)入吞吐量。

      此外,如果發(fā)生故障,可能會(huì)有未應(yīng)用的更新,由于我們?cè)?WAL 文件中存在操作,我們可以從 WAL 重放操作并應(yīng)用它們以使數(shù)據(jù)存儲(chǔ)恢復(fù)到一致?tīng)顟B(tài)。因此,WAL 幫助我們確保數(shù)據(jù)的完整性和可靠性,同時(shí)仍然允許我們的數(shù)據(jù)存儲(chǔ)具有高寫(xiě)入吞吐量。

      注意事項(xiàng)

      1. 將 WAL 操作刷新到磁盤(pán)

      如前所述,對(duì)磁盤(pán)的寫(xiě)入可能不會(huì)直接刷新,考慮到寫(xiě)入系統(tǒng)中導(dǎo)致性能的問(wèn)題,需要進(jìn)行權(quán)衡刷新頻率或微批處理或兩者來(lái)將更改刷新到磁盤(pán),以幫助提高性能。請(qǐng)注意,此處存在數(shù)據(jù)丟失的風(fēng)險(xiǎn)。

      2. 損壞檢測(cè)

      需要確保任何刷新到磁盤(pán)的操作都不會(huì)損壞, WAL 記錄還包含一個(gè) CRC 值,該值可用于驗(yàn)證何時(shí)從 WAL 讀取記錄并確保沒(méi)有損壞。

      3. 重復(fù)操作

      由于 WAL 是一個(gè)附加追尾的文件,因此如果客戶(hù)端由于通信故障而重試,可能會(huì)遇到在 WAL 上寫(xiě)入重復(fù)操作的情況。因此,每當(dāng)讀取 WAL 時(shí),要確保忽略重復(fù)項(xiàng),或者對(duì)應(yīng)用數(shù)據(jù)的動(dòng)作具有冪等性的。

      現(xiàn)狀

      1)所有數(shù)據(jù)庫(kù),包括像Cassandra這樣的NoSQL數(shù)據(jù)庫(kù)都使用WAL來(lái)保證持久性。

      2) Kafka 使用了與 WAL(Commit Log) 類(lèi)似的結(jié)構(gòu)。

      3) 像 Rocks DB、Level DB 這樣的 KV 存儲(chǔ)和像 Apache Ignite 這樣的分布式緩存也使用 WAL。

      概括

      總而言之,WAL 提供一下價(jià)值

      1) 更快的性能和吞吐量,避免了所有更改的數(shù)據(jù)刷新/磁盤(pán)寫(xiě)入。

      2) 重啟時(shí)的可恢復(fù)性,操作可以從 WAL 應(yīng)用到實(shí)際的數(shù)據(jù)存儲(chǔ)。

      3)能夠恢復(fù)到時(shí)間點(diǎn)快照,我們?cè)?WAL 中存在所有操作。

      鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
      上一篇 2022年6月28日 17:18
      下一篇 2022年6月28日 17:18

      相關(guān)推薦

      聯(lián)系我們

      聯(lián)系郵箱:admin#wlmqw.com
      工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息