Snapshotting 隨 著修改數(shù)據(jù)的執(zhí)行AOF文件會(huì)越來越大,其中很多內(nèi)容記錄某一個(gè)key的變化情況。因此redis有了一種比較有意思的特性:在后臺(tái)重建AOF文件,而不 會(huì)影響client端操作。在任何時(shí)候執(zhí)行BGREWRITEAOF命令,都會(huì)把當(dāng)前內(nèi)存中最短序列的命令寫到磁盤,這些命令可以完全構(gòu)建當(dāng)前的數(shù)據(jù)情 況,而不會(huì)存在多余的變化情況(比如狀態(tài)變化,計(jì)數(shù)器變化等),縮小的AOF文件的大小。 所以當(dāng)使用AOF時(shí),redis推薦同時(shí)使用BGREWRITEAOF。 AOF文件刷新的方式,有三種,參考配置參數(shù)appendfsync : 每提交一個(gè)修改命令都調(diào)用fsync刷新到AOF文件,非常非常慢,但也非常安全; 每秒鐘都調(diào)用fsync刷新到AOF文件,很快,但可能會(huì)丟失一秒以內(nèi)的數(shù)據(jù); 依靠OS進(jìn)行刷新,redis不主動(dòng)刷新AOF,這樣最快,但安全性就差。 默認(rèn)并推薦每秒刷新,這樣在速度和安全上都做到了兼顧。 可能由于系統(tǒng)原因?qū)е铝薃OF損壞,redis無法再加載這個(gè)AOF,可以按照下面步驟來修復(fù): 首先做一個(gè)AOF文件的備份,復(fù)制到其他地方; 修復(fù)原始AOF文件,執(zhí)行: $ redis-check-aof --fix <filename> 可以通過diff –u命令來查看修復(fù)前后文件不一致的地方; 重啟redis服務(wù)。 LOG Rewrite的工作原理,同樣用到了copy-on-write: 首先redis會(huì)fork一個(gè)子進(jìn)程; 子進(jìn)程將最新的AOF寫入一個(gè)臨時(shí)文件; 父進(jìn)程增量的把內(nèi)存中的最新執(zhí)行的修改寫入(這時(shí)仍寫入舊的AOF,rewrite如果失敗也是安全的); 當(dāng)子進(jìn)程完成rewrite臨時(shí)文件后,父進(jìn)程會(huì)收到一個(gè)信號,并把之前內(nèi)存中增量的修改寫入臨時(shí)文件末尾; 這時(shí)redis將舊AOF文件重命名,臨時(shí)文件重命名,開始向新的AOF中寫入。 |
|