springboot连接基于docker搭建的redis集群

祝愿明天考研的同学都能考上

环境:win10 /Docker for windows/docker redis集群
由于redis集群每次重新cluster nodes会更新spring boot配置的spring.redis.cluster.nodes。docker容器与本地宿主机不在同一个网段下面,更新会导致nodes不可达,所以需要在路由表里面加一个路由。

参见:http://www.cnblogs.com/brock0624/p/9788710.html 实现容器内网通过独立ip直接访问

如何在docker for windows的环境下搭建redis集群,请参见我的这篇文章:https://blog.csdn.net/xielinrui123/article/details/85104446

然后,我开始我的正文

上次在docker for windows的环境下搭建redis的集群里面,我是创建了一个docker network,然后将集群放到里面。这次我做了一点修改,直接在默认的docker环境中搭建好了集群,搭建的集群默认的ip网段是172.17.0.0/16 。为了和上述教程保持一致,所以做了这一个修改。
简单描述一下构建过程:假定根据docker for windows的环境下搭建redis的集群教程,已经创建了两个自定义的docker image
在这里插入图片描述

然后可以使用下面的指令,创建一个基于docker默认网段172.17.0.0/16的redis集群

# 创建6个redis节点 和 集群调度节点(ruby2)
docker run -d -p 7001:6379 --name r1 redis-cluster
docker run -d -p 7002:6379 --name r2 redis-cluster
docker run -d -p 7003:6379 --name r3 redis-cluster
docker run -d -p 7004:6379 --name r4 redis-cluster
docker run -d -p 7005:6379 --name r5 redis-cluster
docker run -d -p 7006:6379 --name r6 redis-cluster
docker run --name ruby2 -i -d ruby-redis
# 进入ruby2容器的shell界面中
docker exec -it ruby2 /bin/bash
# 安装redis的ruby插件
gem install redis --version 3.0.7

然后进入windows环境执行 docker inspect 容器名,查看6个节点在网段中的ip,用于Ruby2容器打开对redis集群的监管。

springboot连接基于docker搭建的redis集群_第1张图片
得到6个节点的ip地址之后,切换到ruby2容器的shell命令操作台

# 6379端口号是redis服务的默认端口号
./redis-trib.rb  create --replicas 1  172.17.0.3:6379 172.17.0.9:6379 172.17.0.7:6379 172.17.0.6:6379 172.17.0.5:6379 172.17.0.4:6379

此时,没有密码的集群就搭建好了。为了能让springboot能够有效连接到redis,我们需要给redis集群设置密码。分别使用下列指令,进入6个节点:

# 进入6个 redis 节点
docker exec -it r1 /bin/bash
docker exec -it r2 /bin/bash
docker exec -it r3 /bin/bash
docker exec -it r4 /bin/bash
docker exec -it r5 /bin/bash
docker exec -it r6 /bin/bash

均执行

# 进入redisclient
redis-cli -c
# 修改密码,注意每个节点的密码应该保持相等
config set masterauth kexuejia123
config set requirepass kexuejia123
auth kexuejia123
config rewrite

进入到ruby2容器,前往配置文件修改集群密码:

docker exec -it ruby2 /bin/bash
apt-get update
apt-get install vim
# 查找配置文件client.rb所在目录
find / -name 'client.rb'
# 进入client.rb所在目录,然后执行
vi client.rb

将password那一项修改成你的密码,我的就是 password = “kexuejia123”。

然后 ESC,wq 保存退出。

然后前往spring boot的配置文件配置:

# redis集群相关
spring.redis.password=kexuejia123
spring.redis.database=0
spring.redis.cluster.nodes=127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003,127.0.0.1:7004,127.0.0.1:7005,127.0.0.1:7006
spring.redis.timeout=6000ms

现在打开服务,用postman调用接口,可以发现连接超时。引起的原因是 spring-boot-starter-data-redis 包在每次查询节点的时候会将 执行cluster nodes后的ip和端口更新到 spring.redis.cluster.nodes 中,进而使得配置的 spring.redis.cluster.nodes 失效,让我们来看看,如果执行 cluster nodes会返回什么结果
在这里插入图片描述

返回的ip地址是在docker默认网段中的ip:port ,例如,当windows环境中去请求新的 spring.redis.cluster.nodes 中的 172.17.0.3:6379时候,就找不到172.17.0.3 这个 ip到底在哪里,所以这里必须得给windows一个指引,也就是向路由表里面写入一条路由。我们知道,docker在创建的时候,暴露了一张网卡给我们
springboot连接基于docker搭建的redis集群_第2张图片

看见一个名为:DockerNAT的网络适配器就是docker 内部网段和宿主之间的桥梁了。

# 添加一条路由信息,使得windows发出的172.17.0.0/16的包会丢到docker 中
route -p add 172.17.0.0 MASK 255.255.255.0 10.0.75.2

然后使用 route print -4 查看当前的路由表信息
springboot连接基于docker搭建的redis集群_第3张图片

发现已经添加进去了,然后 用 ping 命令查看
springboot连接基于docker搭建的redis集群_第4张图片
可以 ping 通了
然后打开项目和postman,测试登录接口:
springboot连接基于docker搭建的redis集群_第5张图片

到集群节点查看
在这里插入图片描述

已经插入进入了。然后再次发起请求:
springboot连接基于docker搭建的redis集群_第6张图片

使用redis集群可以在实现无状态的环境下做分布式session,分布式缓存等操作,同时,基于docker实现也有利于快速进行环境部署与更新。星期天开始spring boot连接用docker搭建分布式数据库 cockroachdb。cockroachdb是新一代数据库 newsql的一种,有比较优秀的分布式扩展能力,也就和mysql一样优秀的ACID机制。

在此感谢我身边良好的工作氛围和优秀的大佬们,给了我很多启迪,让我这种水平较差的新手有较多的采坑时间和学习时间。也给我生活上很多鼓励和帮助。

你可能感兴趣的:(java)