下载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
编写镜像生成文件(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 .
创建目录
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
解析宿主机与容器的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
由于当前只是添加了节点,没有分配槽点,也没有配置主从关联关系,所以集群并没有生效。
配置添加的脚本
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
根据上面的配置及下图分析;三主确实没有问题,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
可以看到从redis变为主redis,重新启动停掉的主redis
主redis恢复为从redis。