多服務器使用Docker設置一主一從三哨兵redis(完整)

原本應該續以前那篇博客Docker配置redis哨兵模式——多服務器·上寫一個下篇的,可是突然意識到應該將必要的環境打包爲一個基礎鏡像,在此基礎上創建與redis有關的鏡像,這樣既可以快速打包,又可以高度複用代碼。html

因此本篇實際上至關於一個完整的多服務器使用Docker來部署Redis哨兵模式的過程。linux

目錄

  1. 服務器條件
  2. 安裝Docker
  3. 製備基礎鏡像
  4. 配置redis主從節點
  5. 哨兵節點

服務器條件

由於個人服務器又是新租(日租)的,因此要從新恢復一下。c++

三臺服務器(由於須要至少三個哨兵保證安全性)redis

  • 服務器1:123.57.234.161
  • 服務器2:123.56.85.138
  • 服務器3:8.131.68.191
  • 端口號7000、17000已在安全組上放行(阿里雲)
  • 環境:centos8.0

安裝Docker

逐行執行如下指令:docker

# 1. 更新編譯環境
yum -y install gcc

# 2. 同上
yum -y install gcc-c++

# 3. 安裝docker
# 3.1 卸載舊版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
# 3.2 安裝須要的安裝包
yum install -y yum-utils
# 3.3設置鏡像的倉庫,推薦使用國內的鏡像,比較快
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 3.4 更新yum軟件包索引,功能是將軟件包緩存在本地一份
yum makecache 
# 3.5 安裝docker相關的 docker-ce 社區版
yum install -y https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.13-3.1.el7.x86_64.rpm
# 3.6 安裝
yum install docker-ce docker-ce-cli containerd.io
# 3.7 啓動docker
systemctl start docker
# 3.8 設置爲後臺啓動
systemctl enable docker 
# 3.9 使用docker version查看是否按照成功
docker version
# 3.10 測試(能夠不作)
docker run hello-world
# 3.11 卸載刪除(僅供參考,本次不作)
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker

# 4. 配置加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://qdxc3615.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

製備基礎鏡像

docker倉庫中的centos鏡像很是簡單,缺乏一些功能,不方便咱們安裝和調試,因此咱們把與redis自己無關但有助於咱們使用的部分打包成一個經常使用的基礎鏡像。shell

主要安裝的是vim編輯器和procps(查看容器內運行的進程)因此建立一個目錄爲basecentos,在其中建立並編寫Dockerfile以下:json

# 建立Dockerfile
vi Dockerfile

# 如下全部代碼爲Dockerfile的內容

FROM redis
MAINTAINER blue<blue@email.com>
# 安裝一些環境
RUN apt-get update
RUN apt-get install -y vim
RUN apt-get install procps --assume-yes

保存Dockerf後能夠建立名爲base-centos的鏡像,之後就能夠直接從這個鏡像生成新的容器,不須要一直下載。步驟以下:vim

docker build -t base-centos .

# 查看現有的鏡像:
[root@docker001 baseimage]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
base-centos            latest              646e329bb8db        2 minutes ago       157MB

# 使用docker login 登陸本身的docker帳號

將它push到咱們的dockerhub上,再在另外兩個服務器上pull下來,如今三個服務器上都有這個鏡像啦,我給他起的名字叫lanblue/mygoodcentos。centos

配置redis主從節點

咱們使用的服務器是服務器1和服務器2。緩存

TIPS: 對於xshell可使用右鍵選擇發送鍵輸入到全部會話,這樣就不須要配置兩遍了。或者使用scp語句將配置好的文件共享給其餘服務器:

# scp local_file remote_username@remote_ip:remote_folder
scp redis.conf root@58.131.71.196:/blue/redis02
  1. 首先建立文件夾,注意不要放在home路徑下,不然容易由於權限問題是容器運行失敗。我建立的目錄爲/blue/redis01,指令比較簡單:
cd /
mkdir blue && cd blue
mkdir redis01 && cd redis01
  1. 建立Dockerfile,內容以下:
FROM lanblue/mygoodcentos
MAINTAINER blue<blue@email.com>

COPY redis.conf /usr/local/etc/redis/redis.conf

VOLUME ["/data1"]

WORKDIR /etc/redis

# 開放端口7000
EXPOSE 7000

# 使用配置文件啓動
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf"]
  1. 從官網上下載一個redis.conf放在redis01目錄下,redis.conf則是redis的一些配置,這個和以前單機版的redis一主一從三哨兵的配置基本相同,作以下修改:
# 註釋掉bind 127.0.0.1 
# bind 127.0.0.1

port 7000

# 這裏若是是yes會影響使用配置文件啓動
daemonize no

pidfile /var/run/redis_7000.pid

# 須要設置如下兩處密碼,密碼要一致
requirepass testmaster123
masterauth testmaster123

# 修改保護模式,若是是yes會致使外部服務器沒法訪問
protected-mode no

# 對於服務器2,還須要加上一句,表示是服務器1的從服務器 
# slaveof 主.機.I.P 端口
slaveof 123.57.234.161 7000
  1. 建立鏡像和運行容器:
# 建立鏡像
docker build -t myredis .
# 啓動容器
docker run -d -p 7000:7000 --name redis-test myredis
# 進入容器內部
docker exec -it redis-test /bin/bash
# 查看容器內進程
ps -ef
  1. 測試:
root@9692ae0ac72c:/etc/redis# redis-cli -p 7000
127.0.0.1:7000> auth testmaster123
OK
127.0.0.1:7000> info replication

哨兵節點

在/blue下建立文件夾sentinel01。其內存放Dockerfile和sentinel.conf文件。

  1. Dockerfile文件內容以下:
FROM lanblue/mygoodcentos
MAINTAINER blue<blue@email.com>

COPY sentinel.conf /usr/local/etc/redis/sentinel.conf

# VOLUME ["/data2"]

# 開放端口17000
EXPOSE 17000

# 使用配置文件啓動
CMD [ "redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]
  1. sentinel.conf文件以下,注意不能在配置文件裏設置daemonize yes,會致使咱們的指定配置失敗:
port 17000
sentinel monitor mymaster 123.57.234.161 7000 2
sentinel auth-pass mymaster testmaster123

sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
# 設置爲no纔會被其餘主機發現
protected-mode no
  1. 建立鏡像,啓動容器,進入容器內部:
# 建立鏡像
docker build -t mysentinel .
# 啓動容器
docker run -d -p 17000:17000 --name sentinel-test mysentinel
# 進入容器內部
docker exec -it sentinel-test /bin/bash
# 訪問17000端口
redis-cli -p 17000
# 查看哨兵狀況
# 如下是端口返回的信息
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=123.57.234.161:7000,slaves=1,sentinels=4

# 哨兵節點會自動發現其餘哨兵,若是某些哨兵線程已經失效了,能夠用下列語句更新
127.0.0.1:17000> SENTINEL RESET *
(integer) 1
  1. 主從切換測試 使用docker stop 語句能夠關閉某個運行的容器。關閉主節點所在的容器後能夠觀察到從節點變成master。切換基本與以前單機版本相同。
相關文章
相關標籤/搜索