使用docker搭建redis主從復(fù)制、哨兵機(jī)制

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)。


redis拓?fù)浣Y(jié)構(gòu)

拓?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)配置文件

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ù)

master節(jié)點(diǎn)docker命令

命令說(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ù)。具體操作如下圖所示:

啟動(dòng)master節(jié)點(diǎn)

執(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。


slave1節(jié)點(diǎn)的配置文件

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ù)

啟動(dòng)slave節(jié)點(diǎn)容器

命令說(shuō)明:

  • --name: 容器名為redis-slave1
  • -v: 將本地~/redis/redis-6380.conf掛載到容器目錄/redis/redis-6380.conf
  • --link: 建立與master節(jié)點(diǎn)之間的容器間的通信,redis-master為master節(jié)點(diǎn)的容器名,masterredis-master的別名。因此,slave的配置文件redis-6380.conf中最后一項(xiàng)配置也可以配置為slaveof master 6379

容器啟動(dòng)后使用redis-server redis-6380.conf命令啟動(dòng)redis server服務(wù)。如下圖所示:

啟動(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)情況。如下圖所示:
查看17slave2的日志

日志分析:

  • 從第二行可以看出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哨兵配置文件

redis-sentinel1配置文件

配置說(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ù)。

docker啟動(dòng)redis哨兵命令

其他兩個(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ù):


在容器中啟動(dòng)redis-sentinel服務(wù)

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


查看哨兵節(jié)點(diǎn)的日志

日志說(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。

`

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 Redis是一個(gè)高性能的key-value數(shù)據(jù)庫(kù),現(xiàn)時(shí)越來(lái)越多企業(yè)與應(yīng)用使用Redis作為緩存服務(wù)器。樓主是...
    liangzzz閱讀 4,435評(píng)論 9 152
  • 這段時(shí)間沒(méi)好好看書,業(yè)余的、技術(shù)的、個(gè)人喜歡的都沒(méi)好好看。總把時(shí)間浪費(fèi)在各種帖子、群、公眾號(hào)、朋友圈里,看別人嚼爛...
    鴻都百煉生閱讀 158評(píng)論 0 0
  • Mysql-基礎(chǔ)語(yǔ)法 導(dǎo)語(yǔ) 本博文主要是簡(jiǎn)述選擇數(shù)據(jù)庫(kù)和對(duì)表內(nèi)容的增、刪、改和查的一些基本語(yǔ)法 USE 語(yǔ)法: U...
    SolaTyolo閱讀 879評(píng)論 0 0
  • 說(shuō)《詩(shī)經(jīng)》應(yīng)該都是吟唱出來(lái)的,誰(shuí)來(lái)給譜個(gè)小曲兒?唱出來(lái)的話,也許更能體會(huì)它們的美妙吧。 1. 蒹葭(jiān ji...
    柳小妍閱讀 675評(píng)論 5 9

友情鏈接更多精彩內(nèi)容