Redis學習筆記(10)——主從複製

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();
        }
    }
}

View Code

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文件恢復數據。

相關文章
相關標籤/搜索