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"]}         #切换为中国源

到网址https://hub.docker.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

返回结果应该如下所示:

Docker下配置redis集群高可用_第1张图片

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

结果如下:

Docker下配置redis集群高可用_第2张图片

 

以上步骤完成,已使6个节点组成了集群,但因为没有分配槽故无法使用。

3.3:分配糟信息

CLUSTER INFO

Docker下配置redis集群高可用_第3张图片

 

第一行显示失败,第二行显示分配的槽个数为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 发现结果如下:

Docker下配置redis集群高可用_第4张图片

到这里集群已搭建完毕

四:搭建高可用

以上我们已经搭建了一套完整的可运行的redis cluster,但是每个节点都是单点,这样子可能出现,一个节点挂掉,整个集群因为槽位分配不完全而崩溃,因此,我们需要为每个节点配置副本备用节点。前面我们已经提前创建了6个备用节点,搭建集群花了三个,因此还有剩下三个直接可以用来做备用副本。

CLUSTER NODES      #查看所有节点ID

结果如下:

Docker下配置redis集群高可用_第5张图片

 

使用脚本添加副本节点:

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

结果如下

Docker下配置redis集群高可用_第6张图片

易看出172.17.0.4master fail,

对应的备选节点172.17.0.9升级为master.

当重新将172.17.0.4上线后,发现不再为master,而是slave。

你可能感兴趣的:(redis)