## 一、持久化的作用
* 什么是持久化
* redis所有數(shù)據(jù)保存在內(nèi)存中,對數(shù)據(jù)的更新將異步地保存到磁盤上。
* 持久化方式
* 快照 - 某事某點(diǎn)數(shù)據(jù)的完整備份
* MySQL Dump
* Redis RDB
* 寫日志 - 只要有操作就記錄到日志中
* MySQL Binlog
* Hbase HLog
* Redis AOF
## 二、RDB
* 什么是RDB
* 通過一條命令將redis內(nèi)存中的數(shù)據(jù)完整生成一個(gè)快照保存到硬盤當(dāng)中,也就是RDB文件(二進(jìn)制),進(jìn)行持久化。
* 對redis進(jìn)行重啟,可以加載 RDB文件,進(jìn)行恢復(fù)。
* 觸發(fā)機(jī)制-主要三種方式
* save 同步
* 向redis發(fā)送一個(gè)save命令,創(chuàng)建RDB文件,會(huì)造成redis阻塞。
* 文件策略:如存在老的RDB文件,新替換老。
* 負(fù)責(zé)度:O(N)
* bgsave 異步
* 在redis主進(jìn)程生產(chǎn)fork() 子進(jìn)程,創(chuàng)建RDB文件
* 如果fork 慢,會(huì)阻塞主進(jìn)程。非常快的情況不會(huì)阻塞主進(jìn)程。
* 自動(dòng)
* 默認(rèn)配置
| 配置 | seconds | changes |
| --- | --- | --- |
| save | 900 | 1 |
| save | 300 | 10 |
| save | 60 | 10000 |
當(dāng)900秒內(nèi)有1條修改則執(zhí)行save,當(dāng)300秒內(nèi)有10條修改則執(zhí)行save,當(dāng)60秒內(nèi)有10000條修改則執(zhí)行save
| 配置 | 參數(shù) | 說明 |
| --- | --- | --- |
| dbfilename | dump.rdb | 生產(chǎn)的文件名 |
| dir | ./ | 保存的文件路徑 |
| stop-writes-on-bgsave-error | yes | 發(fā)生錯(cuò)誤是否停止寫入 |
| rdbcompression | yes | 是否采用壓縮格式 |
| rdbchecksum | yes | 是否進(jìn)行檢驗(yàn) |
* 推薦配置
| 配置 | 參數(shù) |
| --- | --- |
| dbfilename | dump-${port}.rdb |
| dir | /bigdiskpath |
| stop-writes-on-bgsave-error | yes |
| rdbcompression | yes |
| rdbchecksum | yes |
* save 與 bgsave 的不同
| 命令 | save | bgsave |
| --- | --- | --- |
| IO類型 | 同步 | 異步 |
| 阻塞? | 是 | 是(阻塞發(fā)生在fork) |
| 復(fù)雜度 | O(n) | O(n) |
| 優(yōu)點(diǎn) | 不會(huì)消耗額外內(nèi)存 | 不阻塞客戶端命令 |
| 缺點(diǎn) | 阻塞客戶端命令 | 需要fork,消耗內(nèi)存 |
* 觸發(fā)機(jī)制-不容忽視方式
* 全量復(fù)制,即主從復(fù)制
* debug reload,發(fā)生錯(cuò)誤時(shí)需建立RDB
* shutdown,重啟時(shí)建立RDB
* 總結(jié)
* RDB是Redis內(nèi)存到硬盤的快照,用于持久化。
* save通常會(huì)阻塞Redis。
* bgsave不會(huì)阻塞Redis,但是會(huì)fork新進(jìn)程。
* save自動(dòng)配置滿足任一條件就會(huì)被執(zhí)行。
* 有些觸發(fā)機(jī)制不容忽視
## 三、AOF
* RDB有什么問題
* 耗時(shí)、耗性能
* 需要把所有數(shù)據(jù)dumo到磁盤中,耗時(shí)O(n)的過程
* fork() : 消耗內(nèi)存,copy-on-writh策略
* Disk I/O : IO性能消耗
* 不可控、丟失數(shù)據(jù)
| 時(shí)間戳 | save |
| --- | --- |
| T1 | 執(zhí)行多個(gè)寫命令 |
| T2 | 滿足RDB自動(dòng)創(chuàng)建的條件 |
| T3 | 再次執(zhí)行多個(gè)寫命令 |
| T4 | 宕機(jī) |
當(dāng)T1時(shí)間點(diǎn)執(zhí)行了很多寫命令,在T2時(shí)間點(diǎn)滿足RDB自動(dòng)創(chuàng)建的條件,T3時(shí)間點(diǎn)又執(zhí)行了很多寫命令,T4時(shí)間點(diǎn)宕機(jī)了,T3-T4時(shí)間段的寫入命令會(huì)丟失。
* AOF運(yùn)行原理
* 創(chuàng)建 -- 以寫日志的方式把每一條寫命令追加到AOF文件當(dāng)中
* redis在執(zhí)行寫命令時(shí),會(huì)寫到硬盤的緩沖區(qū)當(dāng)中,緩沖區(qū)會(huì)根據(jù)一些**策略**把寫命令的日志刷新到磁盤當(dāng)中
* 恢復(fù) -- 當(dāng)發(fā)生宕機(jī)時(shí),重啟之后將AOF文件載入到Redis當(dāng)中,進(jìn)行數(shù)據(jù)恢復(fù)。
* AOF的三種策略
* always
* 寫每條命令都會(huì)fsync到磁盤
* everysec
* 每秒把緩沖區(qū) fsync 到磁盤,出現(xiàn)故障有可能會(huì)丟失一秒的數(shù)據(jù)
* no
* 根據(jù)操作系統(tǒng)決定,操作系統(tǒng)說什么時(shí)候 刷,就什么時(shí)候刷。
| 命令 | always | everysec | no |
| --- | --- | --- | --- |
| 優(yōu)點(diǎn) | 不丟失數(shù)據(jù) | 每秒一次 fsync 丟1秒數(shù)據(jù) | 不用管 |
| 缺點(diǎn) | IO開銷較大,一般的 sata 盤只有幾百 TPS | 丟1秒數(shù)據(jù) | 不可控 |
* AOF重寫
* 把過期的、沒有用的、重復(fù)的以及可以優(yōu)化的命令進(jìn)行化簡,化簡為一個(gè)很小的AOF文件。
* 減少硬盤占用量
* 加速恢復(fù)速度
* AOF重寫實(shí)現(xiàn)的兩種方式
* bgrewriteaof
* 由客戶端發(fā)送 bgrewriteaof 命令到服務(wù)端,redis接收到命令后會(huì) fork 出一個(gè)子進(jìn)程,來完成AOF重寫。
* AOF重寫配置---實(shí)現(xiàn)自動(dòng)重寫
| 配置名 | 含義 |
| --- | --- |
| auto-aof-rewrite-min-size | AOF文件重寫需要的尺寸 |
| auto-aof-rewrite-percentage | AOF 文件增長率 |
| 統(tǒng)計(jì)名 | 含義 |
| --- | --- |
| aof_current_size | AOF當(dāng)前尺寸(單位:字節(jié)) |
| aof_base_size | AOF上次啟動(dòng)和重寫的尺寸(單位:字節(jié)) |
* 自動(dòng)觸發(fā)時(shí)機(jī)
* 當(dāng)前尺寸 > 最小尺寸
* (當(dāng)前尺寸 - 最小尺寸) / 最小尺寸 > 增長率
* 配置
| 命令 | 配置 | 說明 |
| --- | --- | --- |
| appendonly | yes | 開打AOF功能 |
| appendfilename | appendonly-${port}.aof | AOF生產(chǎn)的文件名 |
| appendfsync | everysec | 同步的策略 |
| dir | /bigdiskpath | 保存的目錄 |
| no-appendfsync-on-rewrite | yes | 是否在重寫的時(shí)候,關(guān)閉 AOF 的 appen操作,如果不關(guān)閉有可能會(huì)導(dǎo)致數(shù)據(jù)丟失,這里是 yes ,重寫時(shí)不做其他操作 |
| auto-aof-rewrite-percentage | 100 | 增長率 |
| auto-aof-rewrite-min-size | 64mb | 最小尺寸 |
* RDB和AOF抉擇
| 命令 | RDB | AOF |
| --- | --- | --- |
| 啟動(dòng)優(yōu)先級 | 低 | 高 |
| 體積 | 小 | 大 |
| 恢復(fù)速度 | 快 | 慢 |
| 數(shù)據(jù)安全性 | 丟數(shù)據(jù) | 根據(jù)策略決定 |
| 操作的輕重 | 重,因?yàn)樗僮魅康膔edis數(shù)據(jù) | 輕,日志追加的方式 |
* RDB最佳策略
* “關(guān)”- 在主從會(huì)用到
* 集中管理 - 如果需要按天按小時(shí)備份數(shù)據(jù),是個(gè)不錯(cuò)的選擇。
* 主從,從開?
* AOF最佳策略
* “開”:緩存和存儲(chǔ) -- 如果只當(dāng)緩存可以關(guān)掉
* AOF重寫集中管理
* everysec
* 最佳策略
* 小分片 -
* 緩存或者存儲(chǔ) - 根據(jù)緩存或存儲(chǔ)的特性決定使用那種策略
* 監(jiān)控(硬盤、內(nèi)存、負(fù)載、網(wǎng)絡(luò))
* 足夠的內(nèi)存
