一、持久化的作用
1.什么是持久化
redis的所有數(shù)據(jù)保存在內(nèi)存中,對數(shù)據(jù)的更新將異步的保存到硬盤上
2.持久化的實現(xiàn)方式
快照:某時某刻數(shù)據(jù)的一個完成備份 ? ?-mysql的Dump ? ?-redis的RDB寫日志:任何操作記錄日志,要恢復(fù)數(shù)據(jù),只要把日志重新走一遍即可 ? ?-mysql的 Binlog ? ?-Hhase的 HLog ? ?-Redis的 AOF
二、RDB
1.什么是RDB
2.觸發(fā)機制-主要三種方式
第一種:save(同步)1 客戶端輸入save命令—-》redis服務(wù)端—-》同步創(chuàng)建RDB二進制文件2 會造成redis的阻塞(數(shù)據(jù)量非常大的時候)3 文件策略:如果老的RDB存在,會替換老的4 復(fù)雜度 o(n)第二種:bgsave(異步,Backgroud saving started)1 客戶端輸入save命令—-》redis服務(wù)端—-》異步創(chuàng)建RDB二進制文件(fork函數(shù)生成一個子進程(fork會阻塞reids),執(zhí)行createRDB,執(zhí)行成功,返回給reids消息)2 此時訪問redis,會正常響應(yīng)客戶端3 文件策略:跟save相同,如果老的RDB存在,會替換老的4 復(fù)雜度 o(n)第三種:(常用方式)(******)自動(通過配置文件)配置 ? seconds ? changessave ? 900 ? ? ? ?1save ? 300 ? ? ? ?10save ? 60 ? ? ? ? 10000如果60s中改變了1w條數(shù)據(jù),自動生成rdb如果300s中改變了10條數(shù)據(jù),自動生成rdb如果900s中改變了1條數(shù)據(jù),自動生成rdb
以上三條符合任意一條,就自動生成rdb,內(nèi)部使用bgsave
#配置:
save 900 1 #配置一條
save 300 10 #配置一條
save 60 10000 #配置一條
dbfilename dump.rdb ?#rdb文件的名字,默認(rèn)為dump.rdb
dir ./ #rdb文件存在當(dāng)前目錄
stop-writes-on-bgsave-Error yes #如果bgsave出現(xiàn)錯誤,是否停止寫入,默認(rèn)為yes
rdbcompression yes #采用壓縮格式
rdbchecksum yes #是否對rdb文件進行校驗和檢驗
#最佳配置
save 900 1
save 300 10
save 60 10000 dbfilename dump-${port}.rdb
?#以端口號作為文件名,可能一臺機器上很多reids,不會亂
dir /bigdiskpath #保存路徑放到一個大硬盤位置目錄
stop-writes-on-bgsave-error yes
#出現(xiàn)錯誤停止
rdbcompression yes #壓縮
rdbchecksum yes #校驗
RDB觸發(fā)機制一般使用第三種方式,但是這種方式也會有缺點。如果修改的條數(shù)沒有在設(shè)置范圍內(nèi)那么就不會觸發(fā),就會引發(fā)很多數(shù)據(jù)沒有持久化的情況。所以我們一般采用下面方式:AOF。
如果是保存不重要的數(shù)據(jù)可以使用RDB方式(比如緩存數(shù)據(jù)),如果是保存很重要的數(shù)據(jù)就要使用AOF,但是兩種方式也可以同時使用。
三、AOF
1.RDB問題
耗時,耗性能。不可控,可能會丟失數(shù)據(jù)。
2.AOF介紹
客戶端每寫入一條命令,都記錄一條日志,放到日志文件中,如果出現(xiàn)宕機,可以將數(shù)據(jù)完全恢復(fù)
3.AOF的三種策略
日志不是直接寫到硬盤上,而是先放在緩沖區(qū),緩沖區(qū)根據(jù)一些策略,寫到硬盤上
#第一種:always:redis–》寫命令刷新的緩沖區(qū)—》每條命令fsync到硬盤—》AOF文件
#第二種:everysec(默認(rèn)值):redis——》寫命令刷新的緩沖區(qū)—》每秒把緩沖區(qū)fsync到硬盤–》AOF文件
#第三種:no:redis——》寫命令刷新的緩沖區(qū)—》操作系統(tǒng)決定,緩沖區(qū)fsync到硬盤–》AOF文件
命令 | always | everysec | no |
優(yōu)點 | 不丟失數(shù)據(jù) ?? | 每秒一次fsync,丟失1秒數(shù)據(jù) | ?不用管? |
缺點 ?? | IO開銷大,一般的sata盤只有幾百TPS | 丟1秒數(shù)據(jù) | 不可控 |
4.AOF重寫
隨著命令的逐步寫入,并發(fā)量的變大, AOF文件會越來越大,通過AOF重寫來解決該問題
原生AOF | AOF重寫 |
set hello world set hello Java set hello hehe incr counter ncr counter rpush mylist a rpush mylist b rpush mylist c 過期數(shù)據(jù) |
set hello hehe set counter 2 rpush mylist a b c ?? |
本質(zhì)就是把過期的,無用的,重復(fù)的,可以優(yōu)化的命令,來優(yōu)化這樣可以減少磁盤占用量,加速恢復(fù)速度
實現(xiàn)方式
bgrewriteaof:客戶端向服務(wù)端發(fā)送bgrewriteaof命令,服務(wù)端會起一個fork進程,完成AOF重寫
AOF重寫配置:
重寫流程
AOF配置文件 (******)
appendonly yes #將該選項設(shè)置為yes,打開appendfilename “appendonly-${port}.aof” #文件保存的名字appendfsync everysec #采用第二種策略dir /bigdiskpath #存放的路徑no-appendfsync-on-rewrite yes #在aof重寫的時候,是否要做aof的append操作,因為aof重寫消耗性能,磁盤消耗,正常aof寫磁盤有一定的沖突,這段期間的數(shù)據(jù),允許丟失
四、RDB和AOF的選擇
1.rdb和aof的比較
命令 | rdb | aof |
啟動優(yōu)先級 | 低 ?? | 高(掛掉重啟,會加載aof的數(shù)據(jù)) ?? |
體積 | 小? | 大 |
恢復(fù)速度 ?? | ?快 | 慢 |
數(shù)據(jù)安全性 ?? | 丟數(shù)據(jù)? | 根據(jù)策略決定 ?? |
輕重 ?? | 重 ?? | 輕 |
2.rdb最佳策略
rdb關(guān)掉,主從操作時
集中管理:按天,按小時備份數(shù)據(jù)
主從配置,從節(jié)點打開
3.aof最佳策略
開:緩存和存儲,大部分情況都打開,
aof重寫集中管理
everysec:通過每秒刷新的策略
4.最佳策略
小分片:每個redis的最大內(nèi)存為4g
緩存或存儲:根據(jù)特性,使用不通策略
時時監(jiān)控硬盤,內(nèi)存,負(fù)載網(wǎng)絡(luò)等
有足夠內(nèi)存