1. 拓?fù)浣Y(jié)構(gòu)
本文搭建如下圖所示的redis拓?fù)浣Y(jié)構(gòu),拓?fù)渲泄灿?個(gè)哨兵,1和mater結(jié)點(diǎn)和2個(gè)slave結(jié)點(diǎn)。

拓?fù)湫畔ⅲ?/p>
| 角色 | ip | port |
|---|---|---|
| redis-master | redis-master或者master或者master-sentinel或者master-sentinel2或者master-sentinel3或自動(dòng)分配的ip | 6379 |
| redis-slave1 | 容器啟動(dòng)時(shí)自動(dòng)分配的ip | 6380 |
| redis-slave2 | 容器啟動(dòng)時(shí)自動(dòng)分配的ip | 6381 |
| redis-master-sentinel | 容器啟動(dòng)時(shí)自動(dòng)分配的ip | 26379 |
| redis-master-sentinel2 | 容器啟動(dòng)時(shí)自動(dòng)分配的ip | 26380 |
| redis-master-sentinel3 | 容器啟動(dòng)時(shí)自動(dòng)分配的ip | 26381 |
注:master或者master-sentinel或者master-sentinel2或者master-sentinel3都是主節(jié)點(diǎn)容器的別名。與之相關(guān)聯(lián)的容器可以通過(guò)別稱來(lái)代替ip訪問(wèn)容器。
2. 搭建主從復(fù)制結(jié)構(gòu)
2.1 master節(jié)點(diǎn)配置
2.1.1 master節(jié)點(diǎn)配置文件

2.1.2 master節(jié)點(diǎn)配置文件詳解
-
port: 端口號(hào) -
daemonize:redis采用的是單進(jìn)程多線程的模式。當(dāng)redis.conf中選項(xiàng)daemonize設(shè)置成yes時(shí),代表開(kāi)啟守護(hù)進(jìn)程模式。在該模式下,redis會(huì)在后臺(tái)運(yùn)行,并將進(jìn)程pid號(hào)寫入至redis.conf選項(xiàng)pidfile設(shè)置的文件中,此時(shí)redis將一直運(yùn)行,除非手動(dòng)kill該進(jìn)程。 -
logfile: 日志文件的名字,在工作目錄下自動(dòng)創(chuàng)建,會(huì)記錄redis的運(yùn)行日志。 -
dbfilename: dump文件的名字,在工作目錄下自動(dòng)創(chuàng)建。 -
dir: 工作目錄的路徑。
其他配置請(qǐng)參考redis中文官網(wǎng):www.redis.cn
2.1.3 在docker中運(yùn)行redis master節(jié)點(diǎn)服務(wù)

命令說(shuō)明:
-
--name: 命名容器為redis-master,一定不要忽略容器命名,為后面--link命令命名更容易記住名字。 -
-v:將本地的配置文件~/redis/redis-6379.conf掛載到容器中的/redis/redis-6379.conf
容器啟動(dòng)后,進(jìn)入容器掛載的目錄,執(zhí)行redis-server redis-6379.conf命令,使用redis-6379.conf配置啟動(dòng)redis服務(wù)。具體操作如下圖所示:

執(zhí)行上述命令之后,如果沒(méi)有消息,那么就是最好的消息,說(shuō)明redis-server已經(jīng)成功啟動(dòng)了??梢酝ㄟ^(guò)
redis-6379.conf中配置的日志文件來(lái)查看啟動(dòng)情況。具體操作如下圖所示:
日志說(shuō)明:
- 第一行:redis正在啟動(dòng)
- 第二行:redis版本信息,64位,進(jìn)程號(hào)等
- 第三行:加載配置
- 第四行:redis的運(yùn)行模式為standalone,端口為6379
- 第五行:警告,這句話的翻譯大概就是:對(duì)一個(gè)高負(fù)載的環(huán)境來(lái)說(shuō)tcp設(shè)置128這個(gè)值,太小了。具體解決方案參考:https://www.cnblogs.com/faunjoe88/p/7158484.html
- 第六行:說(shuō)明redis server已經(jīng)成功初始化
- 第七行: 警告,THP的系統(tǒng)配置問(wèn)題,具體參考:https://jingyan.baidu.com/article/da1091fb196ea7027849d6b0.html
上述警告對(duì)于demo來(lái)說(shuō)可以忽略,但是對(duì)于生產(chǎn)環(huán)境,需要重新對(duì)系統(tǒng)進(jìn)行相關(guān)配置之后,再重新啟動(dòng)容器。
至此,master節(jié)點(diǎn)已經(jīng)成功啟動(dòng)了。
2.2 slave節(jié)點(diǎn)配置
2.2.1 slave節(jié)點(diǎn)配置文件
兩個(gè)slave節(jié)點(diǎn)的配置一模一樣,除了端口號(hào)之外。slave1的端口為6380,slave2的端口號(hào)為6381。

2.2.2 slave節(jié)點(diǎn)配置文件詳解
- 前5項(xiàng)配置和master節(jié)點(diǎn)類似,請(qǐng)參考master節(jié)點(diǎn)配置說(shuō)明。
- 這里重點(diǎn)說(shuō)一下
slaveof命令,此命令用來(lái)給當(dāng)前redis server節(jié)點(diǎn)指定一個(gè)master節(jié)點(diǎn),自身作為master節(jié)點(diǎn)的slave節(jié)點(diǎn)。
slaveof命令的格式為slaveof <ip> <port>,很明顯,當(dāng)前節(jié)點(diǎn)通過(guò)ip和port來(lái)定位將哪一個(gè)節(jié)點(diǎn)作為master節(jié)點(diǎn),但是對(duì)于配置slaveof redis-master 6379來(lái)說(shuō),redis-master參數(shù)并不是一個(gè)ip。這里是因?yàn)樵赿ocker環(huán)境下,容器啟動(dòng)是ip是不定的,所以容器的通信可以通過(guò)--link選項(xiàng)來(lái)實(shí)現(xiàn),而這里的redis-master就是master節(jié)點(diǎn)容器的名字,用容器名可以代替ip。具體參看下文。
2.2.3 在docker中運(yùn)行redis slave節(jié)點(diǎn)服務(wù)

命令說(shuō)明:
-
--name: 容器名為redis-slave1 -
-v: 將本地~/redis/redis-6380.conf掛載到容器目錄/redis/redis-6380.conf -
--link: 建立與master節(jié)點(diǎn)之間的容器間的通信,redis-master為master節(jié)點(diǎn)的容器名,master為redis-master的別名。因此,slave的配置文件redis-6380.conf中最后一項(xiàng)配置也可以配置為slaveof master 6379。
容器啟動(dòng)后使用redis-server redis-6380.conf命令啟動(dòng)redis server服務(wù)。如下圖所示:

redis-server redis-6380.conf命令執(zhí)行后,如果沒(méi)有任何消息,那么就是最好的消息,說(shuō)明redis server已經(jīng)成功啟動(dòng)。下面可以通過(guò)查看日志文件來(lái)查看啟動(dòng)情況。如下圖所示:

日志分析:
- 從第二行可以看出redis-server已經(jīng)啟動(dòng)成功了。
- Connecting to MASTER redis-master:6379說(shuō)明已經(jīng)連接到master節(jié)點(diǎn),并且開(kāi)始了數(shù)據(jù)的同步,從master節(jié)點(diǎn)復(fù)制到slave節(jié)點(diǎn)。
- 從最后6行可以看出,因?yàn)槭切略龅膕lave結(jié)點(diǎn),所以master到slave的復(fù)制時(shí)全量復(fù)制(倒數(shù)第五行),部分復(fù)制不可用(倒數(shù)第六行)。復(fù)制一共經(jīng)歷了四個(gè)步驟(最后四行):1. 從master接收數(shù)據(jù) 2.清理掉舊的數(shù)據(jù) 3.在內(nèi)存中接在db 4.復(fù)制成功。
2.3 配置redis哨兵
2.3.1 redis哨兵配置文件

配置說(shuō)明:
-
port daemonize logfile dir配置和普通redis server節(jié)點(diǎn)相同。 -
sentinel monitor:該命令的格式為sentinel monitor <master> <ip> <port> <quorum>。
<master>:參數(shù)為哨兵監(jiān)控的master節(jié)點(diǎn)的別名
<ip>:參數(shù)為監(jiān)控的master節(jié)點(diǎn)的ip(在docker中,容器間用--link命令通信,所以可以替換為目標(biāo)容器的名字或別名)
<port>:為監(jiān)控的master結(jié)點(diǎn)的端口
<quorum>:代表要判定master節(jié)點(diǎn)最終不可達(dá)所需要的票數(shù)。用于故障發(fā)現(xiàn)和判定。例如如果將quorum配置為2,代表至少要兩個(gè)哨兵節(jié)點(diǎn)認(rèn)為master節(jié)點(diǎn)不可達(dá),那么這個(gè)不可達(dá)的判定才是客觀的,對(duì)于<quorum>值設(shè)置的越小,那么達(dá)到下線的條件就越寬松,反之越嚴(yán)格。一般建議將其設(shè)置為哨兵節(jié)點(diǎn)的數(shù)量加1。 -
sentinel down-after-milliseconds命令格式為sentinel down-after-milliseconds <master-name> <times>
<master>:參數(shù)為主節(jié)點(diǎn)的名稱,這里為上面設(shè)置的mymaster
<times>:sentinel節(jié)點(diǎn)定期會(huì)想master節(jié)點(diǎn)發(fā)送ping命令,如果超過(guò)times毫秒沒(méi)有收到回復(fù),則判定該節(jié)點(diǎn)不可達(dá)。down-after-milliseconds雖然以<master-name>為參數(shù),但實(shí)際上對(duì)哨兵節(jié)點(diǎn)、主節(jié)點(diǎn)、從節(jié)點(diǎn)的判定同時(shí)有效,可以通過(guò)主節(jié)點(diǎn)來(lái)獲取從節(jié)點(diǎn)和哨兵節(jié)點(diǎn)的信息。 -
sentinel parallel-syncs格式為sentinel parallel-syncs <master-name> <nums>
當(dāng)哨兵節(jié)點(diǎn)集合對(duì)主節(jié)點(diǎn)的故障判定達(dá)到一致時(shí),哨兵領(lǐng)導(dǎo)節(jié)點(diǎn)會(huì)做故障轉(zhuǎn)移操作,選出新的主節(jié)點(diǎn),原來(lái)的從節(jié)點(diǎn)會(huì)向新的主節(jié)點(diǎn)發(fā)起復(fù)制操作,parallel-syncs參數(shù)就是限制從節(jié)點(diǎn)向新的主節(jié)點(diǎn)發(fā)起復(fù)制的個(gè)數(shù)。若發(fā)起復(fù)制的從節(jié)點(diǎn)過(guò)多,那么可能會(huì)造成主節(jié)點(diǎn)阻塞。若發(fā)起復(fù)制的從節(jié)點(diǎn)過(guò)少,可能會(huì)造成數(shù)據(jù)在復(fù)制期間不一致的情況。
sentinel parallel-syncs示意圖 -
sentinel failover-timeout格式為sentinel failover-timeout <master-name> <times>
表示故障轉(zhuǎn)移的超時(shí)時(shí)間。
其他配置請(qǐng)參加redis中文官網(wǎng):www.redis.cn
2.3.3 在docker容器中啟動(dòng)redis哨兵服務(wù)
使用下圖命令在容器中啟動(dòng)redis哨兵服務(wù)。

其他兩個(gè)哨兵服務(wù)只需要修改:
--name參數(shù)(比如 redis-master-sentinel2)-v掛載相應(yīng)的配置文件(比如~/redis/redis-26380.conf:/redis/redis-62380.conf),--link參數(shù)給主節(jié)點(diǎn)去不同的別名(比如redis-master:master-sentinel2)。
在容器中啟動(dòng)redis-sentinel服務(wù):

運(yùn)行上述命令后沒(méi)有消息,就是最好的消息。
下面可以查看工作目錄下的日志文件來(lái)查看啟動(dòng)情況。如下圖所示:

日志說(shuō)明:
- 從第四行可以看出,節(jié)點(diǎn)啟動(dòng)成功,以sentinel模式運(yùn)行,端口為26379。
- 倒數(shù)第二行為sentinel的id信息
- 最后一行說(shuō)明新加了一個(gè)哨兵節(jié)點(diǎn)監(jiān)控到master節(jié)點(diǎn),名字為mymaster,ip為172.17.0.2,quorum為2。
至此,redis-sentinel節(jié)點(diǎn)配置完畢,其余兩個(gè)sentinel節(jié)點(diǎn)請(qǐng)讀者根據(jù)上面配置自行配置完成(很容易)。
3 總結(jié)
本文從配置角度描述了怎么使用Docker搭建redis主從復(fù)制,并且添加了哨兵機(jī)制,但是并沒(méi)有對(duì)redis進(jìn)行詳細(xì)剖析,這里強(qiáng)烈建議讀者閱讀相關(guān)書籍或是到redis官網(wǎng)了解redis運(yùn)行機(jī)制。
若有問(wèn)題,歡迎在評(píng)論區(qū)留言。
本文會(huì)定期更新,以便使用跟新版本的redis和docker。
`
