Redis主從復制


大家可以先看這篇文章ASP.NET Redis 開發對Redis有個初步的了解

Redis的主從復制功能非常強大,一個master可以擁有多個slave,而一個slave又可以擁有多個slave,如此下去,形成了強大的多級服務器集群架構

master上執行寫操作,在slave上面進行讀操作,因為我們大多數場景查多一些。

實現步驟如下:

1.Windows某個磁盤上創建兩個目錄,例如; MasterRedis(存儲的是Master服務) SlaveRedis(存儲的是Slave服務).

把Reidis文件分別拷貝一份到這兩個目錄中。

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 (設置masterHost以及Port

4.分別啟動Master服務與Slave服務。

啟動Master服務,開始——運行——CMD

啟動Slave服務,開始——運行——CMD

這個時候會發現我們主從服務器配置都正確了。

接下來,我們嘗試在master服務器里面寫一條數據,然后看slave服務器上面能查詢到么

再打開一個CMD窗口,

D:\Redis服務\MasterRedis>redis-cli.exe -h 127.0.0.1 -p 6379
redis 127.0.0.1:6379> set name "鄒瓊俊"
OK
redis 127.0.0.1:6379>

 由於我們默認的redis配置:Save 900 1,表示有1個key改變,900秒以后執行快照,那么15分鍾后才會同步到slave服務器。

15分鍾后,打開slave服務器目錄下面的dump.rdb進行查看:,表示已經同步到slave上面去了。

注意到,當我啟動master,然后啟動一個slave的時候,可以發現slave上: 

[5444] 17 Apr 08:39:57 * MASTER <-> SLAVE sync started
[5444] 17 Apr 08:39:57 * Non blocking connect for SYNC fired the event.
[5444] 17 Apr 08:39:58 * MASTER <-> SLAVE sync: receiving 10 bytes from master
[5444] 17 Apr 08:39:58 * MASTER <-> SLAVE sync: Loading DB in memory
[5444] 17 Apr 08:39:58 * MASTER <-> SLAVE sync: Finished with success

會發送一個SYNC請求,從Master上面進行相應,而且它支持自動重連,

即當master掉線的情況下,它會處於等待請求的狀態。

Master上:

 

第一次SlaveMaster同步的實現是:SlaveMaster發出同步請求,Masterdumprdb文件,然后將rdb文件全量傳輸給slave,然后Master把緩存的命令轉發給Slave,初次同步完成。第二次以及以后的同步實現是:Master將變量的快照直接實時依次發送給各個Slave。不管什么原因導致SlaveMaster斷開重連都會重復以上過程。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秒后有10key發生改變就執行save,60秒有10000key發生改變就執行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.如果同時配置了RBDAOF,啟動時只加載AOF文件恢復數據。

3.如果只配置了RDB,啟動時將加載dump文件恢復數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM