1、什麼是Redis主從複製redis
主從複製,當用戶往Master端寫入數據時,經過Redis Sync機制將數據文件發送至Slave,Slave也會執行相同的操做確保數據一致;且實現Redis的主從複製很是簡單。數據庫
2、Redis主從複製原理c#
在Slave啓動並鏈接到Master以後,它將主動發送一個SYNC命令。此後Master將啓動後臺存盤進程,同時收集全部接收到的用於修改數據集的命令,在後臺進程執行完畢後,Master將傳送整個數據庫文件到Slave,以完成一次徹底同步。而Slave服務器在接收到數據庫文件數據以後將其存盤並加載到內存中。此後,Master繼續將全部已經收集到的修改命令,和新的修改命令依次傳送給Slaves,Slave將在本次執行這些數據修改命令,從而達到最終的數據同步。緩存
若是Master和Slave之間的連接出現斷連現象,Slave能夠自動重連Master,可是在鏈接成功以後,一次徹底同步將被自動執行。服務器
若是Master同時收到多個 slave發來的同步鏈接命令,只會使用啓動一個進程來寫數據庫鏡像,而後發送給全部slave。網絡
3、Redis主從複製特色架構
一、同一個Master能夠擁有多個Slaves。spa
二、Master下的Slave還能夠接受同一架構中其它slave的連接與同步請求,實現數據的級聯複製,即Master->Slave->Slave模式;線程
三、Master以非阻塞的方式同步數據至slave,這將意味着Master會繼續處理一個或多個slave的讀寫請求;code
四、Slave端同步數據也能夠修改成非阻塞是的方式,當slave在執行新的同步時,它仍能夠用舊的數據信息來提供查詢;不然,當slave與master失去聯繫時,slave會返回一個錯誤給客戶端;
五、主從複製具備可擴展性,即多個slave專門提供只讀查詢與數據的冗餘,Master端專門提供寫操做;
六、經過配置禁用Master數據持久化機制,將其數據持久化操做交給Slaves完成,避免在Master中要有獨立的進程來完成此操做。
4、Redis主從複製實現
1.在本地建立兩個目錄:RedisMaster、RedisSlave 。 分別存放Master服務和Slave服務。
2.修改Master服務的配置文件redis.conf(推薦使用文本編譯器打開,例如:Notepad++)
3.修改Slave服務的配置文件redis.conf:
4.開啓主從服務, 咱們先開啓Master服務
而後咱們開啓Slave服務:
當咱們開啓Slave服務時,Master服務的窗口會增長一些信息:
能夠看到在Slave服務啓動並鏈接到Master服務以後,它將主動發送一個SYNC命令,用來同步數據。Master先dump出rdb文件,而後將rdb文件全量傳輸給slave,而後Master把緩存的命令轉發給Slave,初次同步完成。
第二次以及之後的同步實現是:Master將變量的快照直接實時依次發送給各個Slave。無論什麼緣由致使Slave和Master斷開重連都會重複以上過程。Redis的主從複製是創建在內存快照的持久化基礎上,只要有Slave就必定會有內存快照發生。雖然Redis宣稱主從複製無阻塞,但因爲Redis使用單線程服務,若是Master快照文件比較大,那麼第一次全量傳輸會耗費比較長時間,且文件傳輸過程當中Master可能沒法提供服務,也就是說服務會中斷。
5.下面咱們來寫個控制檯程序來試試讀寫分離:
using ServiceStack.Redis; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace String { class Program { static void Main(string[] args) { RedisClient Masterclient = new RedisClient("127.0.0.1", 6379); RedisClient Slaveclient = new RedisClient("127.0.0.1", 6379); Console.WriteLine("Master寫入數據"); string data = Console.ReadLine(); Masterclient.Set<string>("data", data); string readmaster = Slaveclient.Get<string>("data"); Console.WriteLine("Slave讀取數據:"+readmaster); Console.ReadKey(); } } }
5、Redis主從複製存在的問題
在讀《京東雲實踐:淺談Redis主從複製》 時,看到一個問題:主從複製在遇到網絡不穩定的狀況下,Slave和Master斷開(包括閃斷)會致使Master須要將內存中的數據所有從新生成rdb文件(快照文件),而後傳輸給Slave。Slave接收完Master傳遞過來的rdb文件之後會將自身的內存清空,把rdb文件從新加載到內存中。這種方式效率比較低下,尤爲是在數據量大的狀況下,畢竟網絡閃斷未必丟數據或者說丟的數據只是少部分,但卻要爲此付出將整個內存數據都從新傳輸一次的代價。若是可以將閃斷過程的更新數據傳遞給Slave,那麼就不須要將Master內存中的全部數據都傳遞給Slave了。Redis做者在2.8中已經將這個部分複製的思路實現了。
6、Redis數據恢復
當Redis服務器掛掉之後,重啓時將按如下優先級恢復數據到內存:
1.若是隻配置了AOF,重啓時加載AOF文件恢復數據。
2.若是同時配置了RBD和AOF,啓動時只加載AOF文件恢復數據。
3.若是隻配置了RDB,啓動時將加載dump文件恢復數據。