天天看點

Redis——主從複制、哨兵模式、叢集服務一、主從複制二、哨兵模式三、叢集模式

Redis

  • 一、主從複制
    • 1.1 概述
      • 概念
      • 作用
      • 流程
    • 1.2 服務搭建
      • 準備工作
      • 修改Redis配置檔案
      • 驗證主從
  • 二、哨兵模式
    • 2.1 原理
    • 2.2 作用
    • 2.3 結構
    • 2.4 服務搭建
      • 準備工作
      • 修改配置檔案(所有節點)
      • 啟動哨兵模式
      • 檢視哨兵資訊
      • 模拟故障
      • 檢視結果
  • 三、叢集模式
    • 3.1 作用
    • 3.2 資料分片
    • 3.3 服務搭建
      • 準備工作
      • 所有節點cp配置檔案
      • Master1節點設定
      • 其餘節點設定
      • 所有節點設定
      • 測試

一、主從複制

1.1 概述

概念

  • 将一台Redis伺服器的資料,複制到其他的Redis伺服器。前者稱為主節點(Master),後者稱為從節點(Slave)
  • 資料的複制是單向的,隻能由主節點到從節點
  • 預設情況下,每台Redis伺服器都是主節點;且一個主節點可以有多個從節點(或沒有從節點),但一個從節點隻能有一個主節點

作用

  • 資料備援
    • 主從複制實作了資料的熱備份,是持久化之外的一種資料備援方式
  • 故障恢複
    • 當主節點出現問題時,可以由從節點提供服務,實作快速的故障恢複;實際上是一種服務的備援
  • 負載均衡
    • 在主從複制的基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務(即寫Redis資料時應用連接配接主節點,讀Redis資料時應用連接配接從節點),分擔伺服器負載;尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載,可以大大提高Redis伺服器的并發量
  • 高可用基石
    • 除了上述作用以外,主從複制還是哨兵和叢集能夠實施的基礎,是以說主從複制是Redis高可用的基礎

流程

  • 若啟動一個Slave機器程序,則它會向Master機器發送一個“sync command”指令,請求同步連接配接
  • 無論是第一次連接配接還是重新連接配接,Master機器都會啟動一個背景程序,将資料快照儲存到資料檔案中(執行rdb操作),同時Master還會記錄修改資料的所有指令并緩存在資料檔案中
  • 背景程序完成緩存操作之後,Maste機器就會向Slave機器發送資料檔案,Slave端機器将資料檔案儲存到硬碟上,然後将其加載到記憶體中,接着Master機器就會将修改資料的所有操作一并發送給Slave端機器。若Slave出現故障導緻當機,則恢複正常後會自動重新連接配接
  • Master機器收到Slave端機器的連接配接後,将其完整的資料檔案發送給Slave端機器,如果Mater同時收到多個Slave發來的同步請求,則Master會在背景啟動一個程序以儲存資料檔案,然後将其發送給所有的Slave端機器,確定所有的Slave端機器都正常

1.2 服務搭建

準備工作

Master :192.168.253.11

Slave1 :192.168.253.22

Slave1 :192.168.253.33

以上三台均已安裝redis

修改Redis配置檔案

Master

  • vim /etc/redis/6379.conf
bind 0.0.0.0						#70 行,修改bind項,0.0.0.0監聽所有網段
daemonize yes						#137行,開啟守護程序
logfile /var/log/redis_6379.log		#172行,指定日志檔案目錄
dir /var/lib/redis/6379				#264行,指定工作目錄
appendonly yes						#700行,開啟AOF持久化功能
           
  • /etc/init.d/redis_6379 restart

Slave

  • vim /etc/redis/6379.conf
bind 0.0.0.0						#70行,修改bind 項,0.0.0.0監聽所有網卡
daemonize yes						#137行,開啟守護程序
logfile /var/log/redis_6379.log		#172行,指定日志檔案目錄
dir /var/lib/redis/6379				#264行,指定工作目錄
replicaof 192.168.253.11 6379		#288行,指定要同步的Master節點IP和端口
appendonly yes						#700行,開啟AOF持久化功能
           
  • /etc/init.d/redis_6379 restart

驗證主從

  • 主節點建立資料檔案
    Redis——主從複制、哨兵模式、叢集服務一、主從複制二、哨兵模式三、叢集模式
  • 從節點檢視
    Redis——主從複制、哨兵模式、叢集服務一、主從複制二、哨兵模式三、叢集模式
    Redis——主從複制、哨兵模式、叢集服務一、主從複制二、哨兵模式三、叢集模式

檢視主節點日志

  • tail -f /var/log/redis_6379.log
Redis——主從複制、哨兵模式、叢集服務一、主從複制二、哨兵模式三、叢集模式

在主節點驗證從節點

Redis——主從複制、哨兵模式、叢集服務一、主從複制二、哨兵模式三、叢集模式

二、哨兵模式

哨兵的核心功能:在主從複制的基礎上,哨兵引入了主節點的自動故障轉移

2.1 原理

哨兵(sentinel):是一個分布式系統,用于對主從結構中的每台伺服器進行監控,當出現故障時通過投票機制選擇新的 Master 并将所有 Slave 連接配接到新的 Master。是以整個運作哨兵的叢集的數量不得少于3個節點

2.2 作用

監控

哨兵會不斷地檢查主節點和從節點是否運作正常

自動故障轉移

當主節點不能正常工作時,哨兵會開始自動故障轉移操作,它會将失效主節點的其中一個從節點更新為新的主節點,并讓其他從節點改為複制新的主節點

通知(提醒)

哨兵可以将故障轉移的結果發送給用戶端

2.3 結構

哨兵結構由兩部分組成,哨兵節點和資料節點:

  • 哨兵節點
    • 哨兵系統由一個或多個哨兵節點組成,哨兵節點是特殊的redis節點,不存儲資料
  • 資料節點
    • 主節點和從節點都是資料節點

哨兵的啟動依賴于主從模式,是以須把主從模式安裝好的情況下再去做哨兵模式,所有節點上都需要部署哨兵模式,哨兵模式會監控所有的 Redis 工作節點是否正常,當 Master 出現問題的時候,因為其他節點與主節點失去聯系,是以會投票,投票過半就認為這個 Master 的确出現問題,然後會通知哨兵間,然後從 Slaves 中選取一個作為新的 Master

需要特别注意的是,客觀下線是主節點才有的概念;如果從節點和哨兵節點發生故障,被哨兵主觀下線後,不會再有後續的客觀下線和故障轉移操作

2.4 服務搭建

準備工作

Master :192.168.253.11

Slave1 :192.168.253.22

Slave1 :192.168.253.33

以上三台均已安裝redis

修改配置檔案(所有節點)

  • vim /opt/redis-5.0.7/sentinel.conf
protected-mode no										#17行,關閉保護模式
port 26379												#21行,Redis哨兵預設的監聽端口
daemonize yes											#26行,指定sentinel為背景啟動
logfile "/var/log/sentinel.log"							#36行,指定日志存放路徑
dir "/var/lib/redis/6379"								#65行,指定資料庫存放路徑
sentinel monitor mymaster 192.168.253.11 6379 2			#84行,修改 指定該哨兵節點監控192.168.253.11:6379這個主節點,該主節點的名稱是mymaster,最後的2的含義與主節點的故障判定有關:至少需要2個哨兵節點同意,才能判定主節點故障并進行故障轉移
sentinel down-after-milliseconds mymaster 30000			#113行,判定伺服器down掉的時間周期,預設30000毫秒(30秒)
sentinel failover-timeout mymaster 180000				#146行,故障節點的最大逾時時間為180000(180秒)
           

啟動哨兵模式

先啟動Master

cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &

[1] 7373
           

再啟動Slave

cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &

[1] 11453
           

檢視哨兵資訊

  • redis-cli -p 26379 info Sentinel
    Redis——主從複制、哨兵模式、叢集服務一、主從複制二、哨兵模式三、叢集模式

模拟故障

檢視redis程序号

  • ps -ef | grep redis
Redis——主從複制、哨兵模式、叢集服務一、主從複制二、哨兵模式三、叢集模式

殺死主節點的redis

  • kill -9 6631

模拟master當機

檢視結果

動态檢視哨兵日志

  • tail -f /var/log/sentinel.log
    Redis——主從複制、哨兵模式、叢集服務一、主從複制二、哨兵模式三、叢集模式
    驗證主節點
  • redis-cli -p 26379 INFO Sentinel
    Redis——主從複制、哨兵模式、叢集服務一、主從複制二、哨兵模式三、叢集模式
    - 主節點已更換至Slave2

三、叢集模式

叢集,即Redis Cluster,是Redis 3.0開始引入的分布式存儲方案

叢集由多個節點(Node)組成,Redis的資料分布在這些節點中

  • 群中的節點分為主節點和從節點
  • 隻有主節點負責讀寫請求和叢集資訊的維護;從節點隻進行主節點資料和狀态資訊的複制

3.1 作用

資料分區

  • 資料分區(或稱資料分片)是叢集最核心的功能
  • 叢集将資料分散到多個節點,一方面突破了Redis單機記憶體大小的限制,存儲容量大大增加;另一方面每個主節點都可以對外提供讀服務和寫服務,大大提高了叢集的響應能力
  • Redis單機記憶體大小受限問題,在介紹持久化和主從複制時都有提及;例如,如果單機記憶體太大,bgsave和bgrewriteaof的fork操作可能導緻主程序阻塞,主從環境下主機切換時可能導緻從節點長時間無法提供服務,全量複制階段主節點的複制緩沖區可能溢出

高可用

叢集支援主從複制和主節點的自動故障轉移(與哨兵類似);當任一節點發生故障時,叢集仍然可以對外提供服務

3.2 資料分片

  • Redis叢集引入了哈希槽的概念
  • Redis叢集有16384個哈希槽(編号0-16383)
  • 叢集的每個節點負責一部分哈希槽
  • 每個Key通過CRC16校驗後對16384取餘來決定放置哪個哈希槽,通過這個值,去找到對應的插槽所對應的節點,然後直接自動跳轉到這個對應的節點上進行存取操作

以3個節點組成的叢集為例

節點A包含0到5460号哈希槽

節點B包含5461到10922号哈希槽

節點C包含10923到16383号哈希槽

Redis叢集的主從複制模型

叢集中具有A、B、C三個節點,如果節點B失敗了,整個叢集就會因缺少5461-10922這個範圍的槽而不可以用

為每個節點添加一個從節點A1、B1、C1整個叢集便有三個Master節點和三個slave節點組成,在節點B失敗後,叢集選舉B1位為的主節點繼續服務。當B和B1都失敗後,叢集将不可用

3.3 服務搭建

redis的叢集一般需要6個節點,3主3從

準備工作

友善起見,這裡所有節點在6台伺服器上模拟:

以IP及端口号進行區分:3個主節點端口号:7001、7002、7003,對應的從節點端口号:7004、7005、7006

Master1 :192.168.253.11 :7001

Master2 :192.168.253.22 :7002

Master3 :192.168.253.33 :7003

Slave1 :192.168.253.44 :7004

Slave2 :192.168.253.55 :7005

Slave3 :192.168.253.66 :7006

所有節點cp配置檔案

cd /etc/redis/
mkdir -p redis-cluster/redis6379

cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis6379/
cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis6379/
           

Master1節點設定

  • vim /etc/redis/redis-cluster/redis6379/redis.conf
bind 192.168.253.11						#69行,修改bind項,監聽自己的IP
protected-mode no						#88行,修改,關閉保護模式
port 7001								#92行,修改,redis監聽端口
daemonize yes							#136行,以獨立程序啟動
cluster-enabled yes						#832行,取消注釋,開啟群集功能
cluster-config-file nodes-6379.conf		#840行,取消注釋,群集名稱檔案設定,無需修改
cluster-node-timeout 15000				#846行,取消注釋群集逾時時間設定
appendonly yes							#699行,修改,開啟AOF持久化
           
  • 設定完直接把master1的檔案遠端發送到其他六台機子
scp /etc/redis/redis-cluster/redis6379/redis.conf [email protected]:/etc/redis/redis-cluster/redis6379/redis.conf
scp /etc/redis/redis-cluster/redis6379/redis.conf [email protected]:/etc/redis/redis-cluster/redis6379/redis.conf
scp /etc/redis/redis-cluster/redis6379/redis.conf [email protected]:/etc/redis/redis-cluster/redis6379/redis.conf
scp /etc/redis/redis-cluster/redis6379/redis.conf [email protected]:/etc/redis/redis-cluster/redis6379/redis.conf
scp /etc/redis/redis-cluster/redis6379/redis.conf [email protected]:/etc/redis/redis-cluster/redis6379/redis.conf
           

其餘節點設定

  • 注意 Master1 檔案發送過去修改兩個地方
  • vim /etc/redis/redis-cluster/redis6379/redis.conf
bind 192.168.253.11						#69行,修改bind項,監聽自己的IP

port 7001								#92行,修改,redis監聽端口
           

所有節點設定

啟動

cd /etc/redis/redis-cluster/redis6379/

redis-server redis.conf
           
Redis——主從複制、哨兵模式、叢集服務一、主從複制二、哨兵模式三、叢集模式

啟動叢集

  • 在Master1上開啟
Redis——主從複制、哨兵模式、叢集服務一、主從複制二、哨兵模式三、叢集模式

測試

redis-cli -h 192.168.253.11 -p 7001 -c        	#加-c參數,節點之間就可以互相跳轉	
cluster slots									#檢視節點的哈希槽編号範圍

set cc1 123456									#建立鍵
cluster keyslot sky								#檢視name鍵的槽編号
           
Redis——主從複制、哨兵模式、叢集服務一、主從複制二、哨兵模式三、叢集模式
Redis——主從複制、哨兵模式、叢集服務一、主從複制二、哨兵模式三、叢集模式

從伺服器檢視

Redis——主從複制、哨兵模式、叢集服務一、主從複制二、哨兵模式三、叢集模式

繼續閱讀