天天看點

Redis主從複制以及Redis哨兵模式

Redis主從複制

概念:

主從複制,是指将一台Redis伺服器的資料,複制到其他的Redis伺服器。前者稱為主節點(master/leader) ,後者稱為從節點(slavefollower);資料的複制是單向的,隻能由主節點到從節點。Master以寫為主,Slave 以讀為主。

預設情況下,每台Redis伺服器都是主節點;且-一個主節點可以有多個從節點(或沒有從節點) ,但-一個從節點隻能有一個主節點。

主從複制的作用主要包括:

1.資料備援:主從複制實作了資料的熱備份,是持久化之外的- -種資料備援方式。

2.故障恢複:當主節點出現問題時,可以由從節點提供服務,實作快速的故障恢複;實際上是一種服務的備援。

3.負載均衡:在主從複制的基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務(即寫Redis資料時應用連接配接主節點,讀Redis資料時應用連接配接從節點),分擔伺服器負載;尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載,可以大大提高Redis伺服器的并發量。

4.高可用基石:除了上述作用以外,主從複制還是哨兵和叢集能夠實施的基礎,是以說主從複制是Redis高可用的基礎。

一般來說,要将Redis運用于工程項目中,隻使用一台Redis是萬萬不能的(當機,一般至少3個,一主二從),原因如下:

1.從結構上,單個Redis伺服器會發生單點故障,并且一台伺服器需要處理所有的請求負載,壓力較大;

2.從容量上,單個Redis伺服器記憶體容量有限,就算一台Redis伺服器記憶體容量為256G,也不能将所有記憶體用作Redis存儲記憶體,一般來說,單台Redis最大使用記憶體不應該超過20G。

電商網站上的商品,一般都是一次上傳,無數次浏覽的,說專業點也就是”多讀少寫"。

對于這種場景,我們可以使用如下這種架構:

Redis主從複制以及Redis哨兵模式

主從複制,讀寫分離,80%的情況下都是進行讀操作!減緩伺服器的壓力!架構中經常使用!一主二從!

隻要在公司中,主從複制就是必須要使用的,因為在真實的項目中不可能單機使用Redis!

環境配置:

隻配置從庫,不用配置主庫!因為redis就預設把它自己但中國一個主庫!

127.0.0.1:6379> info replication		# 檢視目前庫的資訊
# Replication
role:master								# 角色 master
connected_slaves:0						# 沒有從機
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
           

修改3個配置檔案,然後修改對應的資訊。

  • 端口
  • pid名字
  • log檔案名字
  • dump.rdb名字

修改完畢之後,啟動我們的3個redis伺服器,可以通過程序資訊檢視!

Redis主從複制以及Redis哨兵模式

一主二從:

預設情況下,每台Redis伺服器都是主節點;我們一般情況下隻用配置從機就可以了!

127.0.0.1:6380> SLAVEOF 127.0.0.1 6379		# SLAVEOF host 6379 找誰當自己的老大!
OK
127.0.0.1:6380> info replication
# Replication
role:slave			 # 目前角色是從機
master_ host:127.0.0.1			 # 可以的看到主機的資訊
master_ port:6379
master_1ink_ status :up
master_ _1ast_ io_ _seconds_ _ago:3
master_ sync_ _in_ progress:0
slave_ rep1 _ offset:14
slave_ priority:100
slave_ read_ only:1
connected_ slaves:0
master_ replid:a81be8dd257636b2d3e7a9f595e69d7 3ff03774e
master_ rep1i d2 : 000000000000000000000000000000000
master_ rep1_ offset:14
second_ rep1_ offset:-1
rep1_ back1og_ active:1
rep1_ back1og_ size: 1048576
rep1_ _back1og_ first_ byte. _offset:1
rep1_ back1og_ histlen:14

# 在主機中檢視!
127.0.0.1:6379> info replication
# Replication
role :maste r
connected_ slaves:1 		#多了從機的配置
slave0:ip=127.0.0.1,port=6380,state=online,offset=42, 1ag=1		# 多了從機的配置
master_ replid : a81be8dd257636b2d3e7a9f595e69d73ff03774e
master_ replid2 : 0000000000000000000000000000000000
master_ rep1_ offset:42
second_ rep1_ offset:-1 .
rep1_ back1og_ active:1
rep1_ back1og_ size: 1048576
rep1_ back1og_ _first_ byte_ offset:1
rep1_ back1og_ histlen :42
           

如果兩個都配置完了,就是有兩個從機的!

Redis主從複制以及Redis哨兵模式

真實的從主配置應該在配制檔案中配置,這樣的話是永久的,我們這裡使用的是指令,暫時的!

細節:

  • 主機可以寫,從機不能寫隻能讀!主機中的所有資訊和資料,都會自動被從機儲存!

    主機寫:

    Redis主從複制以及Redis哨兵模式
  • 從機隻能讀取内容!
    Redis主從複制以及Redis哨兵模式
  • 測試:主機斷開連接配接,從機依舊可以連接配接到主機的,但是沒有寫這個操作,這個時候,主機如果回來了,從機依舊可以直接擷取到主機寫的資訊!如果使用指令行來配置的主從,這個時候如果重新開機了,就會變回從機,隻要變回從機,馬上就可以從主機中擷取值!

複制原理:

Slave啟動成功連接配接到master後會發送一個sync同步指令

Master接到指令,啟動背景的存盤程序,同時收集所有接收到的用于修改資料集指令,在背景程序執行完畢之後,master将傳送整個資料檔案到slave,并完成一次完全同步。

全量複制:而slave服務在接收到資料庫檔案資料後,将其存盤并加載到記憶體中。

增量複制:Master繼續将新的所有收集到的修改指令依次傳給slave,完成同步。

但是隻要是重新連接配接master,一次完全同步(全量複制)将被自動執行!我們的資料一定可以在從機中看到!

層層鍊路:

上一個M連接配接下一個S!

Redis主從複制以及Redis哨兵模式

這個時候也可以完成主從複制!

如果這個時候沒有老大了,這個時候能不能選出一個老大呢?手動!:

如果主機斷開了連接配接,我們可以使用

SLAVEOF no one

讓自己變成主機!其它的節點就可以手動連接配接到最新的這個主節點上!如果這個時候主機修複了,那就隻能重新連接配接,這個時候它也做不成主機!

Redis哨兵模式

自動選舉老大的模式,概述:

主從切換技術的方法是:當主伺服器當機後,需要手動把一台從伺服器切換為主伺服器,這就需要人工幹預,費事費力,還會造成一段時間内服務不可用。這不是一種推薦的方式,更多時候,我們優先考慮哨兵模式。Redis從2.8開始正式提供 了Sentinel (哨兵)架構來解決這個問題。

謀朝篡位的自動版,能夠背景監控主機是否故障,如果故障了根據投票數自動将從庫轉換為主庫。

哨兵模式是一種特殊的模式,首先Redis提供了哨兵的指令,哨兵是一一個獨立的程序,作為程序,它會獨立運作。其原理是哨兵通過發送指令,等待Redis伺服器響應,進而監控運作的多個Redis執行個體。

Redis主從複制以及Redis哨兵模式

這裡的哨兵有兩個作用

  • 通過發送指令,讓Redis伺服器傳回監控其運作狀态,包括主伺服器和從伺服器。
  • 當哨兵監測到master當機,會自動将slave切換成master ,然後通過釋出訂閱模式通知其他的從伺服器,修改配置檔案,讓它

    們切換主機。

然而一個哨兵程序對Redis伺服器進行監控,可能會出現問題,為此,我們可以使用多個哨兵進行監控。各個哨兵之間還會進行監控,這樣就形成了多哨兵模式。

Redis主從複制以及Redis哨兵模式

假設主伺服器當機,哨兵1先檢測到這個結果,系統并不會馬上進行failover過程,僅僅是哨兵1主觀的認為主伺服器不可用,這個

現象成為主觀下線。當後面的哨兵也檢測到主伺服器不可用,并且數量達到一定值時,那麼哨兵之間就會進行一次投票,投票的結

果由一個哨兵發起,進行ailover[故障轉移]操作。切換成功後,就會通過釋出訂閱模式,讓各個哨兵把自己監控的從伺服器實作切

換主機,這個過程稱為客觀下線。

測試:

我們目前的狀态是一主二從!

1、配置哨兵配置檔案:sentinel.conf

# sentinel monitor	被監控的名稱	host	port	1
sentinel monitor myredis 127.0.0.1  6379 1 
           

後面的這個數字1,代表主機挂了,slave投票看讓誰接替成為主機,票數最多的,就會成為主機!

2、啟動哨兵模式!

[[email protected] bin]# redis -sentinel kconfig/sentinel. conf
26607:X 31 Mar 2020 21:13:10.027 # 000000000000 Redis is starting 000000000000
26607:X 31 Mar 2020 21:13:10.027 # Redis version=5.0.8, bits=64, commi t=00000000,modified=0 ,
pid=26607,just started
26607:x 31 Mar 2020 21:13:10.027 # Confi guration loaded
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 5.0.8 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 26607
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

26607:X 31 Mar 2020 21:13:10.029 # WARNING: The TCP back1og setting of 511 cannot be enforced because
/proc/sys/net/core/somaxconn is set to the lower value of 128.
26607:x 31 Mar 2020 21:13:10.031 # Sentinel ID is 4c780da7e22d2aebe 3bc20c333746f202ce72996
26607:X 31 Mar 2020 21:13:10.031 # +monitor master myredis 127.0.0.1 6379 quorum 1
26607 :X 31 Mar 2020 21:13:10.031 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6379
26607 :X 31 Mar 2020 21:13:10.033 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 127.0.0.1 6379
           

如果Master節點斷開了,這個時候就會從從機中随機選擇一個伺服器!(這裡面有一個投票算法!)

Redis主從複制以及Redis哨兵模式

哨兵日志!

Redis主從複制以及Redis哨兵模式

如果主機此時回來了,隻能歸并到新的主機下面,當作從機,這就是哨兵模式的規則!

哨兵模式的優點:

1、哨兵叢集,一般基于主從複制模式,所有的主從配置優點,它全部都有!

2、主從可以切換,故障可以轉移,系統的可用性就會更好!

3、哨兵模式就是主從模式的更新,手動到自動,更加健壯!

哨兵模式的缺點:

1、Redis不好線上擴容的,叢集容量一旦達到上限,線上擴容就會很麻煩!

2、實作哨兵模式的配置其實是很麻煩的,裡面有很多選擇!

哨兵模式的全部配置:

# Example sentine1. conf
 
# 哨兵sentine1執行個體運作的端口  預設26379		如果有哨兵叢集,我們還需要配置每個哨兵端口
port 26379

# 哨兵sentine1的工作目錄
dir /tmp

# 哨兵sentine1監控的redis主節點的ip port 
# master-name
可以自己命名的主節點名字隻能由字母A-z、數字0-9、這三個字元".-_"組成。
# quorum 配置多少個sentine1哨兵統一 認為master主節點失聯 那麼這時客觀上認為主節點失聯了
# sentine1 monitor <master-name> <ip> <redis-port> <quorum>
sentine1 monitor mymiaster 127.0.0.1 6379 2

# 當在Redis執行個體中開啟了requirepass foobared 授權密碼這樣所i有連接配接Redis執行個體的用戶端都要提供密碼
# 設定哨兵sentine1連接配接主從的密碼注意必須為主從設定一樣的驗證密碼
# sentine1 auth-pass <maste r-name> <pas sword>
sentine1 auth-pass mymaster MySUPER-- secret-0123password

# 指定多少毫秒之後主節點沒有應答哨兵sentinel 此時  哨兵主觀上認為主節點下線  預設30秒
# sentine1 down-after -milliseconds <master-name> <mi 11iseconds>
sentine1 down -after-mi 11i seconds mymaster  30000

# 這個配置項指定了在發生failover主備切換時最多可以有多少個s1ave同時對新的master進行同步,
這個數字越小,完成failover所 需的時間就越長,
但是如果這個數字越大,就意味着越多的s1ave因為replicati on而不可用。
可以通過将這個值設為1來保證每次隻有一個slave處于不能處理指令請求的狀态。
# sentinel parallel-syncs <master-name> <nums laves>
sentine1 para1le1-syncs mymaster 1

# 故障轉移的逾時時間failover-timeout 可以用在以下這些方面:
# 1.同一個sentine1對同一個master兩次fai lover之間的間隔時間。
# 2.當一個slave從一個錯誤的master那裡同步資料開始計算時間。直到s lave被糾正為向正确的master那裡同步資料時。
# 3.當想要取消一個正在進行的failover所需要的時間。
# 4.當進行failover時,配置所有saves指向新的master所需的最大時間。不過,即使過了這個逾時,slaves 依然會被正确配置為指向
master,但是就不按paralle1-syncs所配置的規則來了
# 預設三分鐘
# sentine1 failover-timeout <master-name> <mi 11iseconds>
sentinel failover-timeout mymaster 180000

# SCRIPTS EXECUTION

# 配置當某一事件發生時所需要執行的腳本,可以通過腳本來通知管理者,例如當系統運作不正常時發郵件通知相關人員。
# 對于腳本的運作結果有以下規則:
# 若腳本執行後傳回1,那麼該腳本稍後将會被再次執行,重複次數目前預設為10
# 若腳本執行後傳回2,或者比2更高的一個傳回值,腳本将不會重複執行。
# 如果腳本在執行過程中由于收到系統中斷信号被終止了,則同傳回值為1時的行為相同。
# 一個腳本的最大執行時間為60s,如果超過這個時間,腳本将會被一個SIGKILL信号終止,之後重新執行。

# 通知型腳本:當sentine1有任何警告級别的事件發生時(比如說redis執行個體的主觀失效和客觀失效等等),将會去調用這個腳本,這時這個
腳本應該通過郵件,SMS等方式去通知系統管理者關于系統不正常運作的資訊。調用該腳本時,将傳給腳本兩個參數,一個是事件的類型,一
個是事件的描述。如果sentine1.conf配置檔案中配置了這個腳本路徑,那麼必須保證這個腳本存在于這個路徑,并且是可執行的,否則
sentine1無法正常啟動成功。
# 通知腳本
# shell程式設計
# sentinel notificati on-script <master-name> <script-path>
sentine1 notification-script mymaster /var/redis/notify.sh

# 用戶端重新配置主節點參數腳本
# 當一個master由于failover而發生改變時,這個腳本将會被調用,通知相關的用戶端關于master位址已經發生改變的資訊。
# 以下參數将會在調用腳本時傳給腳本:
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
# 目前<state>總是“failover",
# <ro1e>是“7eader"或者"observer”中的一個。
# 參數from-ip,from-port,to-ip,to-port是用來和舊的master和新的master(即舊的slave)通信的
# 這個腳本應該是通用的,能被多次調用,不是針對性的。
# sentinel client-reconfig-script <master-name> <script-path>
sentine1 client-reconfig-script mymaster /var/redis/reconfig.sh		# 一般都是由運維來配置!
           

繼續閱讀