Redis 持久化實現方式ios
將redis內存中的數據,完整的生成一個快照,以.rdb結尾的文件保存在硬盤上,當須要恢復時,再從文件加載到內存中。redis
[vagrant@tmwy ~]$ redis-cli 127.0.0.1:6379> save OK
save執行時,會形成Redis的阻塞。全部數據操做命令都要排隊等待它完成。
文件策略:新生成一個新的臨時文件,當save執行完後,用新的替換老的。緩存
[vagrant@tmwy ~]$ redis-cli 127.0.0.1:6379> bgsave Background saving started
客戶端對Redis服務器下達bgsave命令時,Redis會fork出一個子進程進行rdb文件的生成。當文件生成完畢後,子進程再反饋給主進程。fork子進程時也會阻塞,不過正常狀況下fork過程都很是快的。
文件策略:與save命令相同。安全
配置 | seconds | changes | 做用 |
---|---|---|---|
save | 900 | 1 | 900秒內改變1條數據、自動生成rdb文件 |
save | 300 | 10 | 300秒內改變10條數據、自動生成rdb文件 |
save | 60 | 10000 | 60秒內改變10000條數據、自動生成rdb文件 |
PS: 這三種規則都不建議使用。服務器
# 配置自動生成規則。通常不建議配置自動生成rdb文件 save 900 1 save 300 10 save 60 10000 # 指定rdb文件名 dbfilename dump-${port}.rdb # 指定rdb文件目錄 dir /opt/redis/data # bgsave發生錯誤,中止寫入 stop-writes-on-bgsave-error yes # rdb文件採用壓縮格式 rdbcompression yes # 對rdb文件進行校驗 rdbchecksum yes
就是寫日誌,每次執行Redis寫命令,讓命令同時記錄日誌(以.aof結尾的日誌文件)。Redis宕機時,只要進行日誌回放就能夠恢復數據。微信
首先redis執行寫命令將命令刷新到硬盤緩衝區中網絡
命令 | 優勢 | 缺點 |
---|---|---|
always | 不丟失數據 | IO開銷大,通常的sata盤只有幾百TPS |
everysec | 只丟一秒數據 | 丟了一秒數據 |
no | 系統決定 | 不可控,不知道何時刷盤,也不知道會丟失多少數據 |
一般使用everysec策略,這也是AOF的默認策略。app
AOF重寫就是把過時的、沒用的、重複的以及可優化的命令,進行化簡。只取最終有價值的結果。雖然寫入操做很頻繁,但系統定義的key的量是相對有限的。
AOF重寫能夠大大壓縮最終日誌文件的大小。從而減小磁盤佔用量,加快數據恢復速度。好比咱們有個計數的服務,有不少自增的操做,好比有一個key自增到1個億,對AOF文件來講就是一億次incr。AOF重寫就只用記1條記錄。運維
AOF 重寫配置異步
AOF自動重寫的觸發時機,需同時知足如下兩點:
# 開啓正常AOF的append刷盤操做 appendonly yes # AOF文件名 appendfilename "appendonly-${port}.aof" # 每秒刷盤 appendfsync everysec # 文件目錄 dir /opt/redis/data # AOF重寫增加率 auto-aof-rewrite-percentage 100 # AOF重寫最小尺寸 auto-aof-rewrite-min-size 64mb # AOF重寫期間是否暫停append操做。AOF重寫很是消耗磁盤性能,而正常的AOF過程當中也會往磁盤刷數據。 # 一般偏向考慮性能,設爲yes。萬一重寫失敗了,這期間正常AOF的數據會丟失,由於咱們選擇了重寫期間放棄了正常AOF刷盤。 no-appendfsync-on-rewrite yes
命令 | RDB | AOF | 說明 |
---|---|---|---|
啓動優先級 | 低 | 高 | RDB和AOF都開啓的狀況下,Redis重啓後,選擇AOF進行恢復。大部分狀況下它保存了比RDB更新的數據 |
體積 | 小 | 大 | RDB二進制模式存儲,並且作了壓縮。AOF雖然有AOF重寫,可是體積相對仍是大不少,畢竟它是記日誌形式 |
恢復速度 | 快 | 慢 | RDB體積小,恢復速度快。AOF體積大,恢復速度慢 |
數據安全 | 丟數據 | 根據策略決定 | RDB丟上次快照後的數據,AOF根據always、everysec、no策略決定是否丟數據 |
輕重 | 重 | 輕 | AOF是追加日誌,因此比較輕的操做。而RDB是CPU密集型操做,對磁盤,以及fork時對內存的消耗都比較大 |
fork是一個同步操做。執行bgsave和bgrewriteaof時都會執行fork操做
改善fork
bgsave和bgrewriteaof會進行fork操做產生子進程。
CPU
內存
硬盤
優化:
AOF阻塞定位
Asynchronous AOF fsync is taking to long(disk is busy?). Writing the AOF buffer whitout waiting for fsync to complete, this may slow down Redis
127.0.0.1:6379> info persistence ...... ...... aof_delayed_fsync: 100 ...... ......
改善方式
同子進程的硬盤優化
PS: 更多文章請關注微信公衆號:浮話