redis AOF

歷精圖治發表於2018-11-11

RDB問題:

  • 耗時耗效能
  • 容易丟失資料

耗時耗效能

  • O(n)資料 耗時
  • fork() :消耗記憶體,copy-on-write 策略
  • Disk I/O :IO效能

不可控 丟失資料

時間 save
T1 執行多個寫命令
T2 滿足RDB自動建立的條件
T3 再次執行多個寫命令
T4 當機

AOF 執行原理 -建立

set hello world

AOF檔案  
set hello world  
hmset myhash a  b  
sadd myset a b  
key value
hello string:world
myhash hash:{“a”:“b”}
myset set:[“a”:“b”]

AOF 三種策略

  • always
  • eversec
  • no

always

1:redis寫命令到重新整理的緩衝區
2:每條命令fsync到硬碟aof檔案

everysec 系統預設值

1:redis寫命令到重新整理的緩衝區
2:每秒把緩衝區fsync到硬碟 aof檔案
缺點當機可能會丟失1秒的資料

no

1:根據作業系統
os決定fysnc

always everysec no 優缺點

命令 always everysync no
優點 不丟失資料 每秒一次fysnc 丟1秒資料 不用管
缺點 IO開銷比較大,一般的sata盤只有幾百tps 丟1秒資料 不可控

AOF重寫

原生AOF AOF重寫
set hello world set hello hehe
set hello java set counter 2

AOF重寫作用

減少硬碟用量
加速恢復速度

AOF重寫實現兩種方式

bgrewriteaof
aof重寫配置

bgrewriteaof命令

  1. client傳送命令bgrewriteaof 到redis
  2. redis master 接收
  3. redis開啟子程式
  4. aof重寫到aof檔案

AOF從重寫自動配置

配置名 含義
auto-aof-rewrite-min-size aof 檔案重寫需要的尺寸
auto-aof-rewrite-percentage aof 檔案增長率

統計

統計名 含義
aof_current_size aof 當前尺寸 單位位元組
aof_base_size aof 上次啟動和重寫的尺寸

AOF重寫配置

同時滿足

  • aof_current_size >auto-aof-rewrite-min-size
  • aof-current_size - aof_base_size/aof_base_size > auto-aof_rewrite-percentage

redis.conf

appendonly  yes   #開啟aof功能 
appendfilename "appendonly-${port}.aof"   //aof檔名稱
appendfsync everysec     //同步策略  
dir /bigdiskpath        //儲存rdb  aof  log 目錄 
no-appendfsync-on-rewrite yes  //不進行aof 重寫  
auto-aof-rewrite-percentage 100 
auto-aof-rewrite-min-size 64mb 
aof-load-truncated yes //防止出現斷電後aof不完整 

AOF 演示

redis-cli  
dbsize  
vim redis.cong 
appendonly  yes 
appendfilename "appendonly-6379.aof"
appendfsync 
config get appendonly 
"appendonly"
"no" 
config get appendonly yes 
ok 
config rewrite 
ok 
exit 
redis-cli 
set 

相關文章