成功者不是從不失敗棒妨,而是從不放棄甸陌!
總結(jié):
- Redis持久化方式:RDB(Redis DB)定時保存钠至、AOF(AppendOnlyFile)重演瞎惫;
- 分布式文件系統(tǒng):將文件分散在不同的節(jié)點上溜腐,不同節(jié)點上有多個副本;防止一部分壞了仍然可以使用瓜喇;
1. Redis持久化
持久化:將數(shù)據(jù)從掉電易失的內(nèi)存存放到能夠永久存儲的設(shè)備上
Redis服務(wù)是使用內(nèi)存來存儲數(shù)據(jù)挺益,如果掉電、服務(wù)崩潰都會導(dǎo)致Redis中數(shù)據(jù)丟失乘寒,如有必要矩肩,可以持久化數(shù)據(jù)。
Redis持久化方式:RDB(Redis DB)肃续、AOF(AppendOnlyFile)
1. RDB
在默認(rèn)情況下黍檩,Redis 將某時間點的數(shù)據(jù)庫快照保存在名字為 dump.rdb的二進(jìn)制文件中
策略
自動:按照配置文件中的條件滿足就執(zhí)行BGSAVE(后臺自動保存)
手動:客戶端發(fā)起SAVE、BGSAVE命令
配置
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir /var/lib/redis/6379
save 60 1000始锚,Redis要滿足在60秒內(nèi)至少有1000個鍵被改動刽酱,會自動保存一次
只要滿足上面3個條件之一,就自動執(zhí)行快照
執(zhí)行完后瞧捌,時間計數(shù)器和次數(shù)計數(shù)器都會歸零重新計數(shù)棵里。這多個條件不是疊加效果
SAVE命令:阻塞式命令,執(zhí)行期間不響應(yīng)客戶端的請求
BGSAVE:非阻塞命令姐呐,執(zhí)行期間還可以接收并處理客戶端請求殿怜,會folk一個子進(jìn)程創(chuàng)建RDB文件
192.168.142.135:6379> SAVE
192.168.142.135:6379> BGSAVE
優(yōu)點
- 完全備份,不同時間的數(shù)據(jù)集備份可以做到多版本恢復(fù)
- 緊湊的單一文件曙砂,方便網(wǎng)絡(luò)傳輸头谜,適合災(zāi)難恢復(fù)
- 快照文件直接恢復(fù),大數(shù)據(jù)集速度較AOF快
缺點
會丟失最近寫入鸠澈、修改的而未能持久化的數(shù)據(jù)
folk過程非常耗時(消耗 內(nèi)存)柱告,會造成毫秒級不能響應(yīng)客戶端請求RDB備份策略
創(chuàng)建一個定時任務(wù)cron job截驮,每小時或者每天將dump.rdb復(fù)制到指定目錄
確保備份文件名稱帶有日期時間信息,便于管理和還原對應(yīng)的時間點的快照版本
定時任務(wù)刪除過期的備份
如果有必要际度,跨物理主機(jī)葵袭、跨機(jī)架、異地備份
2. AOF
Append only ?le乖菱,采用追加的方式保存坡锡,默認(rèn)文件appendonly.aof 。
記錄所有的寫操作命令窒所,在服務(wù)啟動的時候使用這些命令就可以還原數(shù)據(jù)庫(重演)
AOF寫入機(jī)制
AOF方式不能保證絕對不丟失數(shù)據(jù)
目前常見的操作系統(tǒng)中鹉勒,執(zhí)行系統(tǒng)調(diào)用write函數(shù),將一些內(nèi)容寫入到某個文件里面時墩新,為了提高效率贸弥,系統(tǒng)通常不會直接將內(nèi)容寫入硬盤里面窟坐,而是先將內(nèi)容放入一個內(nèi)存緩沖區(qū)(bu?er)里面海渊,等到緩沖區(qū)被填滿,或者用戶執(zhí)行fsync調(diào)用和fdatasync調(diào)用時才將儲存在緩沖區(qū)里的內(nèi)容真正的寫入到硬盤里哲鸳,未寫入磁盤之前臣疑,數(shù)據(jù)可能會丟失
寫入磁盤的策略
appendfsync選項,這個選項的值可以是always徙菠、everysec或者no
Always:服務(wù)器每寫入一個命令讯沈,就調(diào)用一次fdatasync,將緩沖區(qū)里面的命令寫入到硬盤婿奔。這種模式下缺狠,服務(wù)器出現(xiàn)故障,也不會丟失任何已經(jīng)成功執(zhí)行的命令數(shù)據(jù)
Everysec(默認(rèn)):服務(wù)器每一秒重調(diào)用一次fdatasync萍摊,將緩沖區(qū)里面的命令寫入到硬盤挤茄。這種模式下,服務(wù)器出現(xiàn)故障冰木,最多只丟失一秒鐘內(nèi)的執(zhí)行的命令數(shù)據(jù)
No:服務(wù)器不主動調(diào)用fdatasync穷劈,由操作系統(tǒng)決定何時將緩沖區(qū)里面的命令寫入到硬盤。這種模式下踊沸,服務(wù)器遭遇意外停機(jī)時歇终,丟失命令的數(shù)量是不確定的
運(yùn)行速度:always的速度慢,everysec和no都很快
AOF重寫機(jī)制
寫操作越來越多的被記錄逼龟,AOF文件會很大评凝。Redis會合并寫操作,以壓縮AOF文件腺律。
合并重復(fù)的寫操作肥哎,AOF會使用盡可能少的命令來記錄辽俗。
重寫過程
- folk一個子進(jìn)程負(fù)責(zé)重寫AOF文件
- 子進(jìn)程會創(chuàng)建一個臨時文件寫入AOF信息
- 父進(jìn)程會開辟一個內(nèi)存緩沖區(qū)接收新的寫命令
- 子進(jìn)程重寫完成后,父進(jìn)程會獲得一個信號篡诽,將父進(jìn)程接收到的新的寫操作由子進(jìn)程寫入到臨時文件中
- 新文件替代舊文件
注:如果寫入操作的時候出現(xiàn)故障導(dǎo)致命令寫半截崖飘,可以使用redis-check-aof工具修復(fù)
原有AOF文件 | 重寫后的AOF文件 |
---|---|
SELECT 0 | SELECT 0 |
SADD fruits “apple” | SADD fruits “apple” “banana” “cherry” |
SADD fruits “banana” | SET msg “hello world again!” |
SADD fruits “cherry” | RPUSH lst 3 5 7 |
SADD fruits “apple” | |
INCR counter | |
INCR counter | |
DEL counter | |
SET msg “hello world” | |
SET msg “hello world again!” | |
RPUSH lst 1 3 5 | |
RPUSH lst 7 | |
LPOP lst |
AOF重寫觸發(fā)
手動:客戶端向服務(wù)器發(fā)送BGREWRITEAOF命令
自動:配置文件中的選項,自動執(zhí)行BGREWRITEAOF命令
auto-aof-rewrite-min-size <size> 杈女,觸發(fā)AOF重寫所需的最小體積:只要在AOF文件的體積大于等于size時朱浴,才會考慮是否需要進(jìn)行AOF重寫,這個選項用于避免對體積過小的AOF文件進(jìn)行重寫
auto-aof-rewrite-percentage <percent> 达椰,指定觸發(fā)重寫所需的AOF文件體積百分比:當(dāng)AOF文件的體積大于auto-aof-rewrite-min-size指定的體積翰蠢,并且超過上一次重寫之后的AOF文件體積的percent %時,就會觸發(fā)AOF重寫啰劲。(如果服務(wù)器剛剛啟動不久梁沧,還沒有進(jìn)行過AOF重寫,那么使用服務(wù)器啟動時載入的AOF文件的體積來作為基準(zhǔn)值)蝇裤。將這個值設(shè)置為0表示關(guān)閉自動AOF重寫
重寫配置舉例
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
當(dāng)AOF文件大于64MB時候廷支,可以考慮重寫AOF文件
只有當(dāng)AOF文件的增量大于起始size的100%時(就是文件大小翻了一倍),啟動重寫
appendonly yes
默認(rèn)關(guān)閉栓辜,請開啟
優(yōu)點
寫入機(jī)制恋拍,默認(rèn)fysnc每秒執(zhí)行,性能很好不阻塞服務(wù)藕甩,最多丟失一秒的數(shù)據(jù)
重寫機(jī)制施敢,可以優(yōu)化AOF文件體積
如果誤操作了(FLUSHALL等),只要AOF未被重寫狭莱,停止服務(wù)移除AOF文件尾部FLUSHALL命令僵娃,重啟Redis,可以將數(shù)據(jù)集恢復(fù)到FLUSHALL 執(zhí)行之前的狀態(tài)缺點
相同數(shù)據(jù)集腋妙,AOF文件(文本)體積較RDB大了很多
恢復(fù)數(shù)據(jù)庫速度叫RDB慢(文本默怨,命令重演)