【问题标题】:Production Redis cluster with sharding in Kubernetes在 Kubernetes 中使用分片的生产 Redis 集群
【发布时间】:2019-10-28 13:39:37
【问题描述】:

我已经尝试使用 Redis stable 'helm' 图表来部署一个 Redis 集群,该集群具有 1 个主节点和 3 个从节点,用于复制写入主节点的数据。但这是一个单点故障——我删除了 master,没有重新创建新的 master pod。此外,图表不支持数据分区(分片)。

编辑:我已经使用 helm redis-ha 图表创建了一个 Redis 集群,但是没有分片选项。

难道没有 Redis helm 图表来部署支持分区(分片)的生产就绪 HA 集群吗?您能指出我可以用来设置可管理 Redis 集群的资源吗?我的 Redis 主要用于数据缓存、消息处理和流式传输。

【问题讨论】:

    标签: kubernetes redis


    【解决方案1】:

    你需要 Redis Sentinel。

    如果helm 是一个选项,这些链接可能会有所帮助:

    https://github.com/helm/charts/tree/master/stable/redis(注意sentinel相关的配置参数)

    https://github.com/helm/charts/tree/master/stable/redis-ha

    【讨论】:

      【解决方案2】:

      这是一个很好的tutorial,关于设置一个带有分区的 3 主 / 3 从 Redis 集群。它针对的是 Rancher,但这是可选的,我刚刚在 Azure Kubernetes Service 上对其进行了测试,它运行良好。

      首先,应用这个 yaml(ConfigMap、StatefulSet with 6 replicas、Service):

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: redis-cluster
      data:
        update-node.sh: |
          #!/bin/sh
          REDIS_NODES="/data/nodes.conf"
          sed -i -e "/myself/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/${POD_IP}/" ${REDIS_NODES}
          exec "$@"
        redis.conf: |+
          cluster-enabled yes
          cluster-require-full-coverage no
          cluster-node-timeout 15000
          cluster-config-file /data/nodes.conf
          cluster-migration-barrier 1
          appendonly yes
          protected-mode no
      ---
      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: redis-cluster
      spec:
        serviceName: redis-cluster
        replicas: 6
        selector:
          matchLabels:
            app: redis-cluster
        template:
          metadata:
            labels:
              app: redis-cluster
          spec:
            containers:
            - name: redis
              image: redis:5.0.1-alpine
              ports:
              - containerPort: 6379
                name: client
              - containerPort: 16379
                name: gossip
              command: ["/conf/update-node.sh", "redis-server", "/conf/redis.conf"]
              env:
              - name: POD_IP
                valueFrom:
                  fieldRef:
                    fieldPath: status.podIP
              volumeMounts:
              - name: conf
                mountPath: /conf
                readOnly: false
              - name: data
                mountPath: /data
                readOnly: false
            volumes:
            - name: conf
              configMap:
                name: redis-cluster
                defaultMode: 0755
        volumeClaimTemplates:
        - metadata:
            name: data
          spec:
            accessModes: [ "ReadWriteOnce" ]
            resources:
              requests:
                storage: 1Gi
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: redis-cluster
      spec:
        type: ClusterIP
        ports:
        - port: 6379
          targetPort: 6379
          name: client
        - port: 16379
          targetPort: 16379
          name: gossip
        selector:
          app: redis-cluster
      

      下一步是运行此脚本以形成集群(您必须以交互方式输入一次“yes”):

      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 ')
      for x in $(seq 0 5); do echo "redis-cluster-$x"; kubectl exec redis-cluster-$x -- redis-cli role; echo; done
      

      【讨论】:

        猜你喜欢
        • 2020-03-26
        • 1970-01-01
        • 1970-01-01
        • 2011-01-09
        • 2022-06-13
        • 2021-01-13
        • 1970-01-01
        • 2018-07-12
        • 1970-01-01
        相关资源
        最近更新 更多