【问题标题】:How to make reliable, scalable redis on Kubernetes如何在 Kubernetes 上制作可靠、可扩展的 redis
【发布时间】:2019-09-17 03:27:21
【问题描述】:

我一直在寻找如何在 kubernetes 上部署具有高可用性的 redis。 我在使用 redis 集群模式时遇到了一些问题 并且在使用主从模式时,我们还需要部署哨兵来处理主故障

我一直在查看 this 很棒的文档,它解释了如何做到这一点,但是我认为缺少一些东西。

我已经部署了那里提到的内容,但是,我需要对哨兵容器进行一些更改才能在哨兵模式下运行,现在主 redis-master pod 清单具有主 redis 主节点,哨兵看起来像这样。

# redis-master.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    name: redis
    redis-sentinel: "true"
    role: master
  name: redis-master
spec:
  containers:
    - name: master
      image: redis
      env:
        - name: MASTER
          value: "true"
      ports:
        - containerPort: 6379
      resources:
        limits:
          cpu: "0.1"
      volumeMounts:
        - mountPath: /redis-master-data
          name: data
    - name: sentinel
      image: redis
      command:
        - redis-sentinel
        - "/redis-master-data/redis.conf"
      env:
        - name: SENTINEL
          value: "true"
      ports:
        - containerPort: 26379
      volumeMounts:
        - mountPath: /redis-master-data
          name: data
        - mountPath: /redis-master
          name: config
  initContainers:
  - name: copy
    image: redis
    command: ["bash", "-c", "cp /redis-master/redis.conf /redis-master-data/"]
    volumeMounts:
    - mountPath: /redis-master
      name: config
    - mountPath: /redis-master-data
      name: data
  volumes:
    - name: data
      emptyDir: {}
    - name: config
      configMap:
        name: example-redis-config
        items: 
        - key: redis-config
          path: redis.conf

毕竟我有两个问题

  • 首先这个文档只为哨兵提供服务,所以我知道我应该为 redis 提供服务,但我什至不确定它们是否都是主人。

  • 第二个问题假设一个是master,另一个是slave,当发生故障并且哨兵选择一个新的master时 如何使新的主服务器属于 redis 主服务器的服务而不是从服务(因为通常我们会创建 2 个服务,一个暴露主服务器,另一个用于从服务器)

注意: 请查看上述文档以更好地理解我的问题。

【问题讨论】:

  • 我建议你使用redis操作符github.com/spotahome/redis-operator。我在哨兵模式和集群模式下都遇到了很多故障转移问题。 Redis 使用 ip 地址在哨兵和主/从节点之间进行通信。一旦发生 ip 更改,该节点将丢失,直到您手动重置哨兵集群并且 pod 的 ip 地址是临时的。

标签: kubernetes redis high-availability fault-tolerance


【解决方案1】:

这可能已经很晚了,但据我了解,您并没有为 redis 本身运行服务。您正在运行 redis 哨兵服务的复制,因此您的客户端可以连接到其中任何一个以查询主 redis pod 的 IP 地址。

每个带有 master 的 pod 都有一个与哨兵服务对话的哨兵。学习更新他们的主人的状态。因此,每当发生故障转移时,哨兵更新哨兵服务,哨兵选择一个新的主服务器并再次使用此信息更新哨兵。所以每当客户端再次查询 sentinel 时,都会得到新的 master 的 ip 地址。

【讨论】:

    【解决方案2】:

    到目前为止,我遇到的 REDIS+K8S 的最佳实现是 - this BITNAMI REDIS HELM

    【讨论】:

    • 不太稳定,小心。
    猜你喜欢
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2012-01-13
    • 2010-10-14
    • 2013-06-12
    • 2021-01-07
    • 2023-03-20
    相关资源
    最近更新 更多