環(huán)境要求
- ubuntu系統(tǒng):20.04
- Docker版本:20.10.7
- redis版本:6.0.6
步驟
由于我這里已經(jīng)有相應(yīng)的redis鏡像,這里就不記錄了,關(guān)于docker一些基礎(chǔ)知識可以看我以前的筆記
開啟3臺redis服務(wù),一個當作master,另兩個當slave
#這里就把配置文件和數(shù)據(jù)映射到宿主機中了,如果是生產(chǎn)環(huán)境下,需要這做映射
#開啟主服務(wù),端口6379
docker run --name redis-master -d -p 6379:6379 redis:6.0.6
#開啟2臺從服務(wù),端口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

配置主從
這里演示就寫配置文件了,這樣的話,服務(wù)重啟后就失效了,這里主要是記錄一下過程,就 省略了....
查看各個服務(wù)的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
進入容器內(nèi)部,設(shè)置主從配置
master主機
#進入容器
docker exec -it redis-master /bin/bash
#執(zhí)行redis-cli命令
redis-cli
#執(zhí)行info replication 查看主從信息
info replication
執(zhí)行info replication 查看主從信息

在沒有設(shè)置主從時,每個redis服務(wù)的角色都是master
在兩臺從服務(wù)器上執(zhí)行如下命令
在從服務(wù)器上配置主服務(wù)器ip+端口號
#命令如下
slaveof 172.17.0.2 6379
#172.17.0.2 master的ip
#6379 master的端口
通過 info replication 查看role已經(jīng)變成slave

在master 服務(wù)器上使用info replication查看信息
這里可以看到如下信息,說明主從搭建完成了

測試
#在master上寫值,可以在從服務(wù)器上讀取到,這里圖略
注意
當設(shè)置完主從后,寫數(shù)據(jù)只能從master 寫入,不能在從服務(wù)器上寫入,會報錯

問題
如果master由于某種原因掛了,咋辦,在以前的版本只能手工處理切換,現(xiàn)在可以哨兵來解決!
生產(chǎn)環(huán)境使用的哨兵模式搭建主從
創(chuàng)建一個哨兵服務(wù)
我這里由于是測試,只開啟了一個哨兵服務(wù),如果是線上需要開啟多臺,來保證高可用,最好設(shè)置成3臺以上
#開啟一個哨兵docker服務(wù)
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
創(chuàng)建sentinel.conf 文件
#由于容器里沒有vim,vi編輯器,為了保持容器最小化,我這里使用echo進行操作
echo "sentinel monitor mymaster 172.2.0.2 6379 1" >> sentinel.conf
#添加后臺運行,我 這里為了方便截圖,并沒有設(shè)置后臺運行
echo "daemonize yes" >>sentinel.conf
#也可以指定目錄
echo "logfile "/log.txt"" >>sentinel.conf
啟動
redis-sentinel sentinel.conf

測試
把redis-master停掉,來看下是否能自動切換master
關(guān)閉redis-master
docker stop redis-master
等待30s后,查看redis-sentinel日志

這里可以看到,已經(jīng)把redis-slave2切換成了master,進入到redis-slave2容器中,可以看到如下圖

問題
如果再把redis-master重啟后,它還會繼續(xù)當master嗎? 答案是:不會,
如下圖

總結(jié)
其實這咱哨兵模式會在生產(chǎn)環(huán)境下用的最多,sentinel.conf里的配置也不是和上面那樣簡單,接下來說下sentinel.conf配置文件里常用的一些配置
sentinel.conf常用配置
#端口
port 26379 #可以修改
#監(jiān)聽
sentinel monitor <master-name> <ip> <port> <quorum>
#master-name 可以自定義
#quorum 是一個數(shù)字:當有多個sentinel時,指明當有多少個sentinel認為一個master失效時,master才算真正失效,比方說:如果是數(shù)字3,則說明得有3個sentinel說master失效時,master才真正的客觀下線
#ip 要寫master的真正ip
sentinel monitor mymaster 172.2.0.2 6379 3
#設(shè)置連接master和slave時的密碼,master和slave密碼應(yīng)該一樣
sentinel auth-pass <master-name> <password>
#設(shè)置失效時間,單位毫秒 默認為30s
sentinel down-after-milliseconds <master-name> <milliseconds>
#例如
sentinel down-after-milliseconds mymaster 30000
# sentinel parallel-syncs <master-name> <numslaves>
#這個配置項指定了在發(fā)生failover主備切換時最多可以有多少個slave同時對新的master進行 同步,這個數(shù)字越小,完成failover所需的時間就越長,但是如果這個數(shù)字越大,就意味著越 多的slave因為replication而不可用。可以通過將這個值設(shè)為 1 來保證每次只有一個slave 處于不能處理命令請求的狀態(tài)。
# sentinel failover-timeout <master-name> <milliseconds>
#failover-timeout 可以用在以下這些方面:
# 1. 同一個sentinel對同一個master兩次failover之間的間隔時間。
# 2. 當一個slave從一個錯誤的master那里同步數(shù)據(jù)開始計算時間。直到slave被糾正為向正確的master那里同步數(shù)據(jù)時。
# 3.當想要取消一個正在進行的failover所需要的時間。
# 4.當進行failover時,配置所有slaves指向新的master所需的最大時間。不過,即使過了這個超時,slaves依然會被正確配置為指向master,但是就不按parallel-syncs所配置的規(guī)則來了。
# sentinel的notification-script和reconfig-script 是用來配置當某一事件發(fā)生時所需要執(zhí)行的腳本,可以通過腳本來通知管理員,例如當系統(tǒng)運行不正常時發(fā)郵件通知相關(guān)人員。對于腳本的運行結(jié)果有以下規(guī)則:
#若腳本執(zhí)行后返回1,那么該腳本稍后將會被再次執(zhí)行,重復次數(shù)目前默認為10
#若腳本執(zhí)行后返回2,或者比2更高的一個返回值,腳本將不會重復執(zhí)行。
# 如果腳本在執(zhí)行過程中由于收到系統(tǒng)中斷信號被終止了,則同返回值為1時的行為相同。
# 一個腳本的最大執(zhí)行時間為60s,如果超過這個時間,腳本將會被一個SIGKILL信號終止,之后重新執(zhí)行。
sentinel notification-script <master-name> <script-path>
#當一個master由于failover而發(fā)生改變時,這個腳本將會被調(diào)用,通知相關(guān)的客戶端關(guān)于master地址已經(jīng)發(fā)生改變的信息
sentinel client-reconfig-script <master-name> <script-path>