我想在kubernetes中创建6个节点的redis集群。我用Minikube运行kubernetes。
下面是我创建6节点集群的实现。
kind: StatefulSet
metadata:
generation: 1
labels:
app: demo-app
name: demo-app
namespace: default
spec:
podManagementPolicy: OrderedReady
replicas: 6
revisionHistoryLimit: 10
selector:
matchLabels:
app: demo-app
serviceName: ""
template:
metadata:
creationTimestamp: null
labels:
app: demo-app
spec:
containers:
- command:
- redis-server
- --port 6379
- --cluster-enabled yes
- --cluster-node-timeout 5000
- --appendonly yes
- --appendfilename appendonly-6379.aof
image: redis:latest
imagePullPolicy: Always
name: demo-app
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- name: redis-pvc
mountPath: /var
- image: nginx:1.12
imagePullPolicy: IfNotPresent
name: redis-exporter
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate
volumeClaimTemplates:
- metadata:
name: redis-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
创建有状态集后,我将从其中一个Pod中执行redis创建集群命令。
redis-cli --cluster create 172.17.0.4:6379 172.17.0.5:6379 172.17.0.6:6379 172.17.0.7:6379 172.17.0.8:6379 172.17.0.9:6379 --cluster-replicas 1
这些都是豆荚的IP。有了这个,我就可以启动集群了。但一旦我使用
kubernetes delete pod <podname>
例如,删除具有IP地址的redis节点:172.17.0.6:6379它应该是主节点。删除redis集群后状态为:
127.0.0.1:6379> cluster nodes
1c8c238c58d99181018b37af44c2ebfe049e4564 172.17.0.9:6379@16379 slave 4b75e95772887e76eb3d0c9518d13def097ce5fd 0 1579496695000 6 connected
96e6be88d29d847aed9111410cb0f790db068d0e 172.17.0.8:6379@16379 slave 0db23edf54bb57f7db1e2c9eb182ce956229d16e 0 1579496696596 5 connected
c8be98b16a8fa7c1c9c2d43109abafefc803d345 172.17.0.7:6379@16379 master - 0 1579496695991 7 connected 10923-16383
0db23edf54bb57f7db1e2c9eb182ce956229d16e 172.17.0.4:6379@16379 myself,master - 0 1579496694000 1 connected 0-5460
4daae1051e6a72f2ffc0675649e9e2dad9430fc4 172.17.0.6:6379@16379 master,fail - 1579496680825 1579496679000 3 disconnected
4b75e95772887e76eb3d0c9518d13def097ce5fd 172.17.0.5:6379@16379 master - 0 1579496695000 2 connected 5461-10922
过了一段时间,它会变成:
127.0.0.1:6379> cluster nodes
1c8c238c58d99181018b37af44c2ebfe049e4564 172.17.0.9:6379@16379 slave 4b75e95772887e76eb3d0c9518d13def097ce5fd 0 1579496697529 6 connected
96e6be88d29d847aed9111410cb0f790db068d0e 172.17.0.8:6379@16379 slave 0db23edf54bb57f7db1e2c9eb182ce956229d16e 0 1579496696596 5 connected
c8be98b16a8fa7c1c9c2d43109abafefc803d345 172.17.0.7:6379@16379 master - 0 1579496698031 7 connected 10923-16383
0db23edf54bb57f7db1e2c9eb182ce956229d16e 172.17.0.4:6379@16379 myself,master - 0 1579496697000 1 connected 0-5460
4daae1051e6a72f2ffc0675649e9e2dad9430fc4 :0@0 master,fail,noaddr - 1579496680825 1579496679000 3 disconnected
4b75e95772887e76eb3d0c9518d13def097ce5fd 172.17.0.5:6379@16379 master - 0 1579496697028 2 connected 5461-10922
由于redis群集提供自动故障切换,但pod的redis无法自动加入群集?
或者我应该手动将该pod加入集群?
我强烈建议使用Sentinel而不是Redis中的集群命令来考虑HA选项。哨兵的设计正是为了做到这一点。
总的来说,根据我的经验,Redis的体系结构在Kubernetes网络中并不适用。告诉ReISIS实例,你的奴隶是,尤其是程序化可能是一个噩梦(正如你已经看到必须手动触发一个集群),特别是当你认为荚荚沟通不符合KubNeNETs网络HealCracy。
我对cluster命令在Kubernetes内部的作用没有信心,特别是对于POD的短暂性质。
我实际上维护了一个舵图,试图绕过这些问题。这提供了一种从群集外部广播Redis的机制。你可以在这里找到它。
要详细介绍两个场景,说明为什么这样做行不通:
>
如果你失去了原来的主程序,你将如何告诉你的应用程序连接到新的主程序?除非您有一些抽象层单独查询它们,询问谁是主人。这是更多的工作,然后真的需要哨兵在发挥作用,它是为了绕过这个确切的问题而建造的。
如果您删除一个从站,因为它是通过IP绑定的,您将完全失去该从站,因为将在为您的集群定义的CIDR中创建一个绑定到新IP的新veth。您可以通过在CIDR上使用 /24地址定义您的节点来解决这个问题,但是您基本上是在为每个Redis实例部署一个节点,这似乎违背了orchstrator的观点。
我已经解决了这个问题,并使用这个有状态集yaml创建了一个redis集群。问题是我没有在持久卷中挂载群集配置文件。群集配置文件包含其他节点的位置。现在群集配置文件将在Pod重启时保留。
当redis集群使用八卦协议时。它只需要一个活动节点就可以获得整个集群的配置。
现在,有状态集的最终配置为:
apiVersion: apps/v1
kind: StatefulSet
metadata:
generation: 1
labels:
app: demo-app
name: demo-app
namespace: default
spec:
podManagementPolicy: OrderedReady
replicas: 6
revisionHistoryLimit: 10
selector:
matchLabels:
app: demo-app
serviceName: ""
template:
metadata:
creationTimestamp: null
labels:
app: demo-app
spec:
containers:
- command:
- redis-server
- --port 6379
- --cluster-enabled yes
- --cluster-node-timeout 5000
- --appendonly yes
- --cluster-config-file /var/cluster-config.conf
- --appendfilename appendonly-6379.aof
image: redis
imagePullPolicy: Always
name: demo-app
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- name: redis-pvc
mountPath: /var
- image: nginx:1.12
imagePullPolicy: IfNotPresent
name: redis-exporter
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate
volumeClaimTemplates:
- metadata:
name: redis-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
我所做的唯一更改是添加--cluster-config文件/var/cluster-config。启动redis服务器时的conf参数。
问题内容: 我想在Kubernetes中创建6个节点的Redis集群。我正在使用 Minikube 运行 kubernetes 。 以下是我创建6节点群集的实现。 创建有状态集之后,我将从一个Pod内部执行redis create cluster命令。 这些都是pod的ips。有了这个,我就能启动集群了。但是一旦我手动删除使用 例如,删除IP地址为172.17.0.6:6379的Redis节点(假
我有3个使用Redis运行的EC2实例,如下所示: 服务器001:10.0.1.203,端口:6379 服务器002:10.0.1.202,端口:6380 服务器003:10.0.1.190,端口:6381 每个配置文件: 我可以通过redis连接到每台服务器上的每一台。 但是,当我运行集群创建时,脚本永远不会在服务器001上结束。 服务器002日志: 服务器003日志: 配置中缺少什么?
Redis 集群(Redis Cluster) 是 Redis 提供的分布式数据库方案。 既然是分布式,自然具备分布式系统的基本特性:可扩展、高可用、一致性。 Redis 集群通过划分 hash 槽来分片,进行数据分享。 Redis 集群采用主从模型,提供复制和故障转移功能,来保证 Redis 集群的高可用。 根据 CAP 理论,Consistency、Availability、Partition
为 Redis 自带的主从复制提供主从切换方案。 2. TwenProxy 3. Redis Cluster 4. Codies 参考资料 Redis 集群方案
问题内容: 我需要获取Amazon Elasticache中Redis集群的终端节点。以下代码适用于Memcached群集,但不适用于Redis: 输出为: 请注意,群集对象如何包含端点信息(键:),但仍返回。 我如何获得终点? 问题答案: 通常,我在发布问题后就找到了解决方案。在Redis中,您必须访问缓存节点:
我在从Lambda函数连接Elasticache时遇到问题,我已完成以下操作: 创建了一个新的安全组 Internet正常工作,我通过打开URL验证stackoverflow.com。但是Elasticache自动发现超时。是否需要进行任何额外的配置? 更新I将安全组的入站规则添加到端口6379,现在仍然超时。