Docker搭建redis Cluster

使用Docker搭建redis Cluster,最重要的环节就是容器通信的问题,本篇文章主要练习使用多个容器完后Redis Cluster集群环境的搭建

​ 按照Redis官网:https://redis.io/docs/manual/scaling/的提示,为了使Docker和Redis Cluster兼容,需要使用Docker的host网络模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-37UnRofy-1652526749564)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220513144413019.png)]

​ host 网络模式需要在创建容器时通过参数 --net host 或者 --network host指定,host网络模式可以让容器共享宿主机网络栈,容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

1.环境

​ 为了让环境更加真实,本文使用多机环境:

  • 192.168.31.138
  • 192.168.31.139

​ 每台机器所使用的基础设施环境如下:

  • Centos 7.9.2009
  • Docker version 20.10.16

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ru6wJTO-1652526749565)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220514143200174.png)]

2.搭建

​ 整天搭建步骤主要分为以下几步:

  • 下载redis镜像(可以省略,因为创建容器时,如果本地镜像不存在,就会去远程拉取);
  • 编写redis配置文件;
  • 创建redis集群;
  • 创建Redis Cluster集群。

2.1编写redis配置文件

2.1.1 创建目录及文件

​ 分别在192.168.31.138和192.168.31.139两台机器上执行以下操作。

#创建目录
mkdir -p /usr/local/docker-redis/redis-cluster
#切换至指定目录
cd /usr/local/docker-redis/redis-cluster
#编写 redis-cluster.tmpl文件
vi redis-cluster.tmpl
2.1.2编写配置文件

​ 192.168.31.138 机器的 redis-cluster.tmpl 文件内容如下:

port ${PORT}
requirepass 123456
masterauth 123456
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.31.138
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}

​ 192.168.31.139 机器的 redis-cluster.tmpl 文件内容如下:

port ${PORT}
requirepass 123456
masterauth 123456
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.31.139
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
 port:节点端口;
 reqirepass:添加访问认证;
 masterauth:如果主节点开启了访问认证,从节点访问主节点需要认证;
 protected-mode:保护模式,默认值yes,即开启。开启保护模式以后 ,需配置 bind ip 或者设置访问密码;关闭保护模式,外部网络可以直接访问;
 daemonize:是否以守护线程的方式启动(后台启动),默认no;
 appendonly:是否开启AOF持久化模式,默认no;
 cluster-enabled:是否开启集群模式,默认no;
 cluster-config-file:集群节点信息文件;
 cluster-node-timeout:集群节点连接超时时间;
 cluster-announce-ip:集群节点IP,填写宿主机的IP;
 cluster-announce-port:集群节点映射端口;
 cluster-announce-bus-port:集群节点总线端口。
	每个Redis集群节点需要打开两个TCP连接。端口6379提供给客户端连接,外加上一个端口16379,记起来也比较容易,在6379的基础上加10000
	端口16379提供给集群总线使用,总线用来集群节点间通信,使用的是二进制协议。集群总线的作用:失败检测、配置升级、故障转移授权等。客户端只能连接6379端口,不能连接端口16379。防火墙需要确保打开这两个端口,否则集群节点之间不能通信。
	命令端口和总线端口之间总是相差10000 。

​ 在 192.168.31.138 机器的 redis-cluster 目录下执行以下命令:

for port in `seq 6371 6373`; do \
  mkdir -p ${port}/conf \
  && PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \
  && mkdir -p ${port}/data; \
done

​ 在 192.168.31.139 机器的 redis-cluster 目录下执行以下命令:

for port in `seq 6374 6376`; do \
  mkdir -p ${port}/conf \
  && PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \
  && mkdir -p ${port}/data; \
done

上面两段 shell for语句,意思就是循环创建6371~6376相关的目录及文件。

​ 在 192.168.31.138 机器执行查看命令结果如下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y8I0F1bK-1652526749565)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220514145356132.png)]

​ 在 192.168.31.139 机器执行查看命令结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w5kQOTtV-1652526749566)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220514145443998.png)]

​ 以下内容为每个节点的配置文件详细信息

----------------192.168.31.138------------------------------------------------------------------------------
[root@localhost redis-cluster]# cat /usr/local/docker-redis/redis-cluster/637{1..3}/conf/redis.conf
port 6371
requirepass 123456
masterauth 123456
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.31.138
cluster-announce-port 6371
cluster-announce-bus-port 16371
port 6372
requirepass 123456
masterauth 123456
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.31.138
cluster-announce-port 6372
cluster-announce-bus-port 16372
port 6373
requirepass 123456
masterauth 123456
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.31.138
cluster-announce-port 6373
cluster-announce-bus-port 16373

2.2创建redis容器

2.2.1创建容器

​ 将宿主机的 6371~6376 之间的端口与6个redis容器映射,并将宿主机的目录与容器内的目录进行映射(目录挂载)。记得指定网络模式,使用 host 模式。

​ 在 192.168.31.138 机器执行以下命令:

for port in $(seq 6371 6373); do \
	docker run -di --restart always --name redis-${port} --net host \
	-v /usr/local/docker-redis/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
	-v /usr/local/docker-redis/redis/cluster/${port}/data:/data \
	redis redis-server /usr/local/etc/redis/redis.conf; \
 done

​ 在 192.168.31.139 机器执行以下命令:

for port in $(seq 6374 6376); do \
	docker run -di --restart always --name redis-${port} --net host \
	-v /usr/local/docker-redis/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
	-v /usr/local/docker-redis/redis/cluster/${port}/data:/data \
	redis redis-server /usr/local/etc/redis/redis.conf; \
 done

在 192.168.31.138机器上查看容器是否创建成功
在 192.168.31.139机器上查看容器是否创建成功
#docker ps

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KI4saF2q-1652526749566)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220514145900412.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xLWP99wL-1652526749566)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220514145923848.png)]

2.3 创建 Redis Cluster集群

​ 随便进入一个容器节点,并进入 /usr/local/bin/ 目录:

#进入容器
docker exec -it redis-6373 bash
#切换至指定目录
cd /usr/local/bin/

​ 接下来我们就可以通过如下命令实现Redis Cluster集群的创建

redis-cli -a 123456 --cluster create 192.168.31.138:6371 192.168.31.138:6372 192.168.31.138:6373 192.168.31.139:6374 192.168.31.139:6375 192.168.31.139:6376 --cluster-replicas 1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EGioVLMZ-1652526749567)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220514150209628.png)]

​ 出现上述问题是防火墙没有关闭,解决办法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9C06Z7Na-1652526749567)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220514150256193.png)]

systemctl disable firewalld  永久禁用防火墙,需搭配关闭防火墙命令使用

systemctl  enable firewalld 永久启用防火墙,需搭配开启防火墙命令使用

systemctl stop firewalld       临时关闭防火墙

systemctl start firewalld       l临时开启防火墙

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PWXEuhQP-1652526749567)(file:///C:\Users\ASUS\Documents\Tencent Files\2801133843\Image\C2C\7ED5WW{T(P457%OX@)]XP%RA.png)

报错原因:另一台虚拟机关闭了防火墙,但是运行的这台虚拟机防火墙没有关闭,解决办法

Redis Cluster是主从模式,所以只用从3个主机入手
删掉配置文件,重新开始
rm -rf /usr/local/docker-redis/redis-cluster
此时删掉的是redis-cluster,但是docker-redis里面也有一系列文件,此时删掉再从redis配置文件开始,还是会报一样的错误,所以要删掉/usr/local/docker-redis,此时再重新配置redis文件,就会成功,为什么会把前面那个文件的删除写出来呢?因为我在这绕了很久,所以希望可以帮助到大家

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bisvNzPv-1652526749568)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220514175139795.png)]

3.查看集群状态

​ 先进入容器 ,然后通过一些集群常用的命令查看以下集群的状态

#进入容器
docker exec -it redis-6371 bash
#切换至指定目录
cd /usr/local/bin
3.1 检查集群状态
redis-cli -a 123456 --cluster check 192.168.31.139:6376

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KGBU96am-1652526749568)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220514180438603.png)]

3.2查看集群信息和节点信息
#连接至集群某个节点
redis-cli -c -a 123456 -h 192.168.31.139 -p 6375
#查看集群信息
cluster info
#查看集群结点信息
cluster nodes

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-771ZEvtO-1652526749568)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220514180957168.png)]

3.3 SET/GET

​ 在6371节点中执行写入和读取,命令如下:

#进入容器并连接至集群某个节点
docker exec -it redis-6371 /usr/local/bin/redis-cli -c -a 123456 -h 192.168.31.138 -p 6371
#写入数据
set name liangxiaofeng
set name zhujiahui
set zhujiahui 111
set name xiexiaoyi
set xiexiaoyi 222
#读取数据
get name
get xiexiaoyi
get zhujiahui

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sfUyAYWb-1652526749568)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20220514182620698.png)]

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值