Как сделать надежный, масштабируемый Redis в Kubernetes

Я много искал, как развернуть Redis с высокой доступностью в kubernetes. У меня есть некоторые проблемы с использованием режима кластера Redis, и при использовании режима ведущий-ведомый нам также нужно развернуть сторожевой, чтобы иметь возможность обрабатывать сбои главного устройства.

Я просматривал этот замечательный документ, который объясняет, как это сделать, но я думаю, что чего-то не хватает.

Я развернул то, что там упоминалось, но мне нужно было внести некоторые изменения, чтобы контейнеры дозорных работали в дозорном режиме, теперь основной манифест модуля redis-master, в котором есть основной мастер 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

теперь после всего, что у меня есть 2 проблемы

  • во-первых, этот документ создает службу только для часовых, поэтому я знаю, что должен сделать службу для Redis, но я даже не уверен, оба они являются мастерами или нет.

  • вторая проблема, предполагающая, что один является ведущим, а другой - подчиненным, когда происходит сбой, и часовой выбирает нового мастера, как сделать, чтобы этот новый мастер принадлежал службе мастеров Redis, а не подчиненной службе (потому что обычно мы делаем 2 службы один разоблачает господ, а другой — рабов)

ПРИМЕЧАНИЕ. пожалуйста, ознакомьтесь с упомянутым выше документом, чтобы хорошо понять мой вопрос.


person ElGenius    schedule 17.09.2019    source источник
comment
Я бы посоветовал вам использовать оператор Redis github.com/spotahome/redis-operator. У меня было много проблем с аварийным переключением как в режиме дозорного, так и в режиме кластера. Redis использует IP-адрес для связи между дозорным и ведущим/подчиненным узлом. После изменения IP-адреса узел будет потерян до тех пор, пока вы не сбросите дозорный кластер вручную, а IP-адрес модуля не станет эфемерным.   -  person Hang Du    schedule 17.09.2019


Ответы (2)


Это может быть очень поздно, но, насколько я понимаю, вы не запускаете службу для самого Redis. Вы запускаете репликацию сервисов Redis Sentinel, поэтому ваш клиент может подключиться к любому из них, чтобы запросить IP-адрес главного модуля Redis.

у каждого модуля с мастером есть дозорный, который разговаривает с дозорными службами. Обучение обновлению о статусе своего хозяина. поэтому всякий раз, когда происходит аварийное переключение, дозорный обновляет дозорный сервис, дозорные выбирают нового мастера и снова обновляют дозорные с этой информацией. поэтому всякий раз, когда клиент снова запрашивает sentinel, он получит новый IP-адрес мастера.

person shadowyman    schedule 23.04.2020

Лучшая реализация для REDIS+K8S, с которой я когда-либо сталкивался, — это это BITNAMI REDIS HELM

person user13424620    schedule 28.04.2020