一尔破、持久化的分類
1.快照RBD
可以設(shè)置航夺,這個快照持久化是系統(tǒng)默認的持久化方式,通過手動設(shè)置n秒內(nèi)超過m個數(shù)據(jù)發(fā)生了變化万牺,那就自動做快照罗珍。
save 900 1 #900 秒內(nèi)如果超過 1 個 key 被修改,則發(fā)起快照保存
save 300 10 #300 秒內(nèi)容如超過 10 個 key 被修改脚粟,則發(fā)起快照保存
save 60 10000
2.AOF方式
? 由于快照方式是在一定間隔時間做一次的覆旱,所以如果 redis 意外 down 掉的話,就會丟失最后一次快照后的所有修改核无。如果應(yīng)用要求不能丟失任何修改的話扣唱,可以采用 aof 持久化方式。下面介紹 Append-only file:aof 比快照方式有更好的持久化性团南,是由于在使用 aof 持久化方式時,redis 會將每一個收到的寫命令都通過 write 函數(shù)追加到文件中(默認是 appendonly.aof)噪沙。當 redis 重啟時會通過重新執(zhí)行文件中保存的寫命令來在內(nèi)存中重建整個數(shù)據(jù)庫的內(nèi)容。當然由于 os 會在內(nèi)核中緩存 write 做的修改已慢,所以可能不是立即寫到磁盤上曲聂。這樣 aof 方式的持久化也還是有可能會丟失部分修改。不過我們可以通過配置文件告訴 redis 我們想要通過 fsync 函數(shù)強制 os 寫入到磁盤的時機佑惠。有三種方式如下(默認是:每秒 fsync 一次)
appendonly yes //啟用 aof 持久化方式
# appendfsync always //收到寫命令就立即寫入磁盤,最慢齐疙,但是保證完全的持久化
appendfsync everysec //每秒鐘寫入磁盤一次膜楷,在性能和持久化方面做了很好的折中
# appendfsync no //完全依賴 os,性能最好,持久化沒保證
? ? ? ??aof 的方式也同時帶來了另一個問題贞奋。持久化文件會變的越來越大赌厅。例如我們調(diào)用 incr test命令 100 次,文件中必須保存全部的 100 條命令轿塔,其實有 99 條都是多余的特愿。因為要恢復(fù)數(shù)據(jù)庫的狀態(tài)其實文件中保存一條 set test 100 就夠了。為了壓縮 aof 的持久化文件勾缭。 redis 提供了 bgrewriteaof 命令揍障。收到此命令 redis 將使用與快照類似的方式將內(nèi)存中的數(shù)據(jù)以命令的方式保存到臨時文件中,最后替換原來的文件俩由。
二毒嫡、優(yōu)缺點辨析
1.RBD優(yōu)點
(1)RDB會生成多個數(shù)據(jù)文件,每個數(shù)據(jù)文件都代表了某一個時刻中redis的數(shù)據(jù)幻梯,這種多個數(shù)據(jù)文件的方式兜畸,非常適合做冷備,可以將這種完整的數(shù)據(jù)文件發(fā)送到一些遠程的安全存儲上去碘梢,比如說Amazon的S3云服務(wù)上去咬摇,在國內(nèi)可以是阿里云的ODPS分布式存儲上,以預(yù)定好的備份策略來定期備份redis中的數(shù)據(jù)
RDB也可以做冷備煞躬,生成多個文件肛鹏,每個文件都代表了某一個時刻的完整的數(shù)據(jù)快照
AOF也可以做冷備逸邦,只有一個文件,但是你可以龄坪,每隔一定時間昭雌,去copy一份這個文件出來
RDB做冷備,優(yōu)勢在哪兒呢健田?由redis去控制固定時長生成快照文件的事情烛卧,比較方便; AOF,還需要自己寫一些腳本去做這個事情妓局,各種定時RDB數(shù)據(jù)做冷備总放,在最壞的情況下,提供數(shù)據(jù)恢復(fù)的時候好爬,速度比AOF快
(2)RDB對redis對外提供的讀寫服務(wù)局雄,影響非常小,可以讓redis保持高性能存炮,因為redis主進程只需要fork一個子進程炬搭,讓子進程執(zhí)行磁盤IO操作來進行RDB持久化即可
RDB:每次寫,都是直接寫redis內(nèi)存穆桂,只是在一定的時候宫盔,才會將數(shù)據(jù)寫入磁盤中
AOF:每次都是要寫文件的,雖然可以快速寫入os cache中享完,但是還是有一定的時間開銷的,速度肯定比RDB略慢一些
(3)相對于AOF持久化機制來說灼芭,直接基于RDB數(shù)據(jù)文件來重啟和恢復(fù)redis進程,更加快速般又,AOF彼绷,存放的指令日志,做數(shù)據(jù)恢復(fù)的時候茴迁,其實是要回放和執(zhí)行所有的指令日志寄悯,來恢復(fù)出來內(nèi)存中的所有數(shù)據(jù)的RDB,就是一份數(shù)據(jù)文件笋熬,恢復(fù)的時候热某,直接加載到內(nèi)存中即可
2.RBD缺點
(1)恢復(fù)5分鐘內(nèi)的數(shù)據(jù),可能就會丟失五分鐘的數(shù)據(jù)量
(2)RDB每次在fork子進程來執(zhí)行RDB快照數(shù)據(jù)文件生成的時候胳螟,如果數(shù)據(jù)文件特別大昔馋,可能會導(dǎo)致對客戶端提供的服務(wù)暫停數(shù)毫秒,或者甚至數(shù)秒
3.AOF持久化機制的優(yōu)點
(1)AOF可以更好的保護數(shù)據(jù)不丟失糖耸,一般AOF會每隔1秒秘遏,通過一個后臺線程執(zhí)行一次fsync操作,最多丟失1秒鐘的數(shù)據(jù),每隔1秒嘉竟,就執(zhí)行一次fsync操作邦危,保證os cache中的數(shù)據(jù)寫入磁盤中,redis進程掛了洋侨,最多丟掉1秒鐘的數(shù)據(jù)
(2)AOF日志文件以append-only模式寫入,所以沒有任何磁盤尋址的開銷倦蚪,寫入性能非常高希坚,而且文件不容易破損,即使文件尾部破損陵且,也很容易修復(fù)
(3)AOF日志文件即使過大的時候裁僧,出現(xiàn)后臺重寫操作,也不會影響客戶端的讀寫慕购。因為在rewrite log的時候聊疲,會對其中的指導(dǎo)進行壓縮,創(chuàng)建出一份需要恢復(fù)數(shù)據(jù)的最小日志出來沪悲。再創(chuàng)建新日志文件的時候获洲,老的日志文件還是照常寫入。當新的merge后的日志文件ready的時候殿如,再交換新老日志文件即可贡珊。
(4)AOF日志文件的命令通過非常可讀的方式進行記錄涉馁,這個特性非常適合做災(zāi)難性的誤刪除的緊急恢復(fù)飞崖。比如某人不小心用flushall命令清空了所有數(shù)據(jù),只要這個時候后臺rewrite還沒有發(fā)生谨胞,那么就可以立即拷貝AOF文件,將最后一條flushall命令給刪了蒜鸡,然后再將該AOF文件放回去胯努,就可以通過恢復(fù)機制,自動恢復(fù)所有數(shù)據(jù)
4. AOF持久化機制的缺點
(1)對于同一份數(shù)據(jù)來說逢防,AOF日志文件通常比RDB數(shù)據(jù)快照文件更大
(2)AOF開啟后叶沛,支持的寫QPS會比RDB支持的寫QPS低,因為AOF一般會配置成每秒fsync一次日志文件忘朝,當然灰署,每秒一次fsync,性能也還是很高的局嘁。如果你要保證一條數(shù)據(jù)都不丟溉箕,也是可以的,AOF的fsync設(shè)置成沒寫入一條數(shù)據(jù)悦昵,fsync一次肴茄,那就完蛋了,redis的QPS大降
(3)以前AOF發(fā)生過bug但指,就是通過AOF記錄的日志寡痰,進行數(shù)據(jù)恢復(fù)的時候抗楔,沒有恢復(fù)一模一樣的數(shù)據(jù)出來。所以說拦坠,類似AOF這種較為復(fù)雜的基于命令日志/merge/回放的方式连躏,比基于RDB每次持久化一份完整的數(shù)據(jù)快照文件的方式,更加脆弱一些贞滨,容易有bug入热。不過AOF就是為了避免rewrite過程導(dǎo)致的bug,因此每次rewrite并不是基于舊的指令日志進行merge的疲迂,而是基于當時內(nèi)存中的數(shù)據(jù)進行指令的重新構(gòu)建才顿,這樣健壯性會好很多。
(4)唯一的比較大的缺點尤蒿,其實就是做數(shù)據(jù)恢復(fù)的時候郑气,會比較慢,還有做冷備腰池,定期的備份尾组,不太方便,可能要自己手寫復(fù)雜的腳本去做示弓,做冷備不太合適