redis的持久化主要有兩大機制,即AOF日志和RDB快照。
1、AOF日志是如何實現的?
與傳統數據庫寫日志不一樣,先執行命令,再寫入日志。
比如:set testkey test value 這條命令的執行,AOF的日志內容是這樣展示的
*3代表有當前命令有三個部分,3表示有三個字節,也就是set,3表示有三個字節,也就是set,3表示有三個字節,也就是set,7表示有7個字節,也就是testkey
為什么先執行和寫日志呢,就是為了不出現語法錯誤導致恢復的時候出錯,因為先寫日志的話redis不會額外的檢查語法的錯誤,這樣錯了的話導致后續恢復的時候出錯。還有一個好處就是不會阻塞當前的寫操作。
但是也有風險,Redis用作數據庫的話,沒來得及寫日志就宕機了,這樣無法恢復數據了。還有就是如果把日志文件寫入磁盤阻塞,后續的操作也沒法執行了。
2、三種寫回策略
分別是同步寫回Always,每秒寫回Everysec,操作系統控制寫回No。
高性能就選操作系統控制,高可用就選同步寫回,這種就寫每秒寫回.
同樣畢竟是文件系統,文件太大了怎么辦?
3、日志文件太大了怎么辦?
AOF重寫機制為啥可以讓文件變小呢?因為重寫只會保持最新的記錄,一個key對應的value是可能被多次修改的,那么在原本的日志文件就會存在多條記錄。重寫機制則只會存最新的記錄。
4、AOF重寫會阻塞嗎?
重寫是由后臺線程bgrwriteaof來執行完成的,總結就是一個拷貝,兩處日志。
一個拷貝就是主線程fork后臺的bgrwriteaof子進程,fork會把主線程的內存拷貝一份給bgrwriteaof子進程,這里面就包含了數據庫的最新數據,這個時候子進程就會把拷貝的數據寫成操作,記入重寫日志。
兩處日志是,因為主線程未阻塞,仍然可以處理新來的操作。此時,如果有寫操作,第一處日志就是指正在使用的AOF日志,Redis會把這個操作寫到它的緩沖區。這樣一來,即使宕機了,這個AOF日志的操作仍然是齊全的,可以用于恢復。
而第二處日志,就是指新的AOF重寫日志。這個操作也會被寫到重寫日志的緩沖區。這樣,重寫日志也不會丟失最新的操作。等到拷貝數據的所有操作記錄重寫完成后,重寫日志記錄的這些最新操作也會寫入新的AOF文件,以保證數據庫最新狀態的記錄。此時,我們就可以用新的AOF文件替代舊文件了。
總結來說,每次AOF重寫時,Redis會先執行一個內存拷貝,用于重寫;然后,使用兩個日志保證在重寫過程中,新寫入的數據不會丟失。而且,因為Redis采用額外的線程進行數據重寫,所以,這個過程并不會阻塞主線程。
作者:狗日de阿良
鏈接:https://juejin.cn/post/6896072419543515143