今日份主题
Docker环境中Redis集群搭建
(Docker compose版)
Docker中通过容器编排Docker-compose.yml构建集群实际上也非常常用。各位小伙伴可能会对该技术不是很了解。大家如果想知道详情,可以看峰哥Docker实战教程系列。
其实不是很清楚也没有关系,任何技术的使用总有第一次。今天跟着峰哥写一写就当作第1次入门实战吧。集群的规划请参考峰哥系列文章《Docket环境中Redis集群搭建(Linux Shecll版)》,在这里峰哥不另外说明。
实现步骤
A、登录Linux,在home目录下创建redis-cluster文件夹,编写文件redis-cluster.tmpl,文件的作用是用来创建Redis配置文件的模板文件。
port ${PORT}
protected-mode no
cluster-enabled yes
cluster-config-file redis.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.21.134
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes
________________________________________________________________________________
port ${PORT}: 是自定义端口号
protected-mode no:是关闭保护模式,否则可能造成无法通过公网访问。
cluster-enabled yes:启动集群。必须配置为yes
cluster-config-file redis.conf:集群节点配置文件的名字,一般我们都会取名redis.conf
cluster-node-timeout 5000:超时时间,单位是毫秒
cluster-announce-ip 192.168.21.134:集群宿主机IP
cluster-announce-port ${PORT}:节点映射端口
cluster-announce-bus-port 1${PORT}:节点总线端口
appendonly yes:开启持久化模式
_______________________________________________________________________________
B、在/home/redis-cluster下生成conf和data目录,并生成配置信息。这样做的目的是为了方便数据的挂载。编写Linux Shell脚本createFilePath.sh。注意要进行授权,否则脚本运行。
for port in `seq 7000 7005`
do
mkdir -p ./${port}/conf
&& PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf
&& mkdir -p ./${port}/data;
done
给大家解读一下脚本内容,for循环6次,每次循环存储变量到port变量。然后循环创建目录,命令是mkdir -p ./{port}/conf,意思是在当前目录下面以端口后为目录名,下面创建子目录conf.后面的是连接符,表示连接后面的语句。PORT=${port} envsubst < ./redis-cluster.tmpl >意思是将循环变量port的值复制给PORT,envsubst 是赋值给文件redis-cluster.tmpl.然后将该文件复制到端口号目录conf文件夹中,名字是redis.conf; mkdir -p ./${port}/data; 表示继续创建在端口口目录data目录。
C、授权createFilePath.sh。让该文件具备可执行权限,并执行该文件
chmod +x ./createFilePath.sh
./createFilePath.sh
共生成6个文件夹,从7000到7005,每个文件夹下包含data和conf文件夹,同时conf里面有redis.conf配置文件。打开7000-7005对于的conf目录,修改网络IP,网络IP按照集群规划方式修改就可以了。现在以7000目录为例,其他一样。
vim /home/redis-cluster/700*/conf/redis.conf
D、在.home/redis-cluster目录下面,编写docker-compose.yml编写
version: "2.0"
networks:
redis-net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.18.0.0/16
gateway: 172.18.0.1
services:
redis-7000: #服务名称
image: redis:5.0.5 #基础镜像版本
container_name: redis-7000 #容器名称
environment: #环境变量
- PORT=7000
stdin_open: true
ports:
- "7000:7000" #端口映射
- "17000:17000" #总线映射
tty: true #启动起来的容器可能会立即停止,添加这个启动
networks: #设置网络
redis-net:
ipv4_address: 172.18.0.2
privileged: true
restart: always
volumes:
- "/home/redis-cluster/7000/conf/redis.conf:/usr/local/etc/redis/redis.conf"
- "/home/redis-cluster/7000/data:/data"
redis-7001: #服务名称
image: redis:5.0.5 #基础镜像版本
container_name: redis-7001 #容器名称
environment: #环境变量
- PORT=7001
stdin_open: true
ports:
- "7001:7001" #端口映射
- "17001:17001" #总线映射
tty: true #启动起来的容器可能会立即停止,添加这个启动
networks: #设置网络
redis-net:
ipv4_address: 172.18.0.3
privileged: true
restart: always
volumes:
- "/home/redis-cluster/7001/conf/redis.conf:/usr/local/etc/redis/redis.conf"
- "/home/redis-cluster/7001/data:/data"
redis-7002: #服务名称
image: redis:5.0.5 #基础镜像版本
container_name: redis-7002 #容器名称
environment: #环境变量
- PORT=7002
stdin_open: true
ports:
- "7002:7002" #端口映射
- "17002:17002" #总线映射
tty: true #启动起来的容器可能会立即停止,添加这个启动
networks: #设置网络
redis-net:
ipv4_address: 172.18.0.4
privileged: true
restart: always
volumes:
- "/home/redis-cluster/7002/conf/redis.conf:/usr/local/etc/redis/redis.conf"
- "/home/redis-cluster/7002/data:/data"
redis-7003: #服务名称
image: redis:5.0.5 #基础镜像版本
container_name: redis-7003 #容器名称
environment: #环境变量
- PORT=7003
stdin_open: true
ports:
- "7003:7003" #端口映射
- "17003:17003" #总线映射
tty: true #启动起来的容器可能会立即停止,添加这个启动
networks: #设置网络
redis-net:
ipv4_address: 172.18.0.5
privileged: true
restart: always
volumes:
- "/home/redis-cluster/7003/conf/redis.conf:/usr/local/etc/redis/redis.conf"
- "/home/redis-cluster/7003/data:/data"
redis-7004: #服务名称
image: redis:5.0.5 #基础镜像版本
container_name: redis-7004 #容器名称
environment: #环境变量
- PORT=7004
stdin_open: true
ports:
- "7004:7004" #端口映射
- "17004:17004" #总线映射
tty: true #启动起来的容器可能会立即停止,添加这个启动
networks: #设置网络
redis-net:
ipv4_address: 172.18.0.6
privileged: true
restart: always
volumes:
- "/home/redis-cluster/7004/conf/redis.conf:/usr/local/etc/redis/redis.conf"
- "/home/redis-cluster/7004/data:/data"
redis-7005: #服务名称
image: redis:5.0.5 #基础镜像版本
container_name: redis-7005 #容器名称
environment: #环境变量
- PORT=7005
stdin_open: true
ports:
- "7005:7005" #端口映射
- "17005:17005" #总线映射
tty: true #启动起来的容器可能会立即停止,添加这个启动
networks: #设置网络
redis-net:
ipv4_address: 172.18.0.7
privileged: true
restart: always
volumes:
- "/home/redis-cluster/7005/conf/redis.conf:/usr/local/etc/redis/redis.conf"
- "/home/redis-cluster/7005/data:/data"
完毕后,进行授权
chmod +x ./docker-compose.yml
E、在工作目录/home/redis-cluster目录下执行./docker-compose up -d创建6个redis容器.
我们现在查询容器状态,发现容器启动,但是Redis服务并没有启动起来。
F、进入每个容器内部,启动Redis服务。现在以redis-7000为例,其他一样。
docker exec -it redis-7000 bash
root@394a7c4d3c00:/data# redis-server /usr/local/etc/redis/redis.conf
再次查看,容器状况,发送redis服务全部启动完毕。
G、完成集群的master和slave的主从结构部署。
redis-cli --cluster create 172.18.0.2:7000 172.18.0.3:7001 172.18.0.4:7002 172.18.0.5:7003 172.18.0.6:7004 172.18.0.7:7005 --cluster-replicas 1
执行过程中,首先是分配槽到三个master,然后把7004作为7000的slave节点,后面的同理。接着说明7000、7001、7002是master节点。7003、7004、7005是slave节点。然后询问是否接受上面的分配方式,我们只能选择yes,否则回滚。
F、测试集群是否搭建成功,在容器内容执行如下命令,这里举例redis-7000容器。
cluster nodes
至此,集群搭建完毕。这两种方式,希望搭建都能努力实践一下。一般来说,容器的搭建在公司都是有运维来完成。但在一些小公司或者学习阶段,开放人员也应该要求能完成。
JAVA免费学习资料分享群,学习交流群:796759507
WEB免费学习资料分享群,学习交流群:1040432994
IT课程优惠抢购群(每日发送课程优惠卷及9.9元7天训练营入场券):812263163
小白学PS群:1063736259