使用docker搭建redis主從復制、哨兵機制

1. 拓撲結構

本文搭建如下圖所示的redis拓撲結構,拓撲中共有3個哨兵,1和mater結點和2個slave結點。


redis拓撲結構

拓撲信息:

角色 ip port
redis-master redis-master或者master或者master-sentinel或者master-sentinel2或者master-sentinel3或自動分配的ip 6379
redis-slave1 容器啟動時自動分配的ip 6380
redis-slave2 容器啟動時自動分配的ip 6381
redis-master-sentinel 容器啟動時自動分配的ip 26379
redis-master-sentinel2 容器啟動時自動分配的ip 26380
redis-master-sentinel3 容器啟動時自動分配的ip 26381

注:master或者master-sentinel或者master-sentinel2或者master-sentinel3都是主節點容器的別名。與之相關聯的容器可以通過別稱來代替ip訪問容器。

2. 搭建主從復制結構

2.1 master節點配置

2.1.1 master節點配置文件

master節點配置文件

2.1.2 master節點配置文件詳解

  • port: 端口號
  • daemonize:redis采用的是單進程多線程的模式。當redis.conf中選項daemonize設置成yes時,代表開啟守護進程模式。在該模式下,redis會在后臺運行,并將進程pid號寫入至redis.conf選項pidfile設置的文件中,此時redis將一直運行,除非手動kill該進程。
  • logfile: 日志文件的名字,在工作目錄下自動創建,會記錄redis的運行日志。
  • dbfilename: dump文件的名字,在工作目錄下自動創建。
  • dir: 工作目錄的路徑。

其他配置請參考redis中文官網:www.redis.cn

2.1.3 在docker中運行redis master節點服務

master節點docker命令

命令說明:

  • --name: 命名容器為redis-master,一定不要忽略容器命名,為后面--link命令命名更容易記住名字。
  • -v:將本地的配置文件~/redis/redis-6379.conf掛載到容器中的/redis/redis-6379.conf

容器啟動后,進入容器掛載的目錄,執行redis-server redis-6379.conf命令,使用redis-6379.conf配置啟動redis服務。具體操作如下圖所示:

啟動master節點

執行上述命令之后,如果沒有消息,那么就是最好的消息,說明redis-server已經成功啟動了??梢酝ㄟ^redis-6379.conf中配置的日志文件來查看啟動情況。具體操作如下圖所示:
查看日志文件

日志說明:

  • 第一行:redis正在啟動
  • 第二行:redis版本信息,64位,進程號等
  • 第三行:加載配置
  • 第四行:redis的運行模式為standalone,端口為6379
  • 第五行:警告,這句話的翻譯大概就是:對一個高負載的環境來說tcp設置128這個值,太小了。具體解決方案參考:https://www.cnblogs.com/faunjoe88/p/7158484.html
  • 第六行:說明redis server已經成功初始化
  • 第七行: 警告,THP的系統配置問題,具體參考:https://jingyan.baidu.com/article/da1091fb196ea7027849d6b0.html

上述警告對于demo來說可以忽略,但是對于生產環境,需要重新對系統進行相關配置之后,再重新啟動容器。
至此,master節點已經成功啟動了。

2.2 slave節點配置

2.2.1 slave節點配置文件

兩個slave節點的配置一模一樣,除了端口號之外。slave1的端口為6380,slave2的端口號為6381。


slave1節點的配置文件

2.2.2 slave節點配置文件詳解

  • 前5項配置和master節點類似,請參考master節點配置說明。
  • 這里重點說一下 slaveof命令,此命令用來給當前redis server節點指定一個master節點,自身作為master節點的slave節點。
    slaveof命令的格式為slaveof <ip> <port>,很明顯,當前節點通過ip和port來定位將哪一個節點作為master節點,但是對于配置slaveof redis-master 6379來說,redis-master參數并不是一個ip。這里是因為在docker環境下,容器啟動是ip是不定的,所以容器的通信可以通過--link選項來實現,而這里的redis-master就是master節點容器的名字,用容器名可以代替ip。具體參看下文。

2.2.3 在docker中運行redis slave節點服務

啟動slave節點容器

命令說明:

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

容器啟動后使用redis-server redis-6380.conf命令啟動redis server服務。如下圖所示:

啟動redis server服務

redis-server redis-6380.conf命令執行后,如果沒有任何消息,那么就是最好的消息,說明redis server已經成功啟動。
下面可以通過查看日志文件來查看啟動情況。如下圖所示:
查看17slave2的日志

日志分析:

  • 從第二行可以看出redis-server已經啟動成功了。
  • Connecting to MASTER redis-master:6379說明已經連接到master節點,并且開始了數據的同步,從master節點復制到slave節點。
  • 從最后6行可以看出,因為是新增的slave結點,所以master到slave的復制時全量復制(倒數第五行),部分復制不可用(倒數第六行)。復制一共經歷了四個步驟(最后四行):1. 從master接收數據 2.清理掉舊的數據 3.在內存中接在db 4.復制成功。

2.3 配置redis哨兵

2.3.1 redis哨兵配置文件

redis-sentinel1配置文件

配置說明:

  • port daemonize logfile dir配置和普通redis server節點相同。
  • sentinel monitor:該命令的格式為sentinel monitor <master> <ip> <port> <quorum>
    <master>:參數為哨兵監控的master節點的別名
    <ip>:參數為監控的master節點的ip(在docker中,容器間用--link命令通信,所以可以替換為目標容器的名字或別名)
    <port>:為監控的master結點的端口
    <quorum>:代表要判定master節點最終不可達所需要的票數。用于故障發現和判定。例如如果將quorum配置為2,代表至少要兩個哨兵節點認為master節點不可達,那么這個不可達的判定才是客觀的,對于<quorum>值設置的越小,那么達到下線的條件就越寬松,反之越嚴格。一般建議將其設置為哨兵節點的數量加1。
  • sentinel down-after-milliseconds命令格式為sentinel down-after-milliseconds <master-name> <times>
    <master>:參數為主節點的名稱,這里為上面設置的mymaster
    <times>:sentinel節點定期會想master節點發送ping命令,如果超過times毫秒沒有收到回復,則判定該節點不可達。down-after-milliseconds雖然以<master-name>為參數,但實際上對哨兵節點、主節點、從節點的判定同時有效,可以通過主節點來獲取從節點和哨兵節點的信息。
  • sentinel parallel-syncs格式為sentinel parallel-syncs <master-name> <nums>
    當哨兵節點集合對主節點的故障判定達到一致時,哨兵領導節點會做故障轉移操作,選出新的主節點,原來的從節點會向新的主節點發起復制操作,parallel-syncs參數就是限制從節點向新的主節點發起復制的個數。若發起復制的從節點過多,那么可能會造成主節點阻塞。若發起復制的從節點過少,可能會造成數據在復制期間不一致的情況。
    sentinel parallel-syncs示意圖
  • sentinel failover-timeout 格式為sentinel failover-timeout <master-name> <times>
    表示故障轉移的超時時間。

其他配置請參加redis中文官網:www.redis.cn

2.3.3 在docker容器中啟動redis哨兵服務

使用下圖命令在容器中啟動redis哨兵服務。

docker啟動redis哨兵命令

其他兩個哨兵服務只需要修改:
--name參數(比如 redis-master-sentinel2)
-v掛載相應的配置文件(比如~/redis/redis-26380.conf:/redis/redis-62380.conf),--link參數給主節點去不同的別名(比如redis-master:master-sentinel2)。

在容器中啟動redis-sentinel服務:


在容器中啟動redis-sentinel服務

運行上述命令后沒有消息,就是最好的消息。
下面可以查看工作目錄下的日志文件來查看啟動情況。如下圖所示:


查看哨兵節點的日志

日志說明:
  • 從第四行可以看出,節點啟動成功,以sentinel模式運行,端口為26379。
  • 倒數第二行為sentinel的id信息
  • 最后一行說明新加了一個哨兵節點監控到master節點,名字為mymaster,ip為172.17.0.2,quorum為2。

至此,redis-sentinel節點配置完畢,其余兩個sentinel節點請讀者根據上面配置自行配置完成(很容易)。

3 總結

本文從配置角度描述了怎么使用Docker搭建redis主從復制,并且添加了哨兵機制,但是并沒有對redis進行詳細剖析,這里強烈建議讀者閱讀相關書籍或是到redis官網了解redis運行機制。
若有問題,歡迎在評論區留言。
本文會定期更新,以便使用跟新版本的redis和docker。

`

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,214評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,781評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,315評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,699評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,882評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,441評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,189評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,388評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,613評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,112評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,334評論 2 377

推薦閱讀更多精彩內容

  • 前言 Redis是一個高性能的key-value數據庫,現時越來越多企業與應用使用Redis作為緩存服務器。樓主是...
    liangzzz閱讀 4,282評論 9 152
  • 這段時間沒好好看書,業余的、技術的、個人喜歡的都沒好好看。總把時間浪費在各種帖子、群、公眾號、朋友圈里,看別人嚼爛...
    鴻都百煉生閱讀 142評論 0 0
  • Mysql-基礎語法 導語 本博文主要是簡述選擇數據庫和對表內容的增、刪、改和查的一些基本語法 USE 語法: U...
    SolaTyolo閱讀 777評論 0 0
  • 說《詩經》應該都是吟唱出來的,誰來給譜個小曲兒?唱出來的話,也許更能體會它們的美妙吧。 1. 蒹葭(jiān ji...
    柳小妍閱讀 575評論 5 9