本來應該續之前那篇部落格Docker配置redis哨兵模式——多伺服器·上寫一個下篇的,但是忽然意識到應該將必要的環境打包為一個基礎映象,在此基礎上建立與redis有關的映象,這樣既能夠快速打包,又能夠高度複用程式碼。
所以本篇實際上相當於一個完整的多伺服器使用Docker來部署Redis哨兵模式的過程。
目錄
- 伺服器條件
- 安裝Docker
- 製備基礎映象
- 配置redis主從節點
- 哨兵節點
伺服器條件
因為我的伺服器又是新租(日租)的,所以要重新恢復一下。
三臺伺服器(因為需要至少三個哨兵保證安全性)
- 伺服器1:123.57.234.161
- 伺服器2:123.56.85.138
- 伺服器3:8.131.68.191
- 埠號7000、17000已在安全組上放行(阿里雲)
- 環境:centos8.0
安裝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本身無關但有助於我們使用的部分打包成一個常用的基礎映象。
主要安裝的是vim編輯器和procps(檢視容器內執行的程式)所以建立一個目錄為basecentos,在其中建立並編寫Dockerfile如下:
# 建立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的映象,以後就可以直接從這個映象生成新的容器,不需要一直下載。步驟如下:
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。
配置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
- 首先建立資料夾,注意不要放在home路徑下,否則容易因為許可權問題是容器執行失敗。我建立的目錄為/blue/redis01,指令比較簡單:
cd /
mkdir blue && cd blue
mkdir redis01 && cd redis01
- 建立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"]
- 從官網上下載一個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
- 建立映象和執行容器:
# 建立映象
docker build -t myredis .
# 啟動容器
docker run -d -p 7000:7000 --name redis-test myredis
# 進入容器內部
docker exec -it redis-test /bin/bash
# 檢視容器內程式
ps -ef
- 測試:
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檔案。
- 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"]
- 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
- 建立映象,啟動容器,進入容器內部:
# 建立映象
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
- 主從切換測試
使用docker stop 語句可以關閉某個執行的容器。關閉主節點所在的容器後可以觀察到從節點變成master。切換基本與之前單機版本相同。