首頁  >  文章  >  資料庫  >  redis怎麼實現集群

redis怎麼實現集群

步履不停
步履不停原創
2019-06-22 16:07:562793瀏覽

redis怎麼實現集群

1.主從複製

#主從複製原理:

  • 從伺服器連接主伺服器,發送SYNC指令; 

  • 主伺服器接收到SYNC命名後,開始執行BGSAVE指令產生RDB檔案並使用緩衝區記錄此後執行的所有寫入指令; 

  • 主伺服器BGSAVE執行完後,向所有從伺服器發送快照文件,並在發送期間繼續記錄被執行的寫命令; 

  • 從伺服器收到快照檔案後丟棄所有舊數據,載入收到的快照; 

  • #主伺服器快照發送完畢後開始向從伺服器發送緩衝區中的寫入命令; 

  • 從伺服器完成對快照的載入,開始接收命令請求,並執行來自主伺服器緩衝區的寫入命令;(從伺服器初始化完成

  • 主伺服器每執行一個寫入命令就會向從伺服器發送相同的寫入命令,從伺服器接收並執行收到的寫入命令(從伺服器初始化完成後的運算

主從複製優缺點:

    #支援主從複製,主機會自動將資料同步到從機,可以進行讀寫分離
  • 為了分載Master的讀取操作壓力,Slave伺服器可以為客戶端提供唯讀操作的服務,寫入服務仍然必須由Master來完成
  • Slave同樣可以接受其它Slaves的連接和同步請求,這樣可以有效的分載Master的同步壓力。
  • Master Server是以非阻塞的方式為Slaves提供服務。所以在Master-Slave同步期間,客戶端仍然可以提交查詢或修改請求。
  • Slave Server同樣是以非阻塞的方式完成資料同步。在同步期間,如果有客戶端提交查詢請求,Redis則傳回同步之前的資料
#缺點:

    Redis不具備自動容錯和復原功能,主機從機的宕機都會導致前端部分讀寫請求失敗,需要等待機器重新啟動或手動切換前端的IP才能恢復。
  • 主機宕機,當機前有部分資料未能及時同步到從機,切換IP後還會引入資料不一致的問題,降低了系統的可用性。
  • Redis較難支援線上擴容,在叢集容量達到上限時線上擴容會變得很複雜。
2.

哨兵模式#

當主伺服器中斷服務後,可以將一個從伺服器升級為主伺服器,以便繼續提供服務,但是這個過程需要人工手動來操作。 為此,Redis 2.8中提供了哨兵工具來實現自動化的系統監控和故障復原功能。

哨兵的功能就是監控Redis系統的運作狀況。它的功能包括以下兩個。

    (1)監控主伺服器和從伺服器是否正常運作。 
    (2)主伺服器發生故障時自動將從伺服器轉換為主伺服器。

哨兵的工作方式:

  • 每個Sentinel(哨兵)程序以每秒鐘一次的頻率向整個集群中的Master主伺服器,Slave從伺服器以及其他Sentinel(哨兵)程序發送一個PING 指令。

  • 如果一個實例(instance)距離最後一次有效回覆PING 指令的時間超過down-after-milliseconds 選項所指定的值, 則這個實例會被Sentinel(哨兵)進程標記為主觀下線(SDOWN)

  • 如果一個Master主伺服器被標記為主觀下線(SDOWN),則正在監視這個Master主伺服器的所有Sentinel(哨兵)程序要以每秒一次的頻率確認Master主伺服器的確進入了主觀下線狀態

  • 當有足夠數量的Sentinel(哨兵)進程(大於等於設定檔指定的值)在指定的時間範圍內確認Master主伺服器進入了主觀下線狀態(SDOWN), 則Master主伺服器會被標記為客觀下線(ODOWN)

  • 在一般情況下,每個Sentinel(哨兵)程序會以每10 秒一次的頻率向叢集中的所有Master主伺服器、Slave從伺服器發送INFO 指令。

  • 當Master主伺服器被Sentinel(哨兵)程序標記為客觀離線(ODOWN)時,Sentinel(哨兵)程序向下線的Master主伺服器的所有Slave從伺服器發送INFO 指令的頻率會從10 秒一次改為每秒一次。

  • 若沒有足夠數量的 Sentinel(哨兵)程序同意 Master主伺服器下線, Master主伺服器的客觀下線狀態就會被移除。若 Master主伺服器重新向 Sentinel(哨兵)程序發送 PING 指令返回有效回复,Master主伺服器的主觀下線狀態就會移除。

 哨兵模式的優缺點

#優點:

  • ##哨兵模式是基於主從模式的,所有主從的優點,哨兵模式都具有。

  • 主從可以自動切換,系統更健壯,可用性更高。

缺點:

  • #Redis較難支援線上擴容,在叢集容量達到上限時線上擴容會變得很複雜。

3.Redis-Cluster叢集

#redis的哨兵模式基本上已經可以實現高可用,讀寫分離,但在這種模式下每台redis伺服器都儲存相同的數據,很浪費內存,所以在redis3.0上加入了cluster模式,實現的redis的分散式存儲,也就是說每台redis節點上存儲不同的內容。

 Redis-Cluster採用無中心結構,它的特性如下:

  • 所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位協定優化傳輸速度和頻寬。

  • 節點的fail是透過叢集中超過半數的節點偵測失效時才生效。

  • 客戶端與redis節點直連,不需要中間代理層.客戶端不需要連接叢集所有節點,連接叢集中任何一個可用節點即可。

運作方式:

在redis的每一個節點上,都有這麼兩個東西,一個是插槽(slot),它的值範圍為:0-16383。還有一個就是cluster,可以理解為是一個叢集管理的插件。當我們的訪問的key到達的時候,redis會根據crc16的演算法得出一個結果,然後把結果對16384 求餘數,這樣每個key 都會對應一個編號在0-16383 之間的哈希槽,通過這個值,去找到對應的插槽所對應的節點,然後直接自動跳到這個對應的節點上進行訪問操作。

為了確保高可用,redis-cluster叢集引入了主從模式,一個主節點對應一個或多個從節點,當主節點宕機的時候,就會啟用從節點。當其它主節點ping一個主節點A時,如果半數以上的主節點與A通訊超時,那麼就認為主節點A宕機了。如果主節點A和它的從節點A1都宕機了,那麼該叢集就無法再提供服務了。

更多Redis相關技術文章,請造訪Redis教學欄位學習!

以上是redis怎麼實現集群的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

相關文章

看更多