docker-compose安裝redis一主二從三哨兵

JohnnyWu發表於2021-12-04

宣告:主從複製跟叢集是有區別的,而現在講的是主從複製

分別建立redis、redis-sentinel資料夾

cd redis
mkdir master slave1 slave2 #分別建立master、slave1、slave2資料夾
cd master
mkdir config data #分別建立config、data資料夾

可以到redis官網下載redis.conf檔案,並把該配置檔案複製到master、slave1、slave2資料夾中的config檔案裡去
開始建立redis的docker-compose檔案

cd redis
touch docker-compose.yml
####以下是docker-composer.yml的內容#####
version: '3'
services:
  master:
    image: redis:latest
    container_name: redis_master  #master節點
    volumes:
      - ./master/config/redis.conf:/etc/redis/redis.conf
      - ./master/data:/data
    command: /bin/bash -c "redis-server /etc/redis/redis.conf"  #這句話就是要載入這個路徑下的配置
    environment:
      - TZ=Asia/Shanghai
      - LANG=en_US.UTF-8
    ports:
      - "6379:6379"

  slave1:
    image: redis:latest
    container_name: redis_slave_1   #slave1節點
    volumes:
      - ./slave1/config/redis.conf:/etc/redis/redis.conf
      - ./slave1/data:/data
    command: /bin/bash -c "redis-server /etc/redis/redis.conf"
    environment:
      - TZ=Asia/Shanghai
      - LANG=en_US.UTF-8
    ports:
      - "6380:6379"

  slave2:
    image: redis:latest
    container_name: redis_slave_2   #slave2節點
    volumes:
      - ./slave2/config/redis.conf:/etc/redis/redis.conf
      - ./slave2/data:/data
    command: /bin/bash -c "redis-server /etc/redis/redis.conf"
    environment:
      - TZ=Asia/Shanghai
      - LANG=en_US.UTF-8
    ports:
      - "6381:6379"

修改每一個redis.conf配置檔案

找到以下程式碼的位置,並修改
bind 0.0.0.0  #這個一定要設定0.0.0.0,不然別的機器訪問不了
protected-mode yes #建議配置主從最好有密碼,畢竟線上配置都是設定密碼的,何不完整學習呢
requirepass 123456 #設定密碼
以上的配置3個redis.conf配置一致,以下就只需要配置從節點的配置檔案即可
replica-read-only yes   #這個配置後面會說到
slaveof 172.16.0.08 6379 #配置主節點的ip ,埠
masterauth 123456   #因為主節點設定了密碼,必須設定這個,否者連不上主節點

啟動redis主從節點

cd redis
docker-compose up -d    #啟動


如圖啟動成功
進入主節點的容器,可以檢視相關資訊

docker exec -it 容器id bash
#進入容器後
redis-cli -p 6379
auth 123456 #這步是輸入密碼,就是配置檔案的密碼
info replication    #這個命令可以查replication的相關資訊


可以看到當前容器的角色是什麼,role:master
如果是主節點,可以看到當前連線了幾個從節點,connected_slaves:2
有這兩個資訊就表示已經主從複製成功

這個是從節點的資訊
就此主從複製已經完成,可以用rdm測試一下結果,測試時只能在主節點寫入,然後從節點會同步資料,如果在從節點寫入,會報這個錯誤 “READONLY You can’t write against a read only replica.”,這是因為在從節點配置檔案中配置了replica-read-only yes,從節點只能讀不能寫


配置哨兵

cd redis-sentinel
mkdir sentinel1 sentinel2 sentinel3 #建立3個資料夾
touch sentinel.conf
vim sentinel.conf
#寫下一下配置
##這是哨兵的預設埠
port 26379
dir /tmp
##監聽master主節點,myredismaster可以隨便改成你喜歡的名字,ip 埠 只有的2是指明當有多少個sentinel認為一個master失效時,master才算真正失效,我這裡有3臺哨兵,當有2臺確認失效就切換主從
sentinel monitor myredismaster 172.16.0.8 6379 2 

##主從密碼要一直,這是切換主從用到的密碼
sentinel auth-pass myredismaster 123456 

##這個配置項指定了需要多少失效時間,一個master才會被這個sentinel主觀地認為是不可用的。 單位是毫秒,預設為30秒
sentinel down-after-milliseconds myredismaster 30000

##這個配置項指定了在發生failover主備切換時最多可以有多少個slave同時對新的master進行 同步,可以透過將這個值設為 1 來保證每次只有一個slave 處於不能處理命令請求的狀態。
sentinel parallel-syncs myredismaster 1

sentinel failover-timeout myredismaster 180000
sentinel deny-scripts-reconfig yes

配置成功後,把sentinel.conf配置複製到sentinel1、sentinel2、sentinel3中
配置redis-sentinel的docker-compose.yml

version: '3'
services:
  sentinel1:
    image: redis:latest
    container_name: redis_sentinel_1
    ports:
      - "26379:26379"
    volumes:
      - ./sentinel1/sentinel.conf:/usr/local/etc/redis/sentinel.conf
    command: /bin/bash -c "redis-sentinel /usr/local/etc/redis/sentinel.conf"

  sentinel2:
    image: redis:latest
    container_name: redis_sentinel_2
    ports:
      - "26380:26379"
    volumes:
      - ./sentinel2/sentinel.conf:/usr/local/etc/redis/sentinel.conf
    command: /bin/bash -c "redis-sentinel /usr/local/etc/redis/sentinel.conf"

  sentinel3:
    image: redis:latest
    container_name: redis_sentinel_3
    ports:
      - "26381:26379"
    volumes:
      - ./sentinel3/sentinel.conf:/usr/local/etc/redis/sentinel.conf
    command: /bin/bash -c "redis-sentinel /usr/local/etc/redis/sentinel.conf"

cd redis-sentinel
docker-compose up -d #啟動哨兵


啟動成功輸入sentinel master myredismaster可返回圖上資訊

注意:手動關閉了redis-master容器後,他不會立刻切換到從分支,因為配置檔案了30秒才會被sentinel主觀認為失效,我就是以為會立刻切換,一直沒切換我以為配置不成功,白忙活了好久,隔了一段時間再檢視才發現成功了,提醒讀者避坑

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章