天天看點

Redis主從複制主從複制認識環境配置一主二從當機後手動配置主機哨兵模式

主從複制認識

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

預設情況下,每台Redis伺服器都是主節點;

且一個主節點可以有多個從節點(或沒有從節點),但一個從節點隻能有一個主節點

Redis主從複制主從複制認識環境配置一主二從當機後手動配置主機哨兵模式

主從複制的作用:

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

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

  • 從結構上:單個Redis伺服器會發生單點故障,并且一台伺服器需要處理所有的請求負載,壓力較大;
  • 從容量上:單個Redis伺服器記憶體容量有限,就算一台Redis伺服器記憶體容量為256G,也不能将所有 記憶體用作Redis存儲記憶體,一般來說,單台Redis大使用記憶體不應該超過20G。

環境配置

隻配置從庫,不用配置主庫

127.0.0.1:6379> info replication                    # 檢視目前庫的資訊
# Replication
role:master                                         # 角色
connected_slaves:0                                  # 沒有從機
master_replid:7686391446118c355a8bc7f7ad72607293de360f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
master_repl_meaningful_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
           

複制3個配置檔案,模拟叢集,并更改相應的配置資訊

cp redis.conf redis79.conf
cp redis.conf redis80.conf
cp redis.conf redis81.conf
           

得到以下三個配置檔案 

[[email protected] jiaconfig]# ls
dump.rdb  redis79.conf  redis80.conf  redis81.conf  redis.conf
           

更改相應配置(以  redis80.conf 為例)

port 6380

pidfile /var/run/redis_6380.pid

logfile "6380.log"

dbfilename dump6380.rdb

測試環境

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

# 運作配置檔案

[[email protected] jiaconfig]# redis-server redis79.conf

[[email protected] jiaconfig]# redis-server redis80.conf

[[email protected] jiaconfig]# redis-server redis81.conf

# 檢視程序

[[email protected] jiaconfig]# ps -ef|grep redis

root      3112     1  0 14:11 ?        00:00:00 redis-server *:6379

root      3118     1  0 14:11 ?        00:00:00 redis-server *:6380

root      3124     1  0 14:11 ?        00:00:00 redis-server *:6381

root      3130  2997  0 14:12 pts/0    00:00:00 grep --color=auto redis

一主二從

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

認老大~   一主( 79 )二從( 80、81 )

slaveof 127.0.0.1 6379
           

結果(redis80 從):

127.0.0.1:6380> slaveof 127.0.0.1 6379

OK

127.0.0.1:6380> info replication

# Replication

role:slave                                             # 從機

master_host:127.0.0.1                        # 主機位址

master_port:6379                                # 主機端口

master_link_status:up

master_last_io_seconds_ago:2

master_sync_in_progress:0

slave_repl_offset:14

slave_priority:100

slave_read_only:1

connected_slaves:0

master_replid:26c6b65cf4b370aad9fbb8c0300285400f88368f

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:14

master_repl_meaningful_offset:0

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:14 

如果顯示  master_link_status:down  去相應的配置檔案中修改對應主機密碼

masterauth ******       # 密碼
           

結果(redis79 主): 

127.0.0.1:6379> info replication

# Replication

role:master

connected_slaves:1                                                                           # 多了從機的配置

slave0:ip=127.0.0.1,port=6380,state=online,offset=28,lag=0            # 多了從機的配置(6380)

master_replid:26c6b65cf4b370aad9fbb8c0300285400f88368f

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:28

master_repl_meaningful_offset:0

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:28

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

Redis主從複制主從複制認識環境配置一主二從當機後手動配置主機哨兵模式

細節:

  1. 主機可以寫,可以讀(不需要);從機隻能讀,不能寫
  2. 主機斷開連接配接:從機依舊連接配接到主機的,但是沒有寫操作;這個時候,主機如果回來了,從機依舊可以直接擷取到主機寫的資訊
  3. 從機斷開連接配接:如果是使用指令行來配置的主從,這個時候如果從機重新開機了,就會變回主機!隻要變為從機,立馬就會從主機中擷取值

原理:

  • Slave 啟動成功連接配接到 master 後會發送一個sync同步指令,Master 接到指令,啟動背景的存盤程序,同時收集所有接收到的用于修改資料集指令,在背景程序執行完畢之後,master将傳送整個資料檔案到slave,并完成一次完全同步。
  • 全量複制:而slave服務在接收到資料庫檔案資料後,将其存盤并加載到記憶體中(但是隻要是重新連接配接 master , 一次完全同步(全量複制)将被自動執行)
  • 增量複制:Master 繼續将新的所有收集到的修改指令依次傳給slave,完成同步

當機後手動配置主機

Redis主從複制主從複制認識環境配置一主二從當機後手動配置主機哨兵模式

此時的 6380 依然是從節點

如果主機斷開了連接配接,我們可以使用 SLAVEOF no one 讓自己變成主機;如果這個時候老大修複了,那就重新設定

哨兵模式

自動選舉老大

概述

  • 主從切換技術的方法是:當主伺服器當機後,需要手動把一台從伺服器切換為主伺服器,這就需要人工幹預,費事費力,還會造成一段時間内服務不可用。這不是一種推薦的方式,更多時候,我們優先考慮 哨兵模式。Redis從2.8開始正式提供了Sentinel(哨兵) 架構來解決這個問題。
  • 謀朝篡位的自動版,能夠背景監控主機是否故障,如果故障了根據投票數自動将從庫轉換為主庫。
  • 哨兵模式是一種特殊的模式,首先Redis提供了哨兵的指令,哨兵是一個獨立的程序,作為程序,它會獨 立運作。其原理是哨兵通過發送指令,等待Redis伺服器響應,進而監控運作的多個Redis執行個體。
Redis主從複制主從複制認識環境配置一主二從當機後手動配置主機哨兵模式

哨兵的作用:

  • 通過發送指令,讓Redis伺服器傳回監控其運作狀态,包括主伺服器和從伺服器
  • 當哨兵監測到master當機,會自動将slave切換成master,然後通過釋出訂閱模式通知其他的從伺服器,修改配置檔案,讓它們切換主機。
  • 然而一個哨兵程序對Redis伺服器進行監控,可能會出現問題,為此,我們可以使用多個哨兵進行監控。 各個哨兵之間還會進行監控,這樣就形成了多哨兵模式。

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

Redis主從複制主從複制認識環境配置一主二從當機後手動配置主機哨兵模式

假設主伺服器當機,哨兵1先檢測到這個結果,系統并不會馬上進行failover過程,僅僅是哨兵1主觀的認為主伺服器不可用,這個現象成為主觀下線。當後面的哨兵也檢測到主伺服器不可用,并且數量達到一定值時,那麼哨兵之間就會進行一次投票,投票的結果由一個哨兵發起,進行failover[故障轉移]操作。切換成功後,就會通過釋出訂閱模式,讓各個哨兵把自己監控的從伺服器實作切換主機。這個過程稱為客觀下線。

測試

1、建立 sentinel.conf 檔案

vim sentinel.conf

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

# 設定密碼                                                                                                                                                                     sentinel auth-pass mymaster ******

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

2、啟動哨兵

redis-sentinel sentinel.conf

3、當主機6379意外當機

Redis主從複制主從複制認識環境配置一主二從當機後手動配置主機哨兵模式

此時,6381成為主機

Redis主從複制主從複制認識環境配置一主二從當機後手動配置主機哨兵模式

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

優點:

  • 哨兵叢集,基于主從複制模式,所有的主從配置優點,它全有
  • 主從可以切換,故障可以轉移,系統的可用性就會更好
  • 哨兵模式就是主從模式的更新,手動到自動,更加健壯!

缺點:

  • Redis 不好線上擴容,叢集容量一旦到達上限,線上擴容就十分麻煩
  • 實作哨兵模式的配置其實是很麻煩的,裡面有很多選擇

哨兵模式的全部配置

# Example sentinel.conf

# 哨兵 sentinel 執行個體運作的端口預設26379

port 26379

# 哨兵 sentinel 的工作目錄

dir  /tmp

# 哨兵 sentinel 監控的 redis 主節點的 ip port

# master-name 可以自己命名的主節點名字隻能由字母A-z、數字0-9、這三個字元".-_ "組成。

# quorum 配置多少個 sentinel 哨兵統一認為 master 主節點失聯,那麼這時客觀上認為主節點失聯了

# sentinel monitor <master-name> <ip> <redis-port> <quorum>

sentinel monitor mymaster 127.0.0.1 6379 2

# 當在Redis執行個體中開啟了 requirepass foobared 授權密碼這樣所有連接配接Redis執行個體的用戶端都要提供密碼

# 設定哨兵sentinel 連接配接主從的密碼,注意必須為主從設定一樣的驗證密碼

# sentinel auth-pass <master-name> <password>

sentinel auth-pass mymaster ******

# 指定多少毫秒之後主節點沒有應答哨兵 sentinel 此時哨兵主觀上認為主節點下線,預設30秒

# sentinel down-after-milliseconds <master-name> <milliseconds>

sentinel down-after-milliseconds mymaster 30000

# 這個配置項指定了在發生 failover 主備切換時最多可以有多少個 slave 同時對新的 master 進行同步,

這個數字越小,完成 failover 所需的時間就越長,

但是如果這個數字越大,就意味着越多的 slave 因為 replication 而不可用。

可以通過将這個值設為1來保證每次隻有一個 slave 處于不能處理指令請求的狀态。

# sentinel parallel-syncs <master-name> <numslaves>

sentinel parallel-syncs mymaster 1

# 故障轉移的逾時時間failover-timeout 可以用在以下這些方面:

# 1.同一個 sentinel 對同一個 master 兩次 failover 之間的間隔時間。

# 2.當一個 slave 從一個錯誤的 master 那裡同步資料開始計算時間。直到 slave 被糾正為向正确的 master 那裡同步資料時。

# 3.當想要取消一個正在進行的 failover 所需要的時間。

# 4.當進行failover時,配置所有 slaves 指向新的 master 所需的最大時間。不過,即使過了這個逾時,slaves 依然會被正确配置master,但是就不按parallel-syncs所配置的規則來了

# 預設三分鐘

# sentinel failover-timeout <master-name> <milliseconds>

sentinel failover-timeout mymaster 180000

# SCRIPTS EXECUTION

# 配置當某一事件發生時所需要執行的腳本,可以通過腳本來通知管理者,例如當系統運作不正常時發郵件通知相關人員。

# 對于腳本的運作結果有以下規則:

# 若腳本執行後傳回1,那麼該腳本稍後将會被再次執行,重複次數目前預設為10

# 若腳本執行後傳回2,或者比2更高的一個傳回值,腳本将不會重複執行。

# 如果腳本在執行過程中由于收到系統中斷信号被終止了,則同傳回值為1時的行為相同。

# 一個腳本的最大執行時間為60s,如果超過這個時間,腳本将會被一個SIGKILL信号終止,之後重新執行。

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

# 通知腳本

# sentine1 notification-script <master-name> <script-path>

sentine1 notification-script mymaster /var/redis/notify.sh

# 用戶端重新配置主節點參數腳本

# 當一個master由于failover而發生改變時,這個腳本将會被調用,通知相關的用戶端關于master位址已經發生改變的資訊。

# 以下參數将會在調用腳本時傳給腳本:

# <master-name> <ro1e> <state> <from-ip> <from-port> <to-ip> <to-port>

# 目前<state>總是“failover”,

# <role>是“leader”或者“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