大家可以先看這篇文章ASP.NET Redis 開發對Redis有個初步的瞭解 Redis的主從複製功能非常強大,一個master可以擁有多個slave,而一個slave又可以擁有多個slave,如此下去,形成了強大的多級伺服器集群架構. 實現步驟如下: 1.在Windows某個磁碟上創建兩個目錄, ...
大家可以先看這篇文章ASP.NET Redis 開發對Redis有個初步的瞭解
Redis的主從複製功能非常強大,一個master可以擁有多個slave,而一個slave又可以擁有多個slave,如此下去,形成了強大的多級伺服器集群架構.
實現步驟如下:
1.在Windows某個磁碟上創建兩個目錄,例如; MasterRedis(存儲的是Master服務) SlaveRedis(存儲的是Slave服務).
2.在Master服務中的配置文件redis.conf修改 :bind 127.0.0.1.
3.在Slave服務中的配置文件redis.conf修改:
port 6381(服務埠號要分開)
bind 127.0.0.1
slaveof 127.0.0.1 6379 (設置master的Host以及Port)
4.分別啟動Master服務與Slave服務。
註意到,當我啟動master,然後啟動一個slave的時候,可以發現slave上:
會發送一個SYNC請求,從Master上面進行相應,而且它支持自動重連,
即當master掉線的情況下,它會處於等待請求的狀態。
而Master上:
第一次Slave向Master同步的實現是:Slave向Master發出同步請求,Master先dump出rdb文件,然後將rdb文件全量傳輸給slave,然後Master把緩存的命令轉發給Slave,初次同步完成。第二次以及以後的同步實現是:Master將變數的快照直接實時依次發送給各個Slave。不管什麼原因導致Slave和Master斷開重連都會重覆以上過程。Redis的主從複製是建立在記憶體快照的持久化基礎上,只要有Slave就一定會有記憶體快照發生。雖然Redis宣稱主從複製無阻塞,但由於Redis使用單線程服務,如果Master快照文件比較大,那麼第一次全量傳輸會耗費比較長時間,且文件傳輸過程中Master可能無法提供服務,也就是說服務會中斷
Redis數據快照
數據快照的原理是將整個Redis記憶體中的所有的數據遍歷一遍存儲到一個擴展名為rdb的數據文件中,通過save命令
可以調用這個過程。數據快照配置如下:
Save 900 1
Save 300 10
Save 60 10000
以上在redis.conf中的配置指出在多長時間內,有多少次更新操作,就將數據同步到數據文件中,這個可以多個條件進行配合,上面的含義是900秒後有一個key發生改變就執行save,300秒後有10個key發生改變就執行save,60秒有10000個key發生改變就執行save.
數據快照的缺點是持久化之後如果出現系統宕機則會丟失一段數據,因此增加了另外一種追加式的操作日誌記錄,叫append only file,其日誌文件以aof結尾,我們稱為aof文件,要開啟aof日誌的記錄,需要在配置文件中進行如下配置: appendonly yes
Appendonly配置不開啟,可能在斷電時導致一段時間的數據丟失,因為redis本身同步數據文件時按save條件來同步的,所以有的數據會在一段時間內只存在於記憶體中。
Appendfsync no/always/everysec
no:表示等操作系統進行數據緩存同步到磁碟。性能最好,持久化沒有保障。
Always:表示每次更新操作後手動調用fsync()將數據寫到磁碟.每次收到寫命令就立即強制寫入磁碟,最慢的,但是保障完全的持久化。
Everysec:表示每秒同步一次.每秒鐘強制寫入磁碟一次,在性能和持久化方面做了很好的折中。
為了定時減小AOF文件的大小,Redis2.4以後增加了自動的bgrewriteaof的功能,Redis會選擇一個自認為負載低的情況下執行bgrewriteaof,這個重寫AOF文件的過程是很影響性能的。解決方案:Master關閉Save功能,關閉AOF日誌功能,以求達到性能最佳。Slave開啟Save並開啟AOF日誌功能,並開啟bgrewriteaof功能,不對外提供服務,這樣Slave的負載總體上會高於Master負載,但是Master性能達到最好.
Bgrewriterof內部實現:
1.Redis通過fork一個子進程,遍曆數據,寫入新臨時文件
2.父進程繼續處理client請求,子進程繼續寫臨時文件。
3.父進程把新寫入的AOF寫在緩衝區。
4.子進程寫完退出,父進程接收退出消息,將緩衝區AOF寫入臨時文件。
5.臨時文件重命名成appendonly.aof,原來文件被覆蓋,整個過程完成。
Redis數據恢復
當Redis伺服器掛掉以後,重啟時將按以下優先順序恢複數據到記憶體:
1.如果只配置了AOF,重啟時載入AOF文件恢複數據。
2.如果同時配置了RBD和AOF,啟動時只載入AOF文件恢複數據。
3.如果只配置了RDB,啟動時將載入dump文件恢複數據。