当前位置: 首页 > 知识库问答 >
问题:

库伯内特斯上的雷迪斯哨兵哈

艾焕
2023-03-14

我试图有1个redis大师与2个redis复制品绑在一个3法定人数哨兵在Kubernetes。我对Kubernetes很陌生。

我最初的计划是让主控器在一个吊舱上运行,并绑定到一个Kubernetes SVC,而两个副本在自己的吊舱上运行,并绑定到另一个Kubernetes SVC。最后,3个哨兵吊舱将被绑在他们自己的SVC上。副本将被绑定到主SVC(因为没有SVC,ip将会改变)。sentinel还将配置并绑定到主SVC和副本SVC。但我不确定这是否可行,因为当主吊舱崩溃时,副本吊舱中的一个将如何移动到主SVC并成为主?这可能吗?

我的第二种方法是将redis pods封装在复制控制器中,对sentinel也是如此。但是,我不确定如何使用复制控制器使其中一个豆荚主副本和其他副本。

这两种方法中的任何一种可行吗?如果没有,有没有更好的设计我可以采用?任何线索都将不胜感激。

共有1个答案

李新霁
2023-03-14

您可以使用Helm package manager和Redis Helm Chart部署Redis Sentinel。
如果您还没有安装Helm3,您可以使用本文档来安装它。

我将提供几个解释来说明它是如何工作的。

首先,我们需要从Redis Helm图表中获取values.yaml文件来定制我们的安装:

$ wget https://raw.githubusercontent.com/bitnami/charts/master/bitnami/redis/values.yaml
# values.yaml

global:
  redis:
    password: redispassword
...
replica:
  replicaCount: 3
...
sentinel:
  enabled: true
...
$ helm install redis-sentinel bitnami/redis --values values.yaml

安装后,检查redisStatefulsetPodsServices(headless服务可用于内部访问):

$ kubectl get pods -o wide
NAME                    READY   STATUS    RESTARTS   AGE     IP
redis-sentinel-node-0   2/2     Running   0          2m13s   10.4.2.21
redis-sentinel-node-1   2/2     Running   0          86s     10.4.0.10
redis-sentinel-node-2   2/2     Running   0          47s     10.4.1.10


$ kubectl get sts
NAME                  READY   AGE
redis-sentinel-node   3/3     2m41s

$ kubectl get svc
NAME                      TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)              AGE
redis-sentinel            ClusterIP   10.8.15.252   <none>        6379/TCP,26379/TCP   2m
redis-sentinel-headless   ClusterIP   None          <none>        6379/TCP,26379/TCP   2m

如您所见,每个redis-sentinel-nodePod包含redissentinel容器:

$ kubectl get pods redis-sentinel-node-0 -o jsonpath={.spec.containers[*].name}
redis sentinel

我们可以检查sentinel容器日志,找出哪个redis-sentinel-node是主日志:

$ kubectl logs -f redis-sentinel-node-0 sentinel
...
1:X 09 Jun 2021 09:52:01.017 # Configuration loaded
1:X 09 Jun 2021 09:52:01.019 * monotonic clock: POSIX clock_gettime
1:X 09 Jun 2021 09:52:01.019 * Running mode=sentinel, port=26379.
1:X 09 Jun 2021 09:52:01.026 # Sentinel ID is 1bad9439401e44e749e2bf5868ad9ec7787e914e
1:X 09 Jun 2021 09:52:01.026 # +monitor master mymaster 10.4.2.21 6379 quorum 2
...
1:X 09 Jun 2021 09:53:21.429 * +slave slave 10.4.0.10:6379 10.4.0.10 6379 @ mymaster 10.4.2.21 6379
1:X 09 Jun 2021 09:53:21.435 * +slave slave 10.4.1.10:6379 10.4.1.10 6379 @ mymaster 10.4.2.21 6379
...

从上面的日志中可以看到,redis-sentinel-node-0吊舱是主吊舱,redis-sentinel-node-1&redis-sentinel-node-2吊舱是从吊舱。

为了进行测试,让我们删除主服务器,并检查sentinel是否会将主服务器角色切换到从服务器中的一个:

    $ kubectl delete pod redis-sentinel-node-0
    pod "redis-sentinel-node-0" deleted
    
    $ kubectl logs -f redis-sentinel-node-1 sentinel
    ...                                                                                           
    1:X 09 Jun 2021 09:55:20.902 # Executing user requested FAILOVER of 'mymaster'
    ...
    1:X 09 Jun 2021 09:55:22.666 # +switch-master mymaster 10.4.2.21 6379 10.4.1.10 6379
    ...
    1:X 09 Jun 2021 09:55:50.626 * +slave slave 10.4.0.10:6379 10.4.0.10 6379 @ mymaster 10.4.1.10 6379
    1:X 09 Jun 2021 09:55:50.632 * +slave slave 10.4.2.22:6379 10.4.2.22 6379 @ mymaster 10.4.1.10 6379

已经选择了一个新的master(redis-sentinel-node-210.4.1.10),所以一切都按预期进行。

此外,我们可以通过连接到Redis节点来显示更多信息:

$ kubectl run --namespace default redis-client --restart='Never' --env REDIS_PASSWORD=redispassword --image docker.io/bitnami/redis:6.2.1-debian-10-r47 --command -- sleep infinity
pod/redis-client created
$ kubectl exec --tty -i redis-client --namespace default -- bash
I have no name!@redis-client:/$ redis-cli -h redis-sentinel-node-1.redis-sentinel-headless -p 6379 -a $REDIS_PASSWORD
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
redis-sentinel-node-1.redis-sentinel-headless:6379> info replication
# Replication
role:slave
master_host:10.4.1.10
master_port:6379
master_link_status:up
...
 类似资料:
  • https://github.com/kubernetes/examples/tree/master/staging/storage/redis 它在给定的图像中工作得很好,但当我们使用Redis官方图像时,哨兵无法在第一个豆荚中连接到Redis。 它显示以下错误: 无法连接到redis,地址-P:6379 如何创建带有Redis官方图像的集群?

  • 我一直在读有关Redis sentinel用于故障转移的文章。我计划有1主+1从,如果主倒下超过1分钟,把从变成主。我知道这在哨兵身上是百分之百可能的。 null 与1个哨兵相比,多个哨兵有什么好处?我的应用程序一次只能连接到1个哨兵,即使有2个哨兵,如果其中一个在应用程序层中出现复杂的逻辑,我的应用程序也不能在其中任何一个之间旋转或切换。

  • 我使用的是Spring2.1.1和Redis4.0.1。我已经配置了两台节点计算机,一台具有主配置,另一台具有从配置。我正在两个系统上使用jedis(不使用spring-jedis)运行Springboot应用程序,出现了不同的情况- > 在主节点上运行应用程序(用主节点配置的redis)时,数据会集中在缓存中。 在从节点上运行应用程序时(redis配置了从节点),出现异常-(i.)我能够从sen

  • 我很好奇当计算redis故障转移的多数时,是否考虑到了死掉的(不可到达的)哨兵进程。例如,如果我在节点A有三个哨兵+Redis Master,在节点B有三个哨兵+Redis Slave,如果节点A完全脱机,Redis Slave B会升为Master吗?多数票(N/2+1)将意味着4个哨兵同意,但由于节点A中的三个哨兵已经死亡,他们是否算作N的一部分?

  • 当主人倒下的时候,它不应该被降级为奴隶吗?有了这一点,当它再次升起时,它将立即成为奴隶。我知道(自从Redis2.8?)配置重写功能使得Redis实例关闭时不能修改配置。 在一段时间内有两个主服务器对我来说是一个问题,因为在这么短的时间内,HaProxy不是向一个主服务器Redis发送请求,而是在这两个主服务器之间进行负载平衡。 有没有办法把失败的主人立即降级为奴隶?