我是Redis和Kubernetes的新手,有一个由3个Redis和3个哨兵组成的Kubernetes集群。
kubernetes % kubectl -n redis get pods
NAME READY STATUS RESTARTS AGE
redis-0 1/1 Running 0 7d16h
redis-1 1/1 Running 0 7d15h
redis-2 1/1 Running 0 8d
sentinel-0 1/1 Running 0 9d
sentinel-1 1/1 Running 0 9d
sentinel-2 1/1 Running 0 9d我已经成功地将哨兵和Redis-master连接起来,并能够通过exec使用Redis-cli测试基本的HA操作,现在我想将我的外部java应用程序连接到这个Redis-集群,
现在,据我所知,我们应该连接到哨兵,哨兵将指导我们的Redis-主舱,在那里可以执行写操作。
因此,我对此有一些疑问,我可以连接到任何一个哨兵服务器并能够执行我的操作,还是应该始终连接到一个主服务器?如果我们连接到一个哨兵,如果哨兵大师倒下,在这方面的行动计划或最佳实践应该是什么,我看过一些博客,但似乎无法达成一个明确的理解?
我应该怎么做才能连接我的Spring引导来连接到这个集群?我也读过一些这方面的内容,似乎我无法直接从IntelliJ/本地机器连接到小型库集群,需要创建一个映像并将其部署在同一个命名空间中,有什么解决办法吗?
下面是我的redis服务的yaml文件
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
selector:
name: redis
ports:
- port: 6379
targetPort: 6379谢谢
发布于 2022-01-21 09:30:34
是的,你应该能够连接到任何哨兵。来自https://redis.io/topics/sentinel-clients
客户机应该迭代哨兵地址列表。对于每个地址,它应该尝试连接到哨兵,使用一个短超时(按几百毫秒的顺序排列)。在错误或超时时,应尝试下一个哨兵地址。
如果所有哨兵地址均未成功,则应将错误返回给客户端。
响应客户端请求的第一个哨兵应该放在列表的开头,因此在下一个重新连接时,我们将首先尝试在上一次连接尝试中可到达的哨兵,以最小化延迟。
如果您使用的是支持哨兵的redis客户端库,则只需将所有redis哨位地址传递给客户端,客户端库就会按照上述Redis文档的建议为您处理连接逻辑。
既然你是在库伯内特斯,你可以使它更简单。不要像您已经做的那样,将哨兵部署为带有3个副本的Statefulset,而是将其部署为一个带有3个副本的Deployment。为redis哨兵创建一个服务对象。将此服务地址作为哨兵入口传递到您的redis客户端库。通过这种方式,您不需要使用多个哨位地址,而且如果无法到达,k8s将自动处理从服务端点移除的哨兵,这样所有客户端都不需要发现在线的哨兵。
您还可以使用像https://github.com/spotahome/redis-operator这样的redis操作符,它负责基于哨兵的redis集群的部署生命周期。
https://stackoverflow.com/questions/70796477
复制相似问题