天天看點

redis的主從複制和哨兵模式環境搭建redis的主從複制

文章目錄

  • redis的主從複制
    • 什麼是主從複制
    • 主從複制怎麼玩
      • 指令版的主從複制
      • 配置檔案版的主從複制
    • redis的哨兵模式sentinel
      • 怎麼操作?
      • 測試

redis的主從複制

什麼是主從複制

redis的複制功能是支援多個資料庫之間的資料同步。一類是主資料庫(master)一類是從資料庫(slave),主資料庫可以進行讀寫操作,當發生寫操作的時候自動将資料同步到從資料庫,而從資料庫一般是隻讀的,并接收主資料庫同步過來的資料,一個主資料庫可以有多個從資料庫,而一個從資料庫隻能有一個主資料庫。

通過redis的複制功能可以很好的實作資料庫的讀寫分離,提高伺服器的負載能力。主資料庫主要進行寫操作,而從資料庫負責讀操作。

主從複制怎麼玩

首先需要準備三台伺服器,這裡因為資源有限,就在一台機器完成操作。首先我們需要把配置檔案給複制三份

redis的主從複制和哨兵模式環境搭建redis的主從複制

修改三份配置檔案裡面的配置,主要是修改端口号、日志檔案、rdb檔案、pidfile。

以6380為例,其他的config配置檔案,都是修改相同的地方。

port 6380
pidfile /var/run/redis_6380.pid
logfile "6380.log"
dbfilename dump6380.rdb
           

修改完畢後,我們啟動redis

redis-server myconfig/redis79.conf
redis-server myconfig/redis80.conf
redis-server myconfig/redis81.conf
           
redis的主從複制和哨兵模式環境搭建redis的主從複制

檢視redis程序

ps -ef|grep redis
           
redis的主從複制和哨兵模式環境搭建redis的主從複制

看到這裡說明我們的三台redis服務已經啟動了。這樣初始環境一主兩從環境就搭建好了。

指令版的主從複制

下面我們就開始搭建redis的主從複制

首先我們先需要學習一個指令

info replication  //用來檢視目前基本資訊
           

我們連上redis6379這台

redis-cli  -p 6379
127.0.0.1:6379> info replication

           
redis的主從複制和哨兵模式環境搭建redis的主從複制

redis6380服務

redis的主從複制和哨兵模式環境搭建redis的主從複制

redis6381服務

redis的主從複制和哨兵模式環境搭建redis的主從複制

通過上面的截圖我們可以看到這裡的三台redis,都是主機,是以這裡我們需要把6380和6381設定為從機

在6380和6381執行

slaveof 127.0.0.1 6379
           
redis的主從複制和哨兵模式環境搭建redis的主從複制
redis的主從複制和哨兵模式環境搭建redis的主從複制

然後我們在切換到redis上6379檢視

redis的主從複制和哨兵模式環境搭建redis的主從複制

發現6379是主機,下面有兩台從機(6380、6381):connected——slaves:2

在這裡我們的指令版的redis主從複制就搭建成功了。

測試:

我們向主機6379裡面插入一條資料,看看6380或者6381能不能接受到。

redis的主從複制和哨兵模式環境搭建redis的主從複制
redis的主從複制和哨兵模式環境搭建redis的主從複制
redis的主從複制和哨兵模式環境搭建redis的主從複制

經測試,發現redis的主從複制搭建成功!

注意:但是這裡有個問題,就是如果6380或者6381挂掉了,當再次連上來的時候,6380、6381會變成了主機,而且不是挂載6379上面,需要重新在執行slaveof 指令。(如果主機挂了,這裡就需要使用哨兵模式,這裡等下就說。)

配置檔案版的主從複制

為解決上面指令版的主從複制出現的問題,這裡可以采用配置檔案的方式去指定主機。為友善測試,我們先把6379、6380、6381都給停掉,修改6380和6381的配置。

replicaof 127.0.0.1  6379

masterauth "password"  // 有密碼就輸入密碼,沒有密碼就注釋掉。
           

注意,這裡修改的6380和6381都是一樣的

最後啟動三台redis。

redis的主從複制和哨兵模式環境搭建redis的主從複制

配置檔案的方式,主從複制也搭建成功!

redis的哨兵模式sentinel

哨兵:顧名思義就是放哨使用的,當主機當機的時候,哨兵可以自動的把從機設定成主機,這樣就可以避免我們手動的去設定主機,大大的減少了我們工作量。

怎麼操作?

首先我們先建立一個sentinel.config檔案,用來存儲哨兵的配置資訊。

這裡是配置檔案(sentinel.config)的資訊(比較簡單,先用于測試。)

sentinel monitor myredis 127.0.0.1 6379 1
           

建立好檔案後,我指定配置檔案啟動

redis-sentinel myconfig/sentinel.config
           
redis的主從複制和哨兵模式環境搭建redis的主從複制

看見如圖所示,說明哨兵啟動成功!

接下來就是測試了

測試

我們先認為的把6379(主)給關掉,看看哨兵會不會自動把6380、6381其中的一個設定為主機

走起!

redis的主從複制和哨兵模式環境搭建redis的主從複制
redis的主從複制和哨兵模式環境搭建redis的主從複制

從截圖中我們可以看見當6379當機後,哨兵自動的把6381設定成了主機。

思考問題:當我們6379連上來後,主機會不會切換到6379呢?

操作如下:

redis的主從複制和哨兵模式環境搭建redis的主從複制

很明顯,結果已經出來了,當我們6379連上來後,6381還是主機。這裡我們現實生活中,不也是一樣嗎?當我們不努力被淘汰後,想再次追上來就很難,是以我們需要不斷的加強自己的專業技能~~~

最上附上百度搜集來的sentinel.config檔案詳解

# Example sentinel.conf
 
# 哨兵sentinel執行個體運作的端口 預設26379
port 26379
 
# 哨兵sentinel的工作目錄
dir /tmp
 
# 哨兵sentinel監控的redis主節點的 ip port 
# master-name  可以自己命名的主節點名字 隻能由字母A-z、數字0-9 、這三個字元".-_"組成。
# quorum 當這些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 MySUPER--secret-0123passw0rd
 
 
# 指定多少毫秒之後 主節點沒有應答哨兵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信号終止,之後重新執行。
 
#通知型腳本:當sentinel有任何警告級别的事件發生時(比如說redis執行個體的主觀失效和客觀失效等等),将會去調用這個腳本,
這時這個腳本應該通過郵件,SMS等方式去通知系統管理者關于系統不正常運作的資訊。調用該腳本時,将傳給腳本兩個參數,
一個是事件的類型,
一個是事件的描述。
如果sentinel.conf配置檔案中配置了這個腳本路徑,那麼必須保證這個腳本存在于這個路徑,并且是可執行的,否則sentinel無法正常啟動成功。
#通知腳本
# sentinel notification-script <master-name> <script-path>
  sentinel notification-script mymaster /var/redis/notify.sh
 
# 用戶端重新配置主節點參數腳本
# 當一個master由于failover而發生改變時,這個腳本将會被調用,通知相關的用戶端關于master位址已經發生改變的資訊。
# 以下參數将會在調用腳本時傳給腳本:
# <master-name> <role> <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>
 sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
           

繼續閱讀