文章目錄
- redis的主從複制
-
- 什麼是主從複制
- 主從複制怎麼玩
-
- 指令版的主從複制
- 配置檔案版的主從複制
- redis的哨兵模式sentinel
-
- 怎麼操作?
- 測試
redis的主從複制
什麼是主從複制
redis的複制功能是支援多個資料庫之間的資料同步。一類是主資料庫(master)一類是從資料庫(slave),主資料庫可以進行讀寫操作,當發生寫操作的時候自動将資料同步到從資料庫,而從資料庫一般是隻讀的,并接收主資料庫同步過來的資料,一個主資料庫可以有多個從資料庫,而一個從資料庫隻能有一個主資料庫。
通過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程序
ps -ef|grep redis
看到這裡說明我們的三台redis服務已經啟動了。這樣初始環境一主兩從環境就搭建好了。
指令版的主從複制
下面我們就開始搭建redis的主從複制
首先我們先需要學習一個指令
info replication //用來檢視目前基本資訊
我們連上redis6379這台
redis-cli -p 6379
127.0.0.1:6379> info replication
redis6380服務
redis6381服務
通過上面的截圖我們可以看到這裡的三台redis,都是主機,是以這裡我們需要把6380和6381設定為從機
在6380和6381執行
slaveof 127.0.0.1 6379
然後我們在切換到redis上6379檢視
發現6379是主機,下面有兩台從機(6380、6381):connected——slaves:2
在這裡我們的指令版的redis主從複制就搭建成功了。
測試:
我們向主機6379裡面插入一條資料,看看6380或者6381能不能接受到。
經測試,發現redis的主從複制搭建成功!
注意:但是這裡有個問題,就是如果6380或者6381挂掉了,當再次連上來的時候,6380、6381會變成了主機,而且不是挂載6379上面,需要重新在執行slaveof 指令。(如果主機挂了,這裡就需要使用哨兵模式,這裡等下就說。)
配置檔案版的主從複制
為解決上面指令版的主從複制出現的問題,這裡可以采用配置檔案的方式去指定主機。為友善測試,我們先把6379、6380、6381都給停掉,修改6380和6381的配置。
replicaof 127.0.0.1 6379
masterauth "password" // 有密碼就輸入密碼,沒有密碼就注釋掉。
注意,這裡修改的6380和6381都是一樣的
最後啟動三台redis。
配置檔案的方式,主從複制也搭建成功!
redis的哨兵模式sentinel
哨兵:顧名思義就是放哨使用的,當主機當機的時候,哨兵可以自動的把從機設定成主機,這樣就可以避免我們手動的去設定主機,大大的減少了我們工作量。
怎麼操作?
首先我們先建立一個sentinel.config檔案,用來存儲哨兵的配置資訊。
這裡是配置檔案(sentinel.config)的資訊(比較簡單,先用于測試。)
sentinel monitor myredis 127.0.0.1 6379 1
建立好檔案後,我指定配置檔案啟動
redis-sentinel myconfig/sentinel.config
看見如圖所示,說明哨兵啟動成功!
接下來就是測試了
測試
我們先認為的把6379(主)給關掉,看看哨兵會不會自動把6380、6381其中的一個設定為主機
走起!
從截圖中我們可以看見當6379當機後,哨兵自動的把6381設定成了主機。
思考問題:當我們6379連上來後,主機會不會切換到6379呢?
操作如下:
很明顯,結果已經出來了,當我們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