基于docker搭建redis集群

准备工作

下载redis源码包:

mkdir /usr/local/redis_docker
cd /usr/local/redis_docker
wget http://download.redis.io/releases/redis-4.0.1.tar.gz 

解压:

tar -xzf redis-4.0.1.tar.gz

安装gcc

yum install -y gcc-c++

编译

make
#如果报错,可以尝试:make MALLOC=libc

配置redis.conf

vi /usr/local/redis_docker/redis-4.0.1/redis.conf

bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000

Redis基础镜像创建

编写镜像生成文件(Dockerfile)

cd /usr/local/redis_docker
vi Dockerfile

Dockerfile

#指定基础镜像
FROM centos:7

#镜像作者
MAINTAINER qrx "[email protected]"

#定义路径的环境变量
ENV REDIS_HOME /usr/local

#将Dockerfile同级目录下的redis-4.0.1.tar.gz复制到镜像的根目录
ADD redis-4.0.1.tar.gz /

#创建安装目录,根据环境变量信息,实际的创建目录为:/usr/local/redis
RUN mkdir -p $REDIS_HOME/redis

#将Dockerfile同级目录下redis-4.0.1中的redis配置文件拷贝到容器的/usr/local/redis目录中
ADD redis-4.0.1/redis.conf $REDIS_HOME/redis/

#更新镜像的yum
RUN yum -y update

#安装gcc相关编译工具
RUN yum install -y gcc make

#指定工作目录
WORKDIR /redis-4.0.1

#执行编译
RUN make

#移动编译后的redis-server到容器相关的目录
RUN mv /redis-4.0.1/src/redis-server  $REDIS_HOME/redis/

#移动到上一级
WORKDIR /

#删除解压文件
RUN rm -rf /redis-4.0.1

#删除对于的工具
RUN yum remove -y gcc make

#添加数据卷
#/usr/local/redis/logs/redis-server.log
#此目录需要和redis.conf中logfile一致
VOLUME ["/usr/local/redis/logs"]

#暴露6379的端口
EXPOSE 6379

编译生成镜像

docker build -t qrx/redis-cluster .

创建Redis节点镜像

创建目录

mkdir /usr/local/redis_docker/redis-node
cd /usr/local/redis_docker/redis-node

编写节点镜像文件vi Dockerfile

FROM qrx/redis-cluster:latest

MAINTAINER qrx "[email protected]"

ENTRYPOINT ["/usr/local/redis/redis-server", "/usr/local/redis/redis.conf"]

编译生成节点镜像

docker build -t qrx/redis-node .

配置集群

集群操作说明
	CLUSTER INFO 打印集群的信息 
	CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。  
	   
	//节点(node) 
	CLUSTER MEET   将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。 
	CLUSTER FORGET  从集群中移除 node_id 指定的节点。 
	CLUSTER REPLICATE  将当前节点设置为 node_id 指定的节点的从节点。 
	CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。  
	   
	//槽(slot) 
	CLUSTER ADDSLOTS  [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。 
	CLUSTER DELSLOTS  [slot ...] 移除一个或多个槽对当前节点的指派。 
	CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。 
	CLUSTER SETSLOT  NODE  将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。 
	CLUSTER SETSLOT  MIGRATING  将本节点的槽 slot 迁移到 node_id 指定的节点中。 
	CLUSTER SETSLOT  IMPORTING  从 node_id 指定的节点中导入槽 slot 到本节点。 
	CLUSTER SETSLOT  STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。  
	   
	//键 (key) 
	CLUSTER KEYSLOT  计算键 key 应该被放置在哪个槽上。 
	CLUSTER COUNTKEYSINSLOT  返回槽 slot 目前包含的键值对数量。 
	CLUSTER GETKEYSINSLOT   返回 count 个 slot 槽中的键。
启动镜像
docker run -d --name redis-node-7000 -p 7000:6379 qrx/redis-node
docker run -d --name redis-node-7001 -p 7001:6379 qrx/redis-node
docker run -d --name redis-node-7002 -p 7002:6379 qrx/redis-node
docker run -d --name redis-node-7003 -p 7003:6379 qrx/redis-node
docker run -d --name redis-node-7004 -p 7004:6379 qrx/redis-node
docker run -d --name redis-node-7005 -p 7005:6379 qrx/redis-node

查看容器内网下关联的IPdocker inspect 容器ID(根据自己的实际情况填) | grep IPAddress
基于docker搭建redis集群_第1张图片
解析宿主机与容器的ip映射关系

宿主机(ip 端口) 容器(ip 端口)
192.168.30.130:7000 172.17.0.2:6379
192.168.30.130:7001 172.17.0.3:6379
192.168.30.130:7002 172.17.0.4:6379
192.168.30.130:7003 172.17.0.5:6379
192.168.30.130:7004 172.17.0.6:6379
192.168.30.130:7005 172.17.0.7:6379
节点配置

任意进入一个redis

/usr/local/redis_docker/redis-4.0.1/src/redis-cli -p 7000

添加节点,将以下所有的redis服务都添加到redis集群的节点

CLUSTER MEET 172.17.0.2 6379
CLUSTER MEET 172.17.0.3 6379
CLUSTER MEET 172.17.0.4 6379
CLUSTER MEET 172.17.0.5 6379
CLUSTER MEET 172.17.0.6 6379
CLUSTER MEET 172.17.0.7 6379

查看节点

CLUSTER NODES

由于当前只是添加了节点,没有分配槽点,也没有配置主从关联关系,所以集群并没有生效
基于docker搭建redis集群_第2张图片

配置槽点

配置添加的脚本

cd /usr/local/redis_docker
vim addslots.sh

添加以下配置

将0-5461的槽点配置在172.17.0.2:6379(宿主机127.0.0.1:7000)的redis上
n=0
for ((i=n;i<=5461;i++))
do
   /usr/local/redis_docker/redis-4.0.1/src/redis-cli -h 127.0.0.1 -p 7000 CLUSTER ADDSLOTS $i
done

#将5462-10922的槽点配置在172.17.0.3:6379(宿主机127.0.0.1:7001)的redis上
n=5462
for ((i=n;i<=10922;i++))
do
   /usr/local/redis_docker/redis-4.0.1/src/redis-cli -h 127.0.0.1 -p 7001 CLUSTER ADDSLOTS $i
done

#将10923-16383的槽点配置在172.17.0.4:6379(宿主机127.0.0.1:7002)的redis上
n=10923
for ((i=n;i<=16383;i++))
do
   /usr/local/redis_docker/redis-4.0.1/src/redis-cli -h 127.0.0.1 -p 7002 CLUSTER ADDSLOTS $i
done

执行shell脚本并查看结果

sh addslots.sh

基于docker搭建redis集群_第3张图片

主从高可用

根据上面的配置及下图分析;三主确实没有问题,16383个槽点也分别分散到各个redis服务中去了,集群的状态也没有问题,但是有没有发现,剩下的3个绿色的redis服务也都是主节点,切未分配槽点,也没有配置主从关联;因此现有的三个主redis服务只要有一个出现问题,整个集群奇偶失效了;下面来配置主从关联。

主从管理配置

主redis 从redis
172.17.0.2:6379 172.17.0.5:6379
172.17.0.3:6379 172.17.0.6:6379
172.17.0.4:6379 172.17.0.7:6379

编写配置关联脚本

vi addSlaveNodes.sh
#CLUSTER REPLICATE后面跟的是172.17.0.5:6379的集群ID
/usr/local/redis_docker/redis-4.0.1/src/redis-cli -h 127.0.0.1 -p 7003 CLUSTER REPLICATE 9e4d6ac20ccb95334d0536bf89f912dc9c9cbb64
#CLUSTER REPLICATE后面跟的是172.17.0.6:6379的集群ID
/usr/local/redis_docker/redis-4.0.1/src/redis-cli -h 127.0.0.1 -p 7004 CLUSTER REPLICATE 823bdec8ed28eaae963d96efd304506b234fb4e1
#CLUSTER REPLICATE后面跟的是172.17.0.7:6379的集群ID
/usr/local/redis_docker/redis-4.0.1/src/redis-cli -h 127.0.0.1 -p 7005 CLUSTER REPLICATE 5bfed4c1628284ce8387288f2fa96f2527b1b0fe
高可用测试

停掉一个主redis
基于docker搭建redis集群_第4张图片
可以看到从redis变为主redis,重新启动停掉的主redis
基于docker搭建redis集群_第5张图片
主redis恢复为从redis。

你可能感兴趣的:(redis,docker,redis)