天天看點

redis主從複制和叢集實作原理

redis主從複制

redis主從配置比較簡單,基本就是在從節點配置檔案加上:slaveof 192.168.33.130 6379

主要是通過master server持久化的rdb檔案實作的。master server 先dump出記憶體快照檔案,然後将rdb檔案傳給slave server,slave server 根據rdb檔案重建記憶體表。

redis複制過程如下:

1、slave server啟動連接配接到master server之後,salve server主動發送SYNC指令給master server

2、master server接受SYNC指令之後,判斷,是否有正在進行記憶體快照的子程序,如果有,則等待其結束,否則,fork一個子程序,子程序把記憶體資料儲存為檔案,并發送給slave server

3、master server子程序程序做資料快照時,父程序可以繼續接收client端請求寫資料,此時,父程序把新寫入的資料放到待發送緩存隊列中

4、slave server 接收記憶體快照檔案之後,清空記憶體資料,根據接收的快照檔案,重建記憶體表資料結構

5、master server把快照檔案發送完畢之後,發送緩存隊列中儲存的子程序快照期間改變的資料給slave server,slave server做相同處理,儲存資料一緻性

6、master server 後續接收的資料,都會通過步驟1建立的連接配接,把資料發送到slave server

需要注意:slave server如果因為網絡或其他原因斷與master server的連接配接,當slave server重新連接配接時,需要重新擷取master server的記憶體快照檔案,slave server的資料會自動全部清空,然後再重建立立記憶體表,這樣會讓slave server 啟動恢複服務比較慢,同時也給master server帶來較大壓力,可以看出redis的複制沒有增量複制的概念,這是redis主從複制的一個主要弊端,在實際環境中,盡量規避中途增加從庫

redis2.8之前不支援增量,到2.8之後就支援增量了!

redis cluster(叢集)

3.0之後的功能,至少需要3(Master)+3(Slave)才能建立叢集,是無中心的分布式存儲架構,可以在多個節點之間進行資料共享,解決了Redis高可用、可擴充等問題。

redis叢集提供了以下兩個好處

1、将資料自動切分(split)到多個節點

2、當叢集中的某一個節點故障時,redis還可以繼續處理用戶端的請求。

一個 redis 叢集包含 16384 個哈希槽(hash slot),資料庫中的每個資料都屬于這16384個哈希槽中的一個。叢集使用公式 CRC16(key) % 16384 來計算鍵 key 屬于哪個槽。叢集中的每一個節點負責處理一部分哈希槽。

叢集中的主從複制

叢集中的每個節點都有1個至N個複制品,其中一個為主節點,其餘的為從節點,如果主節點下線了,叢集就會把這個主節點的一個從節點設定為新的主節點,繼續工作。這樣叢集就不會因為一個主節點的下線而無法正常工作

注意:

1、如果某一個主節點和他所有的從節點都下線的話,redis叢集就會停止工作了。redis叢集不保證資料的強一緻性,在特定的情況下,redis叢集會丢失已經被執行過的寫指令

2、使用異步複制(asynchronous replication)是redis 叢集可能會丢失寫指令的其中一個原因,有時候由于網絡原因,如果網絡斷開時間太長,redis叢集就會啟用新的主節點,之前發給主節點的資料就會丢失。

Redis叢集

基本介紹

​Redis​

​​ 叢集是一個可以在多個 ​

​Redis​

​​ 節點之間進行資料共享的設施​

​installation​

​。

​Redis​

​​ 叢集不支援那些需要同時處理多個鍵的 ​

​Redis​

​​ 指令, 因為執行這些指令需要在多個 ​

​Redis​

​​ 節點之間移動資料, 并且在高負載的情況下, 這些指令将降低​

​Redis​

​叢集的性能, 并導緻不可預測的行為。

​Redis​

​​ 叢集通過分區​

​partition​

​​來提供一定程度的可用性​

​availability​

​: 即使叢集中有一部分節點失效或者無法進行通訊, 叢集也可以繼續處理指令請求。

​Redis​

​叢集提供了以下兩個好處:

  • 将資料自動切分​

    ​split​

    ​到多個節點的能力。
  • 當叢集中的一部分節點失效或者無法進行通訊時, 仍然可以繼續處理指令請求的能力。

叢集原理

redis-cluster架構圖

redis主從複制和叢集實作原理
  1. 所有的​

    ​redis​

    ​節點彼此互聯(​

    ​PING​

    ​-​

    ​PONG​

    ​機制),内部使用二進制協定優化傳輸速度和帶寬。
  2. 節點的​

    ​fail​

    ​是通過叢集中超過半數的節點檢測失效時才生效。
  3. 用戶端與​

    ​redis​

    ​節點直連,不需要中間​

    ​proxy​

    ​層.用戶端不需要連接配接叢集所有節點,連接配接叢集中任何一個可用節點即可。
  4. ​redis-cluster​

    ​​把所有的實體節點映射到[​

    ​0-16383​

    ​]​

    ​slot​

    ​上,​

    ​cluster​

    ​ 負責維護​

    ​node​

    ​<->​

    ​slot​

    ​<->​

    ​value​

​Redis​

​​叢集中内置了 ​

​16384​

​​ 個哈希槽,當需要在 ​

​Redis​

​​ 叢集中放置一個 ​

​key-value​

​​ 時,​

​redis​

​​ 先對​

​key​

​​ 使用 ​

​crc16​

​​ 算法算出一個結果,然後把結果對 ​

​16384​

​​ 求餘數,這樣每個 ​

​key​

​​ 都會對應一個編号在 ​

​0-16383​

​​ 之間的哈希槽,​

​redis​

​ 會根據節點數量大緻均等的将哈希槽映射到不同的節點

redis-cluster投票:容錯

redis主從複制和叢集實作原理
  1. 投票過程是叢集中所有​

    ​master​

    ​參與,如果半數以上​

    ​master​

    ​節點與​

    ​master​

    ​節點通信逾時(​

    ​cluster-node-timeout​

    ​),認為目前​

    ​master​

    ​節點挂掉.
  2. 什麼時候整個叢集不可用(​

    ​cluster_state:fail​

    ​)?
  • 如果叢集任意​

    ​master​

    ​​挂掉,且目前​

    ​master​

    ​​沒有​

    ​slave​

    ​​.叢集進入​

    ​fail​

    ​​狀态,也可以了解成叢集的​

    ​slot​

    ​​映射[​

    ​0-16383​

    ​]不完整時進入fail狀态.
  • ​redis-3.0.0.rc1​

    ​​加入​

    ​cluster-require-full-coverage​

    ​參數,預設關閉,打開叢集相容部分失敗.
  • 如果叢集超過半數以上​

    ​master​

    ​​挂掉,無論是否有​

    ​slave​

    ​​,叢集進入​

    ​fail​

    ​狀态.

主從概念

  • 一個master可以擁有多個slave,一個slave又可以擁有多個slave。如此下去,形成了強大的多級伺服器叢集架構。
  • master用寫資料,經統計:網站的讀寫比率是10:1
  • 通過主從分離可以實作讀寫分離
  • master和slave都是一個redis執行個體(redis服務)
  • 是以,主從模型可以提高讀的能力,在一定程度上緩解了寫的能力。因為能寫仍然隻有Master節點一個,可以将讀的操作全部移交到從節點上,變相提高了寫能力。

    問題:我們已經部署好了redis,并且能啟動一個redis,實作資料的讀寫,為什麼還要學習redis叢集?

    答:(1)單個redis存在不穩定性。當redis服務當機了,就沒有可用的服務了。

    (2)單個redis的讀寫能力是有限的。

    redis叢集是為了強化redis的讀寫能力。

繼續閱讀