我试图有1个redis大师与2个redis复制品绑在一个3法定人数哨兵在Kubernetes。我对Kubernetes很陌生。
我最初的计划是让主控器在一个吊舱上运行,并绑定到一个Kubernetes SVC,而两个副本在自己的吊舱上运行,并绑定到另一个Kubernetes SVC。最后,3个哨兵吊舱将被绑在他们自己的SVC上。副本将被绑定到主SVC(因为没有SVC,ip将会改变)。sentinel还将配置并绑定到主SVC和副本SVC。但我不确定这是否可行,因为当主吊舱崩溃时,副本吊舱中的一个将如何移动到主SVC并成为主?这可能吗?
我的第二种方法是将redis pods封装在复制控制器中,对sentinel也是如此。但是,我不确定如何使用复制控制器使其中一个豆荚主副本和其他副本。
这两种方法中的任何一种可行吗?如果没有,有没有更好的设计我可以采用?任何线索都将不胜感激。
您可以使用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
安装后,检查redisStatefulset
、Pods
和Services
(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-node
Pod包含redis
和sentinel
容器:
$ 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-2
10.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的一部分?
null
当主人倒下的时候,它不应该被降级为奴隶吗?有了这一点,当它再次升起时,它将立即成为奴隶。我知道(自从Redis2.8?)配置重写功能使得Redis实例关闭时不能修改配置。 在一段时间内有两个主服务器对我来说是一个问题,因为在这么短的时间内,HaProxy不是向一个主服务器Redis发送请求,而是在这两个主服务器之间进行负载平衡。 有没有办法把失败的主人立即降级为奴隶?