redis缓存架构-02-两种持久化机制(RDB和AOF)
1.兩種持久化機制的介紹
1.1 RDB
周期性的生成redis內(nèi)存數(shù)據(jù)的一份完整的快照
1)根據(jù)配置的檢查點,生產(chǎn)rdb快照文件,fork一個子線程,將數(shù)據(jù)dump到rdb快照文件中,完成rdb文件后,替換之前的舊的快照文件
2)配置方式,在redis.conf文件中配置save 60 1000(每隔60,如果有超過1000個key發(fā)送了變化,就生產(chǎn)一份新的dump.rdb文件)
3)save可以配置多個,就是多個檢查點,只要符合就會進(jìn)行rdb備份
4)也可以手動調(diào)用save或bgsave命令,同步或異步進(jìn)行rdb備份
1.2 AOF(需要在redis.conf文件中開啟aof持久化?? appendonly yes)
對每一條寫入命令作為日志,以append-only的模式寫入到一個日志文件中,redis重啟時可以通過回放AOF日志文件重新構(gòu)建整個數(shù)據(jù)集。
1)寫日志時,不直接寫入到磁盤,而是先寫入到os chache中,然后一定時間間隔(每一秒)調(diào)用一次操作系統(tǒng)的fsync操作,強制將os chache中的數(shù)據(jù),刷入到磁盤文件中。
fsync可配置的策略:
appendfsync always? #每寫一條數(shù)據(jù),就執(zhí)行一次fsync,性能非常差
appendfsync everysec #每秒將os cache中的數(shù)據(jù)fsync到磁盤,生產(chǎn)環(huán)境一般這樣配置
appendfsync no? #僅將數(shù)據(jù)寫入到os cache,redis自己時不時的會調(diào)用fsync,不受控制
2)AOF是存放每條寫命令的,所以AOF文件會不斷膨脹,當(dāng)大到一定的時候,就會觸發(fā)AOF 的rewrite操作
AOF rewrite操作:基于當(dāng)前redis內(nèi)存中的數(shù)據(jù),重新構(gòu)建一個更小的aof文件,然后將舊的aof文件刪除
rewrite可配置的策略:
auto-aof-rewrite-percentage 100 #當(dāng)rewrite增長到指定的比例是,進(jìn)行aof rewrite
auto-aof-rewrite-min-size 64mb? #aof rewrite時的最小文件大小,只有超過指定的大小才會就行rewrite
3)如果同時開啟了RDB和AOF兩種持久化機制,redis在重啟時,會從aof文件中恢復(fù)數(shù)據(jù)
2.兩種持久化機制優(yōu)缺點的比較
2.1 RDB的有優(yōu)點
1)每一個dump.rdb文件代表了某一時刻redis中的全部數(shù)據(jù)的快照,非常適合做冷備份
2)直接基于rdb文件重啟和恢復(fù)redis數(shù)據(jù),速度更快(rdb是基于數(shù)據(jù)文件進(jìn)行恢復(fù),aof是基于寫指令進(jìn)行回放)
3)rdb對redis對外提供讀寫服務(wù)影響小,可以讓redis保持高性能(rdb每次寫都是寫入到內(nèi)存中,一定時間后,fork出一個子進(jìn)程進(jìn)行磁盤IO操作;aof需要每次寫文件,雖然是先寫os cache,但也有一定的開銷)
2.2 RDB的缺點
1)如果發(fā)生故障,數(shù)據(jù)丟失的可能比較多(每隔一段時間才會進(jìn)行備份一次)
2)每次fork子進(jìn)程進(jìn)行io操作,如果數(shù)據(jù)文件特別大,會造成客戶端提供的服務(wù)暫停數(shù)毫秒
2.3 AOF的優(yōu)點
1)如果發(fā)生故障,數(shù)據(jù)丟失的比較少(每秒執(zhí)行一次fsync,只會丟失一秒的數(shù)據(jù))
2)aof日志文件以append-only模式寫入,沒有磁盤尋址的開銷,寫入性高,即使有文件破損,也可以很容易修復(fù)(redis-check-aof --fix 要修改的aof文件)
3)aof通過可讀性的方式記錄,適合災(zāi)難性的誤刪除的緊急恢復(fù)(直接刪除aof中的該指令進(jìn)行重啟redis即可)
2.4 AOF的缺點
1)相同的數(shù)據(jù),aof文件要不rdb文件大
2)aof開啟后,QPS會降低(每秒會進(jìn)行fsync操作)
3)數(shù)據(jù)恢復(fù)時,需要基于指令回放操作,恢復(fù)速度慢,容易出現(xiàn)bug
3.兩種持久化機制的選擇
同時開啟兩種持久化機制,用aof保證數(shù)據(jù)的不丟失,作為數(shù)據(jù)恢復(fù)的第一選擇;用rdb進(jìn)行冷備,在aof文件不可用是,作快速數(shù)據(jù)恢復(fù)。
4.開啟兩種持久化機制時的數(shù)據(jù)恢復(fù)
4.1 如果redis進(jìn)程掛掉了,重啟redis進(jìn)程即可,基于aof進(jìn)行恢復(fù)
4.2 如果redis所在的機器掛掉了,重啟機器后,嘗試重啟redis進(jìn)程,基于aof進(jìn)行恢復(fù),如果aof文件有破損,使用redis-check-aof fix進(jìn)行修改
4.3 如果redis當(dāng)前最新的aof和rdb文件都丟失或者損壞了
1)停止redis,刪除appendonly.aof文件和dump.rdb文件
2)修改redis.conf文件,關(guān)閉appendonly no
3)從云端拷貝dump.rdb文件,重啟redis進(jìn)程
4)在redis命令行中,熱修改配置開啟aof,config set appendonly yes
5)停掉redis進(jìn)程,修改redis.conf文件,開啟aof,appendonly yes
6)重啟redis
轉(zhuǎn)載于:https://www.cnblogs.com/lifeone/p/9329453.html
總結(jié)
以上是生活随笔為你收集整理的redis缓存架构-02-两种持久化机制(RDB和AOF)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spark性能优化:资源调优篇
- 下一篇: oracle 数据库备份恢复