在上一篇博文中搭建好了redis集群,但是仍然存在很多问题
上一篇:k8s下搭建redis集群
1、springboot服务连接
集群配置好了,spring服务应该怎么连接呢?单点和集群的连接配置写法是不一样的
单点
spring:
redis:
host: ${BTC_REDIS_HOST}
port: ${BTC_REDIS_PORT}
password: ${BTC_REDIS_PASSWORD}
timeout: 0
database: 2
jedis:
pool:
max-idle: 100
max-wait: 30000
集群
spring:
redis:
password: foobared
cluster:
nodes:
redis-cluster-0.redis-cluster-service.tool-beta:6379,
redis-cluster-1.redis-cluster-service.tool-beta:6379,
redis-cluster-2.redis-cluster-service.tool-beta:6379,
redis-cluster-3.redis-cluster-service.tool-beta:6379,
redis-cluster-4.redis-cluster-service.tool-beta:6379,
redis-cluster-5.redis-cluster-service.tool-beta:6379
2、集群节点重建后,spring服务连接异常
集群节点重建,在服务器上观察cluster nodes,发现节点ip已经变化,且集群已经更新了节点ip信息,看上去没啥问题,也能够通过命令行方式读写
但是spring服务疯狂报错,检查配置无问题
jedis报错:could not get a resource from the pool
redisson直接报连接ip超时,奇怪的是redisson里面报错的ip不是任何一个redis节点的ip
进入redis-cluster-0的持久卷,查看node.conf,发现其它节点的ip正确,而标记myself的节点ip是重建前的ip !
经过反复实验,确认了:
redis集群在k8上部署时存在bug,redis某个节点重建时,唯独不会更新它自己的node.conf的ip地址!
查阅github的issue,找到了答案:
Redis cluster returns IP address of master which not exist #4289
这个issue中提到,在redis的启动参数中显式指定ip地址可以解决这个问题
尝试按照这个配置,重新建立redis集群,再查看node.conf文件,发现能够正确更新自己的ip了,spring服务也能够正常连接了。
3、spring服务只能写入,无法读(真正问题:redis集群主从节点复制异常)
随后出现的问题是,从redis中读取的内容均为null
在命令行里操作依然完全正常,且发现redis中已经有服务写入的信息
使用远程调试尝试定位,在docker的启动参数中添加
env:
- name: JAVA_TOOL_OPTIONS
value: >-
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
注:这是jdk8的写法,jdk9以上需要使用另一种写法
然后开通对应service的5005端口,映射到宿主机
调试结果:redisTemplate能够写入,但无法获取任何key!
我直接问号,这是什么毛病
看看redis节点有没有什么信息,突然发现节点在不停的报错
MASTER aborted replication with an error: NOAUTH Authentication required
似乎是主从节点的复制过程中,认证出现了问题
查阅资料确认:主从节点在设置了密码的情况下,需要配置masterauth
修改完成后重建集群,这次服务可以获取key了!