1. 程式人生 > >Docker下配置redis叢集高可用

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。