Docker下配置redis叢集高可用
Docker下Redis叢集搭建
注:本文中紅色字型為命令
藍色字型為指令碼內容
綠色字型為備註
一:建立redis映象
1:mkdir docker_redis_cluster
cd docker_redis_cluster
wget http://download.redis.io/releases/redis-4.0.11.tar.gz
tar xvzf redis-4.0.11.tar.gz
cd redis-4.0.11
make
2:修改redis配置檔案
vi /tmp/docker_redis_cluster/redis-4.0.11/redis.conf
修改其中的:
bind 0.0.0.0 #修改bindip 使其他使用者可訪問
daemonize no #關閉守護程序
requirepass 123456 #新增密碼
masterauth 123456 #新增主從連線密碼
logfile "/var/log/redis/redis-server.log" #設定日誌路徑
cluster-enabled yes #
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
3:Dockerfile映象製作
cd /tmp/docker_redis_cluster
vi Dockerfile
內容如下:
# Redis
# Version 4.0.11
FROM centos:7
ENV REDIS_HOME /usr/local
ADD redis-4.0.11.tar.gz / # 本地的redis原始碼包複製到映象的根路徑下.
RUN mkdir -p $REDIS_HOME/redis #
ADD redis-4.0.11/redis.conf $REDIS_HOME/redis/ # 將一開始編譯產生並修改後的配置複製到安裝目錄
RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
RUN yum -y update # 更新yum源
RUN yum install -y gcc make # 安裝編譯需要的工具
WORKDIR /redis-4.0.11
RUN make
RUN mv /redis-4.0.11/src/redis-server $REDIS_HOME/redis/ # 只保留redis-server
WORKDIR /
RUN rm -rf /redis-4.0.11 # 刪除解壓檔案
RUN yum remove -y gcc make #刪除多餘的gcc跟make
VOLUME ["/var/log/redis"] # 新增資料卷
EXPOSE 6379 # 暴露6379埠
4:構建映象
vi /etc/docker/daemon/json
{"registry-mirrors": ["https://registry.docker-cn.com"]} #切換為中國源
docker build -t nestoryangziyu /duxesredis . #注意末尾有英文小數點,且必須前方有空格
然後使用命令docker image檢視映象即可。
二:建立redis節點映象
1:基於前面的基礎映象製作redis節點映象
cd /tmp
mkdir /docker_redis_nodes
cd docker_redis_nodes
vi Dockerfile
內容如下:
# Redis Node
# Version 4.0.11
FROM nestoryangziyu/duxesredis
# MAINTAINER_INFO
MAINTAINER nestor [email protected]
ENTRYPOINT ["/usr/local/redis/redis-server", "/usr/local/redis/redis.conf"]
2:建立redis節點映象
docker build -t nestoryangziyu/nodes-redis:4.0.11 . #注意末尾有英文小數點,且必須前方有空格
三:執行redis叢集
1:執行redis容器
docker run -d --name redis-6379 -p 6379:6379 nestoryangziyu/nodes-redis:4.0.11
docker run -d --name redis-6380 -p 6380:6379 nestoryangziyu/nodes-redis:4.0.11
docker run -d --name redis-6381 -p 6381:6379 nestoryangziyu/nodes-redis:4.0.11
docker run -d --name redis-6382 -p 6382:6379 nestoryangziyu/nodes-redis:4.0.11
docker run -d --name redis-6383 -p 6383:6379 nestoryangziyu/nodes-redis:4.0.11
docker run -d --name redis-6384 -p 6384:6379 nestoryangziyu/nodes-redis:4.0.11
完成後使用命令docker ps 檢查即可。
3:執行叢集容器
redis-cli -h 192.168.4.222 -p 6379 #本命令需要在另一臺伺服器完成,如無redis,可通過命令yum -y install redis 完成後即可,也可通過redis desktop manager完成,但考慮到後面需要使用指令碼建立slots,所以推薦使用另一臺伺服器完成以下步驟。
auth 123456
info replication
3.1:配置之前需要返回docker伺服器下檢視所有容器的IP地址
docker inspect a9b8e3e709d8 db068f46db7e 906500ab2caf 632d847f58d3 7283376db6a5 dcb11a272823 |grep IPA
返回結果應該如下所示:
3.2:去往另一臺伺服器執行以下命令
CLUSTER MEET 172.17.0.5 6379
CLUSTER MEET 172.17.0.6 6379
CLUSTER MEET 172.17.0.7 6379
CLUSTER MEET 172.17.0.8 6379
CLUSTER MEET 172.17.0.9 6379
CLUSTER NODES
結果如下:
以上步驟完成,已使6個節點組成了叢集,但因為沒有分配槽故無法使用。
3.3:分配糟資訊
CLUSTER INFO
第一行顯示失敗,第二行顯示分配的槽個數為0
由於槽的個數是16384個,故使用指令碼自動分配
vi addslots.sh,內容如下:
#!/bin/bash
# node1 192.168.4.222 172.17.0.4
n=0
for ((i=n;i<=5461;i++))
do
/usr/bin/redis-cli -h 192.168.4.222 -p 6379 -a 123456 CLUSTER ADDSLOTS $i
done
# node2 192.168.4.222 172.17.0.5
n=5462
for ((i=n;i<=10922;i++))
do
/usr/bin/redis-cli -h 192.168.4.222 -p 6380 -a 123456 CLUSTER ADDSLOTS $i
done
# node3 192.168.4.222 172.17.0.6
n=10923
for ((i=n;i<=16383;i++))
do
/usr/bin/redis-cli -h 192.168.4.222 -p 6381 -a 123456 CLUSTER ADDSLOTS $i
done
chmod u+x addslots.sh #為檔案新增許可權
./addslots.sh #執行該檔案
CLUSTER INFO 發現結果如下:
到這裡叢集已搭建完畢
四:搭建高可用
以上我們已經搭建了一套完整的可執行的redis cluster,但是每個節點都是單點,這樣子可能出現,一個節點掛掉,整個叢集因為槽位分配不完全而崩潰,因此,我們需要為每個節點配置副本備用節點。前面我們已經提前建立了6個備用節點,搭建叢集花了三個,因此還有剩下三個直接可以用來做備用副本。
CLUSTER NODES #檢視所有節點ID
結果如下:
使用指令碼新增副本節點:
vi addslavenodes.sh
#!/bin/bash
/usr/local/bin/redis-cli -h 192.168.10.52 -p 6382 -a 123456 CLUSTER REPLICATE 760e4d0039c5ac13d04aa4791c9e6dc28544d7c7
/usr/local/bin/redis-cli -h 192.168.10.52 -p 6383 -a 123456 CLUSTER REPLICATE 54cb5c2eb8e5f5aed2d2f7843f75a9284ef6785c
/usr/local/bin/redis-cli -h 192.168.10.52 -p 6384 -a 123456 CLUSTER REPLICATE f45f9109f2297a83b1ac36f9e1db5e70bbc174ab
注意:作為備用的節點,必須是未分配槽位的,否者會操作失敗
五:高可用測試
通過關閉容器的方法,將172.17.0.4也就是redis-6379這個master關閉偽裝成故障,測試是否會自動重新分配主節點。
docker stop redis-6379
CLUSTER NODES
結果如下
易看出172.17.0.4master fail,
對應的備選節點172.17.0.9升級為master.
當重新將172.17.0.4上線後,發現不再為master,而是slave。