持久化
Redis 如同其他的儲存元件一樣,提供了兩類持久化方式:快照,和全量追加日誌。
RDB - 快照
在預設情況下, Redis 將資料庫快照儲存在名字為dump.rdb
的二進位制檔案中。
你可以對 Redis 進行設定, 讓它在“ N 秒內資料集至少有 M 個改動”這一條件被滿足時, 自動儲存一次資料集。
你也可以通過呼叫 SAVE
或者 BGSAVE
, 手動讓 Redis 進行資料集儲存操作。
這種持久化方式被稱為快照 snapshotting
.
-
SAVE
:暫停服務,寫dump.rdb,比如停止時執行 -
BGSAVE
:通過fork
系統呼叫建立子程式寫 dump.rdb
# 配置寫入策略(針對bgsave):
save 900 1 #(900秒內至少1個key被寫)
save 300 10 #(300秒內至少10個key被寫)
save 60 10000 #(60秒內至少1000個key被寫)
# 如果不需要RDB,可以設定:
save ""
# 設定 rdb 檔名稱 和 儲存目錄
dbfilename dump.rdb
dir /var/lib/redis/6379
AOF - 只追加操作的檔案(Append-only file,AOF)
快照功能並不是非常耐久(durable): 如果 Redis 因為某些原因而造成故障停機, 那麼伺服器將丟失最近寫入、且仍未儲存到快照中的那些資料。
從 1.1 版本開始, Redis 增加了一種完全耐久的持久化方式: AOF 持久化。
appendonly yes #(開啟AOF)
appendfilename "appendonly.aof"
每當 Redis 執行一個改變資料集的命令時(比如 SET), 這個命令就會被追加到 AOF 檔案的末尾。
這樣的話, 當 Redis 重新啟時, 程式就可以通過重新執行 AOF 檔案中的命令來達到重建資料集的目的。
fsync 同步刷盤策略
你可以配置 Redis 多久才將資料 fsync 到磁碟一次。有三種方式:
- 每次有新命令追加到 AOF 檔案時就執行一次 fsync :非常慢,也非常安全
- 每秒 fsync 一次:足夠快(和使用 RDB 持久化差不多),並且在故障時只會丟失 1 秒鐘的資料。
- 從不 fsync :將資料交給作業系統來處理。更快,也更不安全的選擇。
- 推薦(並且也是預設)的措施為每秒 fsync 一次, 這種 fsync 策略可以兼顧速度和安全性。
# fsync同步刷盤策略
# appendfsync always #(立刻同步刷盤,最慢,也最安全)
appendfsync everysec #(每秒才觸發一次同步刷盤,推薦)
# appendfsync no # (不採用同步刷盤,最快,相對不安全)
日誌重寫
因為 AOF 的運作方式是不斷地將命令追加到檔案的末尾, 所以隨著寫入命令的不斷增加, AOF 檔案的體積也會變得越來越大。
舉個例子, 如果你對一個計數器呼叫了 100 次 INCR , 那麼僅僅是為了儲存這個計數器的當前值, AOF 檔案就需要使用 100 條記錄(entry)。
然而在實際上, 只使用一條 SET 命令已經足以儲存計數器的當前值了, 其餘 99 條記錄實際上都是多餘的。
為了處理這種情況, Redis 支援一種有趣的特性: 可以在不打斷服務客戶端的情況下, 對 AOF 檔案進行重建(rebuild)。
執行 BGREWRITEAOF
命令, Redis 將生成一個新的 AOF 檔案, 這個檔案包含重建當前資料集所需的最少命令。
# 配置:AOF檔案每次增長指定大小的百分比後,就會觸發BGREWRITEAOF
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
從 Redis 4.0 開始,AOF重寫邏輯變動了:
- 老資料採用 RDB 的
fork
寫入 aof檔案的頭部 - 以後增量的命令追加到aof檔案尾部
這樣的方式,AOF是一個混合體,利用了RDB的快,利用了日誌的全量,使得 Redis 持久化更加安全和完善。
@SvenAugustus (https://my.oschina.net/langxS...