Kubernetes 上的 Redis 主/从复制,实现超低延迟

Posted

技术标签:

【中文标题】Kubernetes 上的 Redis 主/从复制,实现超低延迟【英文标题】:Redis master/slave replication on Kubernetes for ultra-low latency 【发布时间】:2022-01-23 20:55:32 【问题描述】:

图表总是比最后一句话更好,所以这是我想做的:

总结一下:

我想在我的 K8S 集群外部(或内部,这里不相关)有一个 Redis 主实例 我想要一个 Redis 从属实例每个节点复制主实例 我希望在删除节点时,Redis 从属 Pod 会从主 Pod 中注销 我希望在添加节点的时候,在节点上添加一个Redis slave pod并注册到master上 我希望一个节点中的所有 Pod 只消耗本地 Redis 从站的数据(我认为是简单的部分)

我为什么想要这样的架构?

我想利用 Redis 主/从复制来避免自己处理缓存失效 我希望对 Redis 缓存进行超低延迟调用,因此每个节点拥有一个从属设备是我能获得的最佳效果(在本地主机网络上调用)

是否可以自动化此类部署,例如使用 Helm?是否有文档资源来制作具有干净的动态主/从绑定/解除绑定的架构?

最重要的是,这种架构是我想做的一个好主意吗?有没有比这更快的替代方案?

【问题讨论】:

使用额外的内存缓存层怎么样?我知道您提到您不想处理缓存失效等问题,但根据用例,它可能是有意义的。很可能您已经考虑过这一点,但想提一下,因为将 redis slave 与应用程序 pod 一起扩展似乎成本太高,而且仍然意味着网络开销(即使超过 localhost)。 【参考方案1】:

我记得我们之前讨论过这个话题here,不用担心在这里添加更多内容。

阅读有关 Redis helm 图表的更多信息:https://github.com/bitnami/charts/tree/master/bitnami/redis#choose-between-redis-helm-chart-and-redis-cluster-helm-chart

您还应该问我的应用程序将如何的问题 不使用 Redis 服务连接到同一个 Node 上的 POD。

为此,您可以使用`环境变量并将它们公开给应用程序 POD

类似:

env:
- name: HOST_IP
  valueFrom:
    fieldRef:
      fieldPath: status.hostIP

它将为您提供运行 PODNode IP 的值,然后您可以使用该 IP 连接到 DeamonSet (如果您正在运行,则为 Redis 从站)。

您可以阅读更多内容:https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/

是否可以自动化此类部署,例如使用 Helm?

是的,您可以编写自己的 Helm 图表并部署生成的 YAML 清单。

最重要的是,这个架构是我想要的一个好主意吗 做?有没有比这更快的替代方案?

如果您认为这是个好主意,根据我的考虑,这可能会导致 $$$ 问题和更高的集群资源使用率。

如果您在每个节点上运行 200 个节点,您将运行 Redis 的从属节点会怎样?这可能会消耗每个节点上的资源并增加您的基础设施的成本。

如果您计划进行特定部署

您的上述建议也不错,但是,如果您打算将 Redisonly Specific deployment 一起使用,您可以使用sidecar 模式也可以使用配置将多个 Redis 连接在一起。

apiVersion: v1
kind: Service
metadata:
  name: web
  labels:
    app: web
spec:
  ports:
  - port: 80
    name: redis
    targetPort: 5000
  selector:
    app: web
  type: LoadBalancer    
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: web
  replicas: 3
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: redis
        image: redis
        ports:
          - containerPort: 6379
            name: redis
            protocol: TCP        
      - name: web-app
        image: web-app
        env:       
          - name: "REDIS_HOST"
            value: "localhost"

【讨论】:

以上是关于Kubernetes 上的 Redis 主/从复制,实现超低延迟的主要内容,如果未能解决你的问题,请参考以下文章

Redis主从复制

关于redis主从复制过程

redis (主从复制 哨兵模式 群集模式)

深入学习Redis主从复制

Redis(主从复制哨兵模式集群)概述及部署

redis-sentinel主从复制高可用