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
返回结果应该如下所示:
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。