rdb方式的持久化是經過快照完成的。符合必定條件時redis會自動將內存中的全部數據生成一份副本並存儲在硬盤上,這個過程叫快照。如下幾種狀況會對數據進行快照:
1 根據配置規則進行自動快照
2 用戶執行save 或 bgsve命令
3 執行 flushall 命令
4 執行復制時redis
根據配置:save 900 1 ,在900秒內有一個及以上的鍵被更改則進行快照。
save 或 bgsave :當進行服務重啓、手動遷移以及備份時咱們要手動執行。
- save : redis同步地進行快照操做,在快照執行過程當中會阻塞全部來自客戶端的請求。
- bgsave:能夠在後臺異步地進行快照的操做,執行後會當即返回OK表示開始執行快照操做。若是想知道是否執行完成可使用lastSave命令獲取最近一次成功執行快照的時間。異步看下面原理。
flushAll 命令:redis會清除數據庫中全部數據,無論觸發快照與否,只要自動快照條件不爲空,就會執行一次。數據庫
執行復制時:當設置了主從模式時,redis會在複製初始化時進行自動快中啊。緩存
使用fork函數複製一份當前進程的副本(子進程)
父進程繼續接受並處理客戶端發來的命令,而子進程開始將內存中的數據寫入硬盤。
寫完全部數據,會該臨時文件替代舊的RDB文件。
PS :redis重啓後會讀取 RDB 快照文件,將數據載入內存。(執行fork時,操做系統使用寫時複製copy-on-write策略,實際上看上去像是生成了一分內存備份保證子進程不受影響,實際內存不會增長。)進行快照時不會修改硬盤的rdb文件,執行完會將舊文件替換成新的。網絡
使用redis存儲非臨時數據時app
默認沒有開啓,開啓後每執行一條會更改數據,會寫入硬盤的AOF文件。默認文件名是appendonly.aof,能夠經過appendfilename參數修改。less
AOF以純文本的形式記錄了redis執行的寫命令。達到必定條件,redis會重寫AOF文件,節省空間,保留最後的數據。配置: auto-aof-rewrite-percentage 100。
同步硬盤數據:因爲操做系統的緩存機制,數據並無真正地寫入硬盤,而是進入硬盤的緩存。默認狀況下,系統30秒會執行一次同步。在這三十秒可能會致使數據丟失,經過參數 appendfsync設置能夠每秒執行一次同步操做(默認 everysec,no 表表示不主動同步由操做系統來同步,always表示每次執行寫入都會執行同步)。
redis容許 同時開啓 AOF 和 RDB , AOF 方式的持久化可能丟失的數據更少。異步
一個主庫能夠擁有多個從庫,一個從庫只能擁有一個主庫,從庫通常是隻讀。從庫也能夠擁有從庫。函數
配置方法 :1 從庫配置文件加 「slaveof 主庫地址 主庫端口」,主庫無需配置 2 redis命令,從庫中:slaveof 主庫地址 主庫端口。啓動 另外一個Redis實例,監聽 6379 端口:Redis -service --port 6380 --slaveof 127.0.0.1 6379
redis命令:INFO replication 查看信息。經過從庫的配置文件中的slave-read-only 爲 no 可使從庫可寫。性能
從庫啓動,向主庫發送SYNC,主庫收到命令,開始保存快照(即RDB持久化的過程),並將此期間收到的命令緩存起來。快照完成,發給從庫,從庫使用快照和緩存加載數據,完成複製。
(斷開後重連,會從新複製初始化。即便數據只更新幾條也從新保存快照,這樣效率低下。後面提供了 有條件的增量數據傳輸。)從庫同步的時候不會阻塞,serve-stale-data no : 從庫備份時不響應請求。優化
前面是複製初始化,接下來是複製同步過程,主庫的熱河會致使數據變化的命令都會異步傳給從庫。此過程會一直持續貫穿整個主從同步過程指導主從關係終止。
爲了提升性能,開啓從庫持久化,禁用主庫持久化。當主庫崩了,須要手工從從庫恢復數據: 1 從庫使用 slaveof no one 命令,將從庫提高爲主庫 2 啓動崩潰的主庫,使用 slave 命令變爲從庫。
若是主庫快照被關閉,則會進行無硬盤複製:直接經過網絡發送數據給從庫。配置文件:repl-diskless-sync yes
斷線重連狀況下的優化,Redis會有個ID,根據ID,以前的緩存被放在積壓隊列中,收到主庫的命令時會記錄下命令的偏移量,而後根據偏移量對這些進行執行。
只須要將每一個數據節點的 Cluster-enabled yes配置選項打開便可。每一個集羣中至少有3個主庫才能正常運行。
節點,槽,槽的從新分配,複製與故障轉移
功能:1 監控數據庫的正常運行 2 主庫故障自動提高從庫爲主庫
使用:(1) 創建sentinel.conf文件,內容爲 :sentinel monitor 主數據庫名 "ip" "port" 1; (2)接下來啓動sentinel進程,將上述配置文件的路徑傳給哨兵。redis - sentinel /.../sentinel.conf
原理:創建兩條連接,一條訂閱主庫的sentinel: hello 頻道,另外一個定時向主庫發送INFO命令。 爲每一個主庫或者從庫部署一個哨兵。