gpt4 book ai didi

python-3.x - Azure Kubernetes 上的 Redis 分片集群

转载 作者:行者123 更新时间:2023-12-02 19:04:34 25 4
gpt4 key购买 nike

我已关注这些链接

  1. https://medium.com/zero-to/setup-persistence-redis-cluster-in-kubertenes-7d5b7ffdbd98 ,
  2. https://github.com/sanderploegsma/redis-cluster

在 AKS 上构建 Redis 分片集群,但它们是通过使用 Pod IP 连接的,但我需要使用“Python”连接到该集群以将数据输入其中,因为它们是使用 Pod IP 在内部连接的,所以我不是能够使用Python进行连接。或者,我没有创建一个有状态集的 6 个副本,而是创建了 6 个具有 6 个服务的不同有状态集,并且全部作为“负载均衡器”对外公开,​​但他们使用这个命令来创建一个集群

kubectl exec -it redis-cluster-0 -- redis-cli --cluster create --cluster-replicas 1 \
$(kubectl get pods -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 ')

我不知道如何编辑它以使用负载均衡器 IP 而不是 Pod IP,因此使用这 6 个外部 IP 我无法创建集群。我需要 Azure Kubernetes 服务上的 Redis 分片集群,可以从 Python 库“redis-py-cluster”外部访问该集群

提前致谢

最佳答案

理论

您的问题不是很清楚,因为我在最初的帖子下的评论没有答案,但看起来您一直在遵循本指南:Setup Persistence Redis Cluster in Kubernetes .

让我们分解一下您所引用的命令:

kubectl exec -it redis-cluster-0 -- redis-trib create --replicas 1 $(kubectl get pods -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 ')

kubectl语法是:

kubectl exec (POD | TYPE/NAME) [-c CONTAINER] [flags] -- COMMAND [args...] [options]

这就是为什么: kubectl exec -it redis-cluster-0代表 redis-cluster-0 上的“在容器中执行命令”以及“将标准输入传递到容器”和“标准输入是 TTY”选项荚。

第二部分是redis-trib create --replicas 1 <IPs>

$(kubectl get pods -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 ')

仅列出使用 redis-cluster-deployment.yaml 创建的 StatefulSet 中 Pod 的 IP 。

考虑到 app=redis-cluster我们在该命令中使用的标签取自 spec/template/metadata/labels您可以按照自己喜欢的方式调整命令,或者只是手动列出 IP,然后使用 kubectl get pods -l 获取它们。

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
...
spec:
serviceName: redis-cluster
replicas: 6
template:
metadata:
labels:
app: redis-cluster # This is the label we are using in that command

我的回答:

您可以使用 IP 或调整您在 kubectl get pods -l ... 中使用的标签命令的一部分。无法提供准确的答案,因为我没有收到重现步骤。

我的尝试:

我不确定您到底是如何创建状态集的;但是,您仍然可以在它们上创建 Redis 集群。

就我而言,我使用了以下 YAML:redis-cluster-deployment-1.yamlredis-cluster-deployment-2.yaml

$ kubectl create -f redis-cluster-deployment-1.yaml 
statefulset.apps/redis-cluster-set-1 created

$ kubectl create -f redis-cluster-deployment-2.yaml
statefulset.apps/redis-cluster-set-2 created

$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
redis-cluster-set-1-0 1/1 Running 0 52m 10.12.0.22 gke-6v3n
redis-cluster-set-1-1 1/1 Running 0 51m 10.12.1.17 gke-m7z8
redis-cluster-set-1-2 1/1 Running 0 50m 10.12.1.18 gke-m7z8
redis-cluster-set-2-0 1/1 Running 0 51m 10.12.0.23 gke-6v3n
redis-cluster-set-2-1 1/1 Running 0 50m 10.12.1.19 gke-m7z8
redis-cluster-set-2-2 1/1 Running 0 14m 10.12.0.24 gke-6v3n


$ kubectl exec -it redis-cluster-set-1-0 -- redis-trib create --replicas 1 $(kubectl get pods -l app=redis-cluster-set-app -o jsonpath='{range.items[*]}{.status.podIP}:6379 ')
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
10.12.0.22:6379
10.12.1.17:6379
10.12.1.18:6379
Adding replica 10.12.1.19:6379 to 10.12.0.22:6379
Adding replica 10.12.0.24:6379 to 10.12.1.17:6379
Adding replica 10.12.0.23:6379 to 10.12.1.18:6379
....

这里重要的部分是指定正确的 pod nameapp=标签 。

就我而言,$(kubectl get pods -l app=redis-cluster-set-app -o jsonpath='{range.items[*]}{.status.podIP}:6379 ')命令会生成以下 IP 列表(您可以将它们与上面的输出进行比较。

$ kubectl get pods -l app=redis-cluster-set-app -o jsonpath='{range.items[*]}{.status.podIP}:6379 '
10.12.0.22:6379 10.12.1.17:6379 10.12.1.18:6379 10.12.0.23:6379 10.12.1.19:6379 10.12.0.24:6379

希望有帮助。

更新(2019 年 12 月 6 日):

have created a service LoadBalancer" and I am pretty sure I have given a correct "serviceName" under "spec". That LoadBalancer gave me an external Ip. After I created a redis sharded cluster, when I try to connect to that external IP using python, It was able to connect to only one node of redis and asks for other 5 nodes and eventually failed with "Timeout" error

我也做了同样的事情并进行了测试3 个节点上的 Redis 集群:

$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP
redis-cluster-set-1-0 1/1 Running 0 20h 10.12.1.30
redis-cluster-set-1-1 1/1 Running 0 20h 10.12.0.29
redis-cluster-set-1-2 1/1 Running 0 20h 10.12.1.31

创建了一些数据并尝试将其从 Redis 集群中取出。

$ kubectl exec -it redis-cluster-set-1-0 -- redis-cli SET Australia Sydney
OK
$ kubectl exec -it redis-cluster-set-1-0 -- redis-cli GET Australia
"Sydney"

它有效,所以我尝试从集群中的另一个节点查询相同的数据

$ kubectl exec -it redis-cluster-set-1-2 -- redis-cli GET Australia
(error) MOVED 1738 10.12.1.30:6379

Redis 集群回复内部 IP MOVED回应。

我认为内部 IP 地址是导致“超时”错误的原因。

同时直接登录该pod也可以获取数据

$ kubectl exec -it redis-cluster-set-1-2 -- bash
root@redis-cluster-set-1-2:/data# redis-cli GET Australia
(error) MOVED 1738 10.12.1.30:6379

root@redis-cluster-set-1-2:/data# redis-cli -h 10.12.1.30 GET Australia
"Sydney"

从此Github Issue看来redis并没有通过Redis集群代理连接来纠正节点,而是简单地将适当服务器的IP地址传递回客户端,然后客户端直接发起连接。

(有点偏离主题,但仍然值得一提)。在检查时,我发现了一个[另一个文档],它解释了 ( https://cloud.google.com/memorystore/docs/redis/connect-redis-instance-gke ) 如何从 Google Kubernetes Engine 集群(使用 LoadBalancer)连接到 Redis 实例。

关于python-3.x - Azure Kubernetes 上的 Redis 分片集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59127879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com