重寫(xiě)過(guò)程總結(jié)為:“一個(gè)拷貝,兩處日志”。在fork出子進(jìn)程時(shí)的拷貝,以及在重寫(xiě)時(shí),如果有新數(shù)據(jù)寫(xiě)入,主線程就會(huì)將命令記錄到兩個(gè)aof日志內(nèi)存緩沖區(qū)中。如果AOF寫(xiě)回策略配置的是always,則直接將命令寫(xiě)回舊的日志文件,并且保存一份命令至AOF重寫(xiě)緩沖區(qū),這些操作對(duì)新的日志文件是不存在影響的。(舊的日志文件:主線程使用的日志文件,新的日志文件:bgrewriteaof進(jìn)程使用的日志文件)
而在bgrewriteaof子進(jìn)程完成會(huì)日志文件的重寫(xiě)操作后,會(huì)提示主線程已經(jīng)完成重寫(xiě)操作,主線程會(huì)將AOF重寫(xiě)緩沖中的命令追加到新的日志文件后面。這時(shí)候在高并發(fā)的情況下,AOF重寫(xiě)緩沖區(qū)積累可能會(huì)很大,這樣就會(huì)造成阻塞,Redis后來(lái)通過(guò)Linux管道技術(shù)讓aof重寫(xiě)期間就能同時(shí)進(jìn)行回放,這樣aof重寫(xiě)結(jié)束后只需回放少量剩余的數(shù)據(jù)即可。
最后通過(guò)修改文件名的方式,保證文件切換的原子性。 在AOF重寫(xiě)日志期間發(fā)生宕機(jī)的話,因?yàn)槿罩疚募€沒(méi)切換,所以恢復(fù)數(shù)據(jù)時(shí),用的還是舊的日志文件