redis支持數(shù)據(jù)持久化,兩種方式:
- 快照 RDB
- 寫日志 AOF
RDB
經(jīng)過RDB之后,redis會將內(nèi)存中的數(shù)據(jù)創(chuàng)建一份快照到硬盤中,稱為RDB文件(二進制),當redis重新啟動時,會加載硬盤中的RDB文件,加載到內(nèi)存中完成數(shù)據(jù)恢復
RDB持久化數(shù)據(jù)的方式
1.save同步
- 在save的同時,其它命令會阻塞,會阻塞主線程
- 如果存在老的RDB文件,會先創(chuàng)建一個臨時文件,然后對老文件進行替換
2.bgsave異步
- 調(diào)用bgsave后,會調(diào)用linux的fork()函數(shù),創(chuàng)建一個子進程
- 如果存在老的RDB文件,會先創(chuàng)建一個臨時文件,然后對老文件進行替換
自動觸發(fā)達到如下條件觸發(fā)
| second (時間) | changes (修改次數(shù)) |
|---|---|
| 900 | 1 |
| 300 | 10 |
| 60 | 10000 |
RDB相關(guān)配置
- dbfilename dump-${port}.rdb // 使用端口區(qū)分
- dir /redis/data // 使用一個大的硬盤的目錄
- stop-writes-on-bgsave-error yes // bgsave發(fā)生錯誤停止寫入
- rdbcompression yes // 使用壓縮的配置 主從復制拷貝快
- rdbchecksum yes // 采用校驗和的方式
額外觸發(fā)生成rdb文件
- 主從復制時機的全量復制,master節(jié)點會執(zhí)行bgsave 生成rdb文件
- debug reload // debug 級別的重啟 不清空內(nèi)存的方式重啟
- shutdown // 關(guān)閉時 shutdown save 會生成rdb文件
- flushDB 、 flushAll
缺點:
- 耗時
- 耗性能
- 不可控,容易丟失數(shù)據(jù)
AOF
通過日志方式將redis中的寫命令進行日志記錄,保存在硬盤文件中,實質(zhì)是將寫命令寫在硬盤的緩沖區(qū)中,再根據(jù)相關(guān)策略把數(shù)據(jù)刷新到磁盤中,當redis服務器啟動時候,執(zhí)行硬盤中的日志文件以恢復redis中的數(shù)據(jù)
AOF策略
1.always
注:執(zhí)行每條寫命令都將寫命令寫到磁盤中
- 不丟失數(shù)據(jù),IO開銷較大
2.everysec
注:每秒將數(shù)據(jù)從緩沖區(qū)刷到磁盤中,可能會丟失一秒的數(shù)據(jù)
- 每秒一次,保護硬盤,可能會丟失一秒的數(shù)據(jù)
3.no
注:寫命令何時刷新的磁盤中,由操作系統(tǒng)來決定
- 系統(tǒng)策略自動寫入
AOF重寫
1.重寫的作用
- 減少磁盤占用
- 加速AOF恢復速度
2.重寫實現(xiàn)方式
客戶端發(fā)送一條bgrewriteaof命令后,redis會fork一個子進程完成AOF重寫操作
AOF配置項:
- auto-aof-rewrite-min-size 默認64MB AOF文件重寫需要的尺寸,AOF多大時開啟重寫
- auto-aof-rewrite-percentage 默認100 AOF文件增長率
同時滿足觸發(fā)重寫
3.AOF重寫原理
AOF重寫不會讀取老的AOF文件,而是根據(jù)當前服務器的狀態(tài)生成一份新的AOF文件,將老的AOF文件進行替換
4.AOF相關(guān)配置
appendonly yes # 開啟AOF
appendfilename aof-${節(jié)點名稱}.aof # AOF文件名
appendfsync everysec # AOF策略 每秒寫入
dir /redis/data # AOF文件所在目錄
no-appendfsync-no-rewrite yes # 在執(zhí)行重寫時不進行AOF操作
auto-aof-rewrite-percentage 100 # AOF重寫配置(見上文)
auto-aof-rewrite-min-size 64MB # AOF重寫配置(見上文)
RDB與AOF策略
關(guān)閉RDB自動執(zhí)行配置 打開AOF(如果只是純作為緩存使用可以不開AOF),對重寫集中管理(預留30%的內(nèi)存),使用每秒everysec