環境要求
- ubuntu系統:20.04
- Docker版本:20.10.7
- redis版本:6.0.6
步驟
由于我這里已經有相應的redis鏡像,這里就不記錄了,關于docker一些基礎知識可以看我以前的筆記
開啟3臺redis服務,一個當作master,另兩個當slave
#這里就把配置文件和數據映射到宿主機中了,如果是生產環境下,需要這做映射
#開啟主服務,端口6379
docker run --name redis-master -d -p 6379:6379 redis:6.0.6
#開啟2臺從服務,端口6380,6381
docker run --name redis-slave1 -d -p 6380:6379 redis:6.0.6
docker run --name redis-slave2 -d -p 6381:6379 redis:6.0.6
配置主從
這里演示就寫配置文件了,這樣的話,服務重啟后就失效了,這里主要是記錄一下過程,就 省略了....
查看各個服務的ip地址
docker inspect 容器id或者使用 docker network inspect bridge查看ip地 址
#ip地址如下
#master
172.17.0.2
#slave1
172.17.0.3
#slave2
172.17.0.4
進入容器內部,設置主從配置
master主機
#進入容器
docker exec -it redis-master /bin/bash
#執行redis-cli命令
redis-cli
#執行info replication 查看主從信息
info replication
執行info replication 查看主從信息
在沒有設置主從時,每個redis服務的角色都是master
在兩臺從服務器上執行如下命令
在從服務器上配置主服務器ip+端口號
#命令如下
slaveof 172.17.0.2 6379
#172.17.0.2 master的ip
#6379 master的端口
通過 info replication 查看role已經變成slave
在master 服務器上使用info replication查看信息
這里可以看到如下信息,說明主從搭建完成了
測試
#在master上寫值,可以在從服務器上讀取到,這里圖略
注意
當設置完主從后,寫數據只能從master 寫入,不能在從服務器上寫入,會報錯
問題
如果master由于某種原因掛了,咋辦,在以前的版本只能手工處理切換,現在可以哨兵來解決!
生產環境使用的哨兵模式搭建主從
創建一個哨兵服務
我這里由于是測試,只開啟了一個哨兵服務,如果是線上需要開啟多臺,來保證高可用,最好設置成3臺以上
#開啟一個哨兵docker服務
docker run -d --name redis-sentinel -p 26379:26379 redis:6.0.6
#26379 redis-sentinel默認端口,需要做下端口映射,要不無法進行通信
進入到redis-sentinel容器中進行配置
進入容器
docker exec -it redis-sentinel /bin/bash
創建sentinel.conf 文件
#由于容器里沒有vim,vi編輯器,為了保持容器最小化,我這里使用echo進行操作
echo "sentinel monitor mymaster 172.2.0.2 6379 1" >> sentinel.conf
#添加后臺運行,我 這里為了方便截圖,并沒有設置后臺運行
echo "daemonize yes" >>sentinel.conf
#也可以指定目錄
echo "logfile "/log.txt"" >>sentinel.conf
啟動
redis-sentinel sentinel.conf
測試
把redis-master停掉,來看下是否能自動切換master
關閉redis-master
docker stop redis-master
等待30s后,查看redis-sentinel日志
這里可以看到,已經把redis-slave2切換成了master,進入到redis-slave2容器中,可以看到如下圖
問題
如果再把redis-master重啟后,它還會繼續當master嗎? 答案是:不會,
如下圖
總結
其實這咱哨兵模式會在生產環境下用的最多,sentinel.conf里的配置也不是和上面那樣簡單,接下來說下sentinel.conf配置文件里常用的一些配置
sentinel.conf常用配置
#端口
port 26379 #可以修改
#監聽
sentinel monitor <master-name> <ip> <port> <quorum>
#master-name 可以自定義
#quorum 是一個數字:當有多個sentinel時,指明當有多少個sentinel認為一個master失效時,master才算真正失效,比方說:如果是數字3,則說明得有3個sentinel說master失效時,master才真正的客觀下線
#ip 要寫master的真正ip
sentinel monitor mymaster 172.2.0.2 6379 3
#設置連接master和slave時的密碼,master和slave密碼應該一樣
sentinel auth-pass <master-name> <password>
#設置失效時間,單位毫秒 默認為30s
sentinel down-after-milliseconds <master-name> <milliseconds>
#例如
sentinel down-after-milliseconds mymaster 30000
# sentinel parallel-syncs <master-name> <numslaves>
#這個配置項指定了在發生failover主備切換時最多可以有多少個slave同時對新的master進行 同步,這個數字越小,完成failover所需的時間就越長,但是如果這個數字越大,就意味著越 多的slave因為replication而不可用。可以通過將這個值設為 1 來保證每次只有一個slave 處于不能處理命令請求的狀態。
# sentinel failover-timeout <master-name> <milliseconds>
#failover-timeout 可以用在以下這些方面:
# 1. 同一個sentinel對同一個master兩次failover之間的間隔時間。
# 2. 當一個slave從一個錯誤的master那里同步數據開始計算時間。直到slave被糾正為向正確的master那里同步數據時。
# 3.當想要取消一個正在進行的failover所需要的時間。
# 4.當進行failover時,配置所有slaves指向新的master所需的最大時間。不過,即使過了這個超時,slaves依然會被正確配置為指向master,但是就不按parallel-syncs所配置的規則來了。
# sentinel的notification-script和reconfig-script 是用來配置當某一事件發生時所需要執行的腳本,可以通過腳本來通知管理員,例如當系統運行不正常時發郵件通知相關人員。對于腳本的運行結果有以下規則:
#若腳本執行后返回1,那么該腳本稍后將會被再次執行,重復次數目前默認為10
#若腳本執行后返回2,或者比2更高的一個返回值,腳本將不會重復執行。
# 如果腳本在執行過程中由于收到系統中斷信號被終止了,則同返回值為1時的行為相同。
# 一個腳本的最大執行時間為60s,如果超過這個時間,腳本將會被一個SIGKILL信號終止,之后重新執行。
sentinel notification-script <master-name> <script-path>
#當一個master由于failover而發生改變時,這個腳本將會被調用,通知相關的客戶端關于master地址已經發生改變的信息
sentinel client-reconfig-script <master-name> <script-path>