4.redis-持久化

1.持久化的做用
2.什麼是持久化:redis全部數據保持在內存中,對數據的更新將異步地保存到磁盤上
3.持久化的實現方式
方式一:快照
實現方式一:mysql dump
實現方式二:redis RDB
方式二:寫日誌
實現方式一:mysql binlog
實現方式二:hbase hlog
實現方式三:redis AOF
4.RDB
(1)什麼是RDB
mysql

(2)觸發機制-主要三種方式
第一種:save(同步)ios

 


文件策略--->如存在老的RDB文件,新替換老
複雜度--->O(N)
IO類型同步,阻塞,複雜度O(n),優勢不會消耗額外內存,缺點,阻塞客戶端命令
命令:redis

127.0.0.1:6379> save OK

第二種:bgsave(異步)

文件策略--->如存在老的RDB文件,新替換老
複雜度--->O(N)
IO類型異步,阻塞發生在fork(子進程),複雜度O(n),優勢不阻塞客戶端命令,缺點,須要fork(子進程),消耗內存
命令:sql

127.0.0.1:6379> bgsave Background saving started

第三種:自動生成RDB
(3)配置:緩存

#若是在9000秒中改變了1條數據自動生成RDB
save 900 1
#若是在300秒中改變了10條數據自動生成RDB
save 300 10
#若是在60秒中改變了10000條數據自動生成RDB
save 60 10000
#rdb文件名字
dbfilename dump.rdb
#rdb文件的路徑(默認當前目錄)
dir ./
#是否中止寫入默認是yes
stop-writes-on-bgsave-error yes
#是否採用壓縮格式
rdbcompression yes
#是否對rdb文件檢驗
rdbchecksum yes

(4)觸發機制-不容忽略方式
1)全量複製
2)debug reload:不將內存清空的重啓,觸發rdb文件生成
3)shutdown:
(5)RDB總結
1)RDB是Redis內存到硬盤的快照,用於持久化
2)save一般會阻塞Redis
3)bgsave不會阻塞Redis,可是會fork新進程
4)save自動配置知足任一就會被執行
5)有些觸發機制不容忽視
5.AOF
(1)RDB現存問題
耗時,耗性能
不可控,丟失數據
(2)什麼是AOF
客戶端每執行一條寫命令,redis就在AOF文件裏追加一條寫命令,當redis宕機後,從AOF文件中把命令重新寫入到redis
(3)AOF三種策略
策略一:always
redis寫命令刷新到緩衝區,緩衝區根據always策略每條命令刷新到AOF文件
優勢:不會丟失數據
缺點:IO開銷較大,通常的sata盤只有幾百TPS
策略二:everysec
redis寫命令刷新到緩衝區,緩衝區根據everysec策略每一秒都刷新到AOF文件
優勢:每秒一次fsync丟1秒數據
缺點:丟1秒數據
策略三:no
redis寫命令刷新到緩衝區,緩衝區根據操做系統來決定何時刷到AOF文件
優勢:不用管
缺點:不可控
(4)AOF重寫:把過時的,沒有用,重複,以及能夠優化的命令化簡,減小磁盤佔用量,加速恢復速度
AOF重寫的兩種方式
方式一:bgrewriteaof
命令:bgrewriteaof
Background append only file rewriting started
方式二:AOF重寫配置
(5)配置:安全

#打開AOF功能默認爲no
appendonly yes
#AOF文件名
appendfilename "AOF文件名"
#AOF目錄
dir /bigdiskpath
#AOF重寫的時候是否作AOF的append操做
no-appendfsync-on-rewrite yes
#AOF文件重寫須要的尺寸
auto-aof-rewrite-min-size
#AOF文件增加率
auto-aof-rewrite-percentage
RDB和AOF的抉擇

(6)統計:網絡

#AOF當前尺寸(單位:字節)
aof_current_size
#AOF上次重啓和重寫的尺寸(單位:字節)
aof_base_size

(7)AOF重寫流程圖
1.bgrewriteaof對父進程執行以後
2.父進程會fork一個子進程
4.子進程完成AOF重寫的過程(將redis內存數據進行一次回溯成寫到新的AOF文件中),
3.1主進程正常進行客戶端寫命令寫到aof_buf當中去寫到AOF文件當中
3.2過程redis會將這段時間的寫命令寫到aof_rewrite_buf文件
5.2當新文件生成以後,會將新文件補充道新AOF文件
5.3用新的AOF文件替換舊的AOF文件

6.Redis持久化的取捨和選擇
(1)RDB和AOF的抉擇
app

啓動優先級:RDB低     AOF高
體積      :RDB小    AOF大
恢復速度  :RDB快     AOF慢
數據安全性:RDB丟數據  AOF根據策略決定
輕重     :RDB重     AOF輕

(2)RDB最佳策略
集中管理
主從,從開
(3)AOF最佳策略
開緩存和存儲
AOF重寫集中管理
everysec每秒去刷
(4)最佳策略
小分片
緩存或者存儲
監控(硬盤,內存,負載,網絡)
7.開發運維常見問題
(1)fork操做
<1>同步操做
<2>與內存量信息相關:內存越大,耗時越長(與機器類型有關)
<3>info:latest_fork_usec 查看fork執行時間
(2)改善fork
<1>優化使用物理機或高效支持fork操做的虛擬化技術
<2>控制Redis實例最大可用內存:maxmemory
<3>合理配置liunx內存分配策略:vm.overcommit_memory=1
<4>下降fork頻率:列如放寬AOF重寫自動觸發時機,沒必要要的全量複製
(3)進程外開銷
<1>CPU:
開銷:RDB和AOF文件生成,屬於CPU密集型
優化:不作CPU綁定,不和CPU密集型部署
<2>內存:
開銷:fork內存開銷,copy-on-write
優化:echo never > /sys/kernel/mm/transparent_hugepage/enabled
<3>硬盤
開銷:AOF和RDB文件寫入,能夠結合iostat,iotop分析
硬盤優化:
不要和高硬盤服務部署一塊兒:存儲服務,消息隊列等
no-appendfsync-on-rewrite = yes
根據寫入量決定磁盤類型:列如ssd
單機多實例持久化文件目錄能夠考慮分盤
(4)AOF追加阻塞
主線程負責寫入AOF緩衝區,同時它還有一個同步線程進行每秒刷盤動做,同時還記錄最近一次同步時間,主線程負責對比上一次同步時間,若是距離上次同步時間大於兩秒阻塞,小於兩秒經過

(5)AOF阻塞定位
<1>redis日誌
<2>單機多實例部署
運維

相關文章
相關標籤/搜索