首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Redis Pods无法加入Redis集群

Redis Pods无法加入Redis集群
EN

Stack Overflow用户
提问于 2020-01-20 04:55:37
回答 2查看 1.2K关注 0票数 0

我想在kubernetes中创建由6个节点组成的redis集群。我正在使用Minikube运行kubernetes。

下面是我创建6个节点集群的实现。

代码语言:javascript
运行
复制
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

在创建有状态集之后,我将执行redis创建集群命令。

代码语言:javascript
运行
复制
 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

这些都是pods.With的ips,我可以启动集群。但一旦我手动删除一个吊舱使用

代码语言:javascript
运行
复制
kubernetes delete pod <podname> 

例如,删除具有IP地址: 172.17.0.6:6379的redis节点,它应该是master.After,删除redis集群状态是:

代码语言:javascript
运行
复制
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

过了一段时间,它改变为:

代码语言:javascript
运行
复制
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集群提供了自动故障转移,但是吊舱的redis无法自动加入到集群中?

还是我应该手动加入这个吊舱到集群中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-24 14:03:53

我已经解决了这个问题,并使用这个有状态集yaml创建了一个redis集群。问题是,我没有在持久卷中挂载集群配置文件。群集配置文件包含其他节点的位置。现在,集群配置文件将在豆荚重新启动期间持久化。

当redis集群在八卦协议上工作时。它只需要一个活动节点就可以得到整个集群的配置。

现在,有状态集的最终配置是:

代码语言:javascript
运行
复制
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

只有我所做的更改是在启动redis服务器时添加--集群-config-file /var/cluster-config.conf参数。

票数 2
EN

Stack Overflow用户

发布于 2020-01-20 06:03:34

我强烈建议在Redis中使用Sentinel而不是集群命令来考虑HA选项。哨兵的设计正是为了做到这一点。

从我的经验来看,Redis的架构在Kubernetes网络中并不是很好。告诉Redis您的奴隶在哪里,特别是在编程方面,可能是一场噩梦(正如您所看到的,必须手动触发集群),特别是当您认为吊舱到吊舱通信不符合Kubernetes网络传家宝的时候。

我对集群命令将如何在Kubernetes内部运行,特别是对于豆荚的短暂特性不太自信。

我实际上保存了一个舵图,试图绕过这些问题。这提供了一种机制,用于从集群外部广播您的Redis。你可以找到它,这里

为了详细说明为什么这个方法不起作用的几个场景:

  1. 如果你失去了原来的主人,你会如何告诉你的应用程序连接到新的主机?除非您有一些抽象层,单独地查询它们,询问谁是主。这是更多的工作,然后是真正需要与哨兵在游戏,这是建立,以规避这个确切的问题。
  2. 如果您删除一个从服务器,因为这是通过IP绑定的,您将完全失去该从服务器,因为将创建一个新的veth,绑定到为您的集群定义的CIDR中的一个新IP。6个节点变成5个节点。您可以通过在CIDR上定义具有/24地址的节点来解决这个问题,但是接下来您基本上是在每个Redis实例部署一个节点,这似乎击败了orchstrator的点。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59817189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档