Redis - избежать потери данных с помощью кластера (используя протокол Gossip) - PullRequest
0 голосов
/ 29 августа 2018

Мы хотели бы развернуть приложение Airflow в Kubernetes в 2 дата-центрах.

Контейнер воздушного потока Schedular генерирует DAG за каждые 1, 5 и 10 минут. Эти группы доступности баз данных - это задачи, которые будут назначены контейнеру Airflow Worker.

В процессе назначения задач сотруднику Airflow Airflow Schedular отправляет данные о задачах как в MariaDb (может рассматриваться как источник правды), так и в Redis.

В задании MariaDB может быть один из статусов 'queued', 'running', 'success', 'failed'. Когда задачи находятся в Redis, они будут в состоянии 'queued'.

MariaDB поддерживает то же самое, когда получает задачи от Airflow Schedular. когда Redis передает определенную поставленную в очередь задачу в рабочий контейнер, MariaDB меняет статус конкретной задачи на «выполняется», и если он завершает выполнение процесса, статус задачи в MariaDB изменится на «Успех».

Актуальная проблема:

При сбое Redis у нас есть задачи в очереди MariaDB, но мы потеряем данные в Redis. Когда k8s запускает новый сервер Redis, он теряет предыдущие задачи - здесь наступает DATA LOSS .

Что может быть решением для этого.

Можем ли мы использовать Redis Clustering - Gossip protocol, чтобы избежать потери данных:

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

1 Ответ

0 голосов
/ 29 августа 2018

Кластеризация Redis поможет с этим, но это немного затрудняет настройку и не является полной заменой резервных копий.

В вашем случае, на мой взгляд, гораздо более простым решением было бы включить процедуру восстановления в ваш запуск Redis pod. У вас нет постоянной потери данных, так как у вас есть источник правды MariaDB, поэтому вы можете добавить контейнер init, который запускает скрипт для восстановления данных redis из MariaDB.

Другим подходом, который значительно ограничил бы вашу проблему, было бы использование постоянного тома для хранения данных redis, так как redis может снимать состояние в памяти через равные промежутки времени. При использовании StatefulSet вместо Deployment для управления модулями узла (ов) Redis хранилище будет повторно подключено при перезапуске / перепланировании, и вы не потеряете данные (или самое большее крошечное окно с момента последнего снимка)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...