說明
當(dāng)redis存儲非臨時數(shù)據(jù)時,為了降低redis故障而引起的數(shù)據(jù)丟失,redis提供了AOF(Append Only File)持久化琅坡,從單詞意思講强戴,將命令追加到文件亭螟。AOF可以將Redis執(zhí)行的每一條寫命令追加到磁盤文件(appendonly.aof)中,在redis啟動時候優(yōu)先選擇從AOF文件恢復(fù)數(shù)據(jù)挡鞍。由于每一次的寫操作,redis都會記錄到文件中预烙,所以開啟AOF持久化會對性能有一定的影響墨微,但是大部分情況下這個影響是可以接受的,我們可以使用讀寫速率高的硬盤提高AOF性能扁掸。與RDB持久化相比翘县,AOF持久化數(shù)據(jù)丟失更少,其消耗內(nèi)存更少(RDB方式執(zhí)行bgsve會有內(nèi)存拷貝)
-------------------------------------------------------------------
appendonly no#?
設(shè)置AOF持久化也糊,yes開啟炼蹦,no禁用,開啟后redis會把所接收到的每一次寫操作請求都追加到appendonly.aof文件中狸剃,當(dāng)redis重新啟動時掐隐,會從該文件恢復(fù)出之前的狀態(tài)。# 但是這樣會造成appendonly.aof文件過大钞馁,所以redis還支持了BGREWRITEAOF指令虑省,對appendonly.aof進(jìn)行重寫
appendfilename "appendonly.aof"? (指定AOF文件名,4.0無法通過config set 設(shè)置僧凰,只能通過修改配置文件設(shè)置探颈。)?
dir /etc/redis(RDB文件和AOF文件存放目錄)
1.追加寫入
redis將每一條寫命令以redis通訊協(xié)議添加至緩沖區(qū)aof_buf,這樣的好處在于在大量寫請求情況下,采用緩沖區(qū)暫存一部分命令隨后根據(jù)策略一次性寫入磁盤训措,這樣可以減少磁盤的I/O次數(shù)伪节,提高性能。
2.同步命令到硬盤
當(dāng)寫命令寫入aof_buf緩沖區(qū)后绩鸣,redis會將緩沖區(qū)的命令寫入到文件怀大,redis提供了三種同步策略,由配置參數(shù)appendfsync決定呀闻,下面是每個策略所對應(yīng)的含義:
appendfsync everysec
no:不使用fsync方法同步化借,而是交給操作系統(tǒng)write函數(shù)去執(zhí)行同步操作,在linux操作系統(tǒng)中大約每30秒刷一次緩沖捡多。這種情況下蓖康,緩沖區(qū)數(shù)據(jù)同步不可控,并且在大量的寫操作下垒手,aof_buf緩沖區(qū)會堆積會越來越嚴(yán)重蒜焊,一旦redis出現(xiàn)故障,數(shù)據(jù)丟失嚴(yán)重科贬。
always:表示每次有寫操作都調(diào)用fsync方法強制內(nèi)核將數(shù)據(jù)寫入到aof文件山涡。這種情況下由于每次寫命令都寫到了文件中, 雖然數(shù)據(jù)比較安全,但是因為每次寫操作都會同步到AOF文件中,所以在性能上會有影響鸭丛,同時由于頻繁的IO操作,硬盤的使用壽命會降低唐责。
everysec:數(shù)據(jù)將使用調(diào)用操作系統(tǒng)write寫入文件鳞溉,并使用fsync每秒一次從內(nèi)核刷新到磁盤。 這是折中的方案鼠哥,兼顧性能和數(shù)據(jù)安全熟菲,所以redis默認(rèn)推薦使用該配置。
no-appendfsync-on-rewrite no
AOF策略設(shè)置為always或者everysec時朴恳,后臺處理進(jìn)程(后臺保存或者AOF日志重寫)會執(zhí)行大量的I/O操作
在某些Linux配置中會阻止過長的fsync()請求抄罕。注意現(xiàn)在沒有任何修復(fù),即使fsync在另外一個線程進(jìn)行處理于颖,為了減緩這個問題呆贿,可以設(shè)置下面這個參數(shù)no-appendfsync-on-rewrite
auto-aof-rewrite-percentage 100(當(dāng)前AOF文件大小和最后一次重寫后的大小之間的比率等于或者等于指定的增長百分比,如100代表當(dāng)前AOF文件是上次重寫的兩倍時候才重寫森渐。)
auto-aof-rewrite-min-size 64mb(AOF文件最小重寫大小做入,只有當(dāng)AOF文件大小大于該值時候才可能重寫,4.0默認(rèn)配置64mb。)
當(dāng)AOF文件增長到一定大小的時候Redis能夠調(diào)用BGREWRITEAOF對日志文件進(jìn)行重寫同衣,它是這樣工作的:Redis會記住上次進(jìn)行寫日志后文件的大小(如果從開機以來還沒進(jìn)行過重寫竟块,那日志大小在開機的時候確定)。
基礎(chǔ)大小會同現(xiàn)在的大小進(jìn)行比較耐齐。如果現(xiàn)在的大小比基礎(chǔ)大小大制定的百分比浪秘,重寫功能將啟動
同時需要指定一個最小大小用于AOF重寫,這個用于阻止即使文件很小但是增長幅度很大也去重寫AOF文件的情況
重寫的策略(1,2,3):
1重復(fù)或無效的命令不寫入文件
2過期的數(shù)據(jù)不再寫入文件
3多條命令合并寫入(當(dāng)多個命令能合并一條命令時候會對其優(yōu)化合并作為一個命令寫入埠况,例如“RPUSH?list1a RPUSHlist1 b" 合并為“RPUSHlist1ab”)
重寫觸發(fā)條件?
AOF文件觸發(fā)條件可分為手動觸發(fā)和自動觸發(fā):
手動觸發(fā):客戶端執(zhí)行bgrewriteaof命令耸携。(可進(jìn)行實踐測試)
自動觸發(fā):自動觸發(fā)通過以下兩個配置協(xié)作生效:
auto-aof-rewrite-min-size: AOF文件最小重寫大小,只有當(dāng)AOF文件大小大于該值時候才可能重寫,4.0默認(rèn)配置64mb询枚。
auto-aof-rewrite-percentage:當(dāng)前AOF文件大小和最后一次重寫后的大小之間的比率等于或者等于指定的增長百分比违帆,如100代表當(dāng)前AOF文件是上次重寫的兩倍時候才重寫。
redis開啟在AOF功能開啟的情況下金蜀,會維持以下三個變量
1.記錄當(dāng)前AOF文件大小的變量aof_current_size刷后。
2.記錄最后一次AOF重寫之后,AOF文件大小的變量aof_rewrite_base_size渊抄。
3.增長百分比變量aof_rewrite_perc尝胆。
每次當(dāng)serverCron(服務(wù)器周期性操作函數(shù))函數(shù)執(zhí)行時,它會檢查以下條件是否全部滿足护桦,如果全部滿足的話含衔,就觸發(fā)自動的AOF重寫操作:
沒有BGSAVE命令(RDB持久化)/AOF持久化在執(zhí)行;
沒有BGREWRITEAOF在進(jìn)行;
當(dāng)前AOF文件大小要大于server.aof_rewrite_min_size的值贪染;
當(dāng)前AOF文件大小和最后一次重寫后的大小之間的比率等于或者大于指定的增長百分比(auto-aof-rewrite-percentage參數(shù))
---
auto-aof-rewrite-percentage 代表AOF文件每次重寫文件大谢呵骸(以百分?jǐn)?shù)代表),100表示百分之百杭隙,即當(dāng)文件增加了1倍(100%)哟绊,則開始重寫AOF文件
auto-aof-rewrite-min-size 設(shè)置最小重寫文件大小,避免文件小而執(zhí)行太多次的重寫
aof-load-truncated yes
當(dāng)redis突然運行崩潰時痰憎,會出現(xiàn)aof文件被截斷的情況票髓,Redis可以在發(fā)生這種情況時退出并加載錯誤,以下選項控制此行為铣耘。
如果aof-load-truncated設(shè)置為yes洽沟,則加載截斷的AOF文件,Redis服務(wù)器啟動發(fā)出日志以通知用戶該事件蜗细。
否則裆操,如果該選項設(shè)置為no,則服務(wù)器將中止并顯示錯誤并停止啟動鳄乏。當(dāng)該選項設(shè)置為no時跷车,用戶需要在重啟之前使用“redis-check-aof”實用程序修復(fù)AOF文件在進(jìn)行重啟
AOF實現(xiàn)本質(zhì)(可用明令 cat appendonly.aof查看文件格式)
AOF實現(xiàn)本質(zhì)是基于redis通訊協(xié)議,將命令以純文本的方式寫入到文件中橱野。
redis協(xié)議:
首先Redis是以行來劃分朽缴,每行以\r\n行結(jié)束。每一行都有一個消息頭水援,消息頭共分為5種分別如下:
(+) 表示一個正確的狀態(tài)信息密强,具體信息是當(dāng)前行+后面的字符。
(-) ?表示一個錯誤信息蜗元,具體信息是當(dāng)前行-后面的字符或渤。
(*) 表示消息體總共有多少行,不包括當(dāng)前行,*后面是具體的行數(shù)奕扣。
($) 表示下一行數(shù)據(jù)長度薪鹦,不包括換行符長度\r\n,$后面則是對應(yīng)的長度的數(shù)據(jù)。
(:) 表示返回一個數(shù)值惯豆,:后面是相應(yīng)的數(shù)字節(jié)符池磁。