Redis, кажется, удаляет dump.rdb при запуске. Использование Kubernetes PVC и KubeDB. Почему это происходит?

Мы используем KubeDB в нашем кластере для управления нашими БД.

Итак, Redis развертывается через объект KubeDB Redis, и KubeDB прикрепляет PVC к модулю Redis.

К сожалению, KubeDB не поддерживает восстановление или резервное копирование дампов Redis (пока).

Для резервного копирования наше решение состоит в том, чтобы запустить CronJob, который копирует dump.rdb из модуля Redis в модуль заданий, а затем загружает его на S3.

Для восстановления дампа хотел сделать то же самое, только наоборот. Создайте временный модуль, который загружает резервную копию S3, а затем копирует ее в модуль Redis в папку dump.rdb.

redis.conf выглядит так:

....
# The filename where to dump the DB
dbfilename dump.rdb

# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir /data
....

Копирование работает. dump.rdb находится в правильном месте с правильными разрешениями. Я проверил это, запустив второй сервер redis в модуле Redis, используя тот же файл redis.conf. dump.rdb загружается на сервер без проблем.

Однако, поскольку я не хочу вручную запускать второй сервер Redis, я перезапустил модуль Redis (с помощью kubectl delete pods), чтобы модуль забрал скопированный файл dump.rdb.

Каждый раз, когда я удаляю модуль, dump.rdb удаляется, а новый dump.rdb создается гораздо меньшего размера (93 байта).

Я не думаю, что это проблема с PVC, так как я создал несколько файлов, чтобы проверить, удаляются ли они. Они не. Только dump.rdb.

Почему это происходит? Я ожидаю, что Redis просто восстановит БД из dump.rdb, а не создаст новую.

РЕДАКТИРОВАТЬ: Да, размер dump.rdb составляет около 47 ГБ. Версия Redis — 4.0.11.


person Moritz Schmitz v. Hülst    schedule 28.06.2019    source источник
comment
Привет. Разработчик KubeDB здесь. Можете ли вы попробовать использовать dir /data/ (обратите внимание на / в конце) в файле redis.conf? Кроме того, как вы предоставили файл redis.conf в KubeDB?   -  person Emruz Hossain    schedule 28.06.2019
comment
Эй, мужик, спасибо за помощь. redis.conf монтируется как configSource.configMap.name: redis-configmap. Но я думаю, что мы уже обнаружили проблему... Redis автоматически сбрасывает текущие данные при shutdown. Таким образом, исправление заключается в перезапуске модуля kubectl exec redis-pod redis-cli SHUTDOWN NOSAVE.   -  person Moritz Schmitz v. Hülst    schedule 28.06.2019


Ответы (2)


Тааак, несколько часов спустя мой товарищ по команде вспомнил, что Redis выполняет сохранение для дампа при завершении работы.

Вместо удаления модуля с помощью kubectl delete pod теперь я изменил код для запуска SHUTDOWN NOSAVE с помощью redis-cli.

kubectl exec <redis-pod> -- /bin/bash -c 'redis-cli -a $(cat /usr/local/etc/redis/redis.conf | grep "requirepass " | sed -e "s/requirepass //g") SHUTDOWN NOSAVE'
person Moritz Schmitz v. Hülst    schedule 28.06.2019
comment
Это отлично работает для меня. Простое и быстрое решение. - person Jinsoo Heo; 06.01.2021

Восстановить Redis в Kubernetes AOF = yes:

Первое, что нужно сделать, это удалить развертывание redis с сервера kubernetes:

kubectl delete -f ./redis.yaml

Присоединиться к постоянному хранилищу Redis (PVC) в смонтированной файловой системе, это может быть GlusterFS — Volume, Azure Storage — File Share, корзина min.io S3.

Затем удалите текущий файл dump.rdb (если он есть) или переименуйте его в dump.rdb.old:

Скопируйте файл хорошей резервной копии dump.rdb и исправьте его разрешение:

chown 999:999 dump.rdb
chmod 644 dump.rdb

Следующая важная часть — отключить AOF, отредактировав файл redis.yaml, установив для appendonly значение no: Убедитесь, что для appendonlu установлено значение no:

  containers:
    - name: redis
      image: redis:5.0.4
      imagePullPolicy: Always
      args: ["--requirepass", "$(redis_pass)", "--appendonly", "no", "--save", "900", "1", "--save", "30", "1"]

Затем создайте развертывание Redis в kubernetes:

kubectl apply-f ./redis.yaml

Выполните следующую команду, чтобы создать новый файл appendonly.aof.

kubectl exec redis-0 -- redis-cli -a <redis-secret> bgrewriteaof

Проверьте прогресс (0 - выполнено, 1 - еще нет), и если существует новый файл appendonly.aof того же размера, что и dump.rdb

kubectl exec redis-0 -- redis-cli -a <redis-secret> info | grep aof_rewrite_in_progress

Вы должны увидеть новый файл appendonly.aof. Затем заново создайте сервер redis: после завершения снова включите AOF, изменив файл redis.yaml на yes.

  containers:
    - name: redis
      image: redis:5.0.4
      imagePullPolicy: Always
      args: ["--requirepass", "$(redis_pass)", "--appendonly", "yes", "--save", "900", "1", "--save", "30", "1"]

Затем снова создайте сервер Redis:

kubectl delete-f ./redis.yaml
kubectl apply-f ./redis.yaml

Восстановление завершено.

Если у вас есть Linux с установленным сервисом Redis, воспользуйтесь этой инструкцией: https://community.pivotal.io/s/article/How-to-Backup-and-Restore-Open-Source-Redis?language=en_US

person rafalkasa    schedule 18.11.2020