Миграция базы данных из стороннего кластера Redis
Для миграции данных в Redis используется логический дамп — файл с набором команд, последовательное выполнение которых восстанавливает состояние баз данных в кластере. Его можно создать разными способами, далее для примера используется redis-dump-go
Примечание
Для миграции нельзя использовать бинарный дамп в формате RDB, т. к. Managed Service for Redis не предоставляет доступ к файловой системе на хостах кластера.
Чтобы мигрировать базы данных Redis из кластера-источника в кластер-приемник:
-
Подключитесь к кластеру-источнику и создайте логический дамп.
-
(Опционально) Загрузите дамп на промежуточную виртуальную машину.
Переносить данные с помощью виртуальной машины в Yandex Compute Cloud нужно, если:
- К вашему кластеру Managed Service for Redis нет доступа из интернета.
- Ваше оборудование или соединение с кластером в Yandex Cloud недостаточно надежны.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Подготовьте инфраструктуру
-
Создайте кластер Managed Service for Redis любой подходящей конфигурации. Для подключения к кластеру с локальной машины пользователя, а не из облачной сети Yandex Cloud, включите поддержку TLS и публичный доступ для хостов при создании кластера.
-
(Опционально) Создайте промежуточную виртуальную машину Linux в Yandex Compute Cloud в той же сети, что и кластер Managed Service for Redis в следующей конфигурации:
-
В блоке Образ загрузочного диска выберите образ Ubuntu 20.04.
-
В блоке Сетевые настройки:
- Публичный адрес —
Автоматически
. - Внутренний IPv4-адрес —
Автоматически
. - Группы безопасности — выберите ту же группу безопасности, что и для кластера Managed Service for Redis.
- Публичный адрес —
-
-
Если вы используете группы безопасности Virtual Private Cloud, настройте их.
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации для подходящего типа кластера:
- redis-cluster-non-sharded.tf
— для нешардированного кластера. - redis-cluster-sharded.tf
— для шардированного кластера.
В каждом файле описаны:
- сеть;
- подсеть;
- группа безопасности по умолчанию и правила, необходимые для подключения к кластеру и виртуальной машине;
- кластер Managed Service for Redis с публичным доступом из интернета;
- (опционально) виртуальная машина с публичным доступом из интернета.
- redis-cluster-non-sharded.tf
-
Укажите в файле конфигурации:
-
Пароль для доступа к кластеру Managed Service for Redis.
-
(Опционально) Параметры виртуальной машины:
- Идентификатор публичного образа виртуальной машины. Например, для Ubuntu 20.04 LTS.
- Логин и абсолютный путь к публичной части SSH-ключа, которые будут использоваться для доступа к виртуальной машине. По умолчанию в образе Ubuntu 20.04 LTS указанный логин игнорируется, вместо него создается пользователь с логином
ubuntu
. Используйте его для подключения к виртуальной машине.
-
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Установите дополнительное ПО
-
(Опционально) Установите на локальный компьютер утилиты для скачивания и загрузки файлов по протоколу SSH, например:
-
Убедитесь, что на кластере-источнике установлена утилита GNU Screen
.Создание и восстановление дампа могут занять длительное время. Чтобы эти процессы не прерывались при закрытии SSH-сессии по таймауту, запускайте их с помощью этой утилиты. Если при создании или восстановлении дампа SSH-соединение будет прервано, подключитесь повторно и восстановите состояние сессии с помощью команды:
screen -R
Подключитесь к кластеру-источнику и создайте логический дамп
-
Подключитесь к хосту-мастеру кластера-источника по SSH.
-
Загрузите архив с утилитой
redis-dump-go
со страницы проекта . Далее в примерах используется версия0.5.1
.wget https://github.com/yannh/redis-dump-go/releases/download/v0.5.1/redis-dump-go_0.5.1_linux_amd64.tar.gz
-
Распакуйте архив в текущий каталог:
tar xf redis-dump-go_0.5.1_linux_amd64.tar.gz
-
Изучите параметры запуска утилиты:
./redis-dump-go -h
-
Если для подключения к кластеру Redis нужен пароль, укажите его в значении переменной окружения
REDISDUMPGO_AUTH
:export REDISDUMPGO_AUTH="<пароль_Redis>"
-
Запустите интерактивную сессию
screen
:screen
-
Запустите процесс создания логического дампа:
./redis-dump-go \ -host <IP-адрес_или_FQDN_хоста-мастера_в_кластере_Redis> \ -port <порт_Redis> > <файл_дампа>
Совет
В процессе создания дампа на экран будет выводиться количество обработанных ключей. Запомните или запишите последнее выведенное значение, оно понадобится при проверке полноты восстановления дампа в кластере-приемнике.
-
Когда дамп будет создан, скачайте его на свой компьютер.
-
Завершите интерактивную сессию
screen
:exit
(Опционально) Загрузите дамп на промежуточную виртуальную машину
-
Загрузите дамп со своего компьютера на промежуточную виртуальную машину любым удобным способом.
Восстановите дамп в кластере-приемнике
-
Подключитесь к кластеру и запустите интерактивную сессию
screen
:screen
-
Запустите процесс восстановления дампа:
Подключение без TLSПодключение с TLSПеред подключением установите зависимости:
sudo apt update && sudo apt install -y redis-tools
Подключение с помощью Sentinel
host=$(redis-cli \ -h <FQDN_любого_хоста_Redis> \ -p 26379 \ sentinel \ get-master-addr-by-name \ no-shards-no-tls | head -n 1) redis-cli \ -h ${host} \ -p 6379 \ -a <пароль_кластера-приемника> \ --pipe < <файл_дампа>
Подключение напрямую к мастеру
redis-cli \ -h <FQDN_хоста-мастера> \ -p 6379 \ -a <пароль_кластера-приемника> \ --pipe < <файл_дампа>
При подключении к нешардированному кластеру вместо FQDN хоста-мастера можно использовать особые FQDN.
Подключение к шардированному кластеру
-
Создайте скрипт с командами загрузки дампа:
load-dump.sh
shards=('<FQDN_хоста-мастера_в_шарде_1>' \ ... '<FQDN_хоста-мастера_в_шарде_N>') for shard in "${shards[@]}" ; do redis-cli -h "${shard}" \ -p 6379 \ -a "<пароль_кластера-приемника>" \ --pipe < <файл_дампа> done
-
Запустите скрипт:
bash ./load-dump.sh
Во время работы скрипта будут выводиться сообщения об ошибках вставки данных. Это нормальное поведение команды
redis-cli
, связанное с тем, что в шардированном кластере каждый шард хранит только часть данных. Подробнее см. в разделе Шардирование в Managed Service for Redis.
Перед подключением установите зависимости:
Соберите утилиту
redis-tools
с поддержкой TLS одним из двух способов::-
Из репозитория
-
Подключите репозиторий:
sudo apt-add-repository ppa:redislabs/redis
Пакеты в этом репозитории уже собраны с флагом
BUILD_TLS=yes
. -
Установите утилиту:
sudo apt update && sudo apt install -y redis-tools
-
-
Вручную
Перейдите в директорию, куда хотите скачать дистрибутив. Скачайте стабильную версию утилиты и выполните сборку и установку:
wget https://download.redis.io/redis-stable.tar.gz && \ tar -xzvf redis-stable.tar.gz && \ cd redis-stable && \ make BUILD_TLS=yes && \ sudo make install && \ sudo cp ./src/redis-cli /usr/bin/
Подключение с помощью Sentinel
host=$(redis-cli \ -h <FQDN_любого_хоста_Redis> \ -p 26379 \ sentinel \ get-master-addr-by-name \ no-shards-tls | head -n 1) redis-cli \ -h ${host} \ -p 6380 \ -a <пароль_кластера-приемника> \ --tls \ --cacert ~/.redis/YandexInternalRootCA.crt \ --pipe < <файл_дампа>
Подключение напрямую к мастеру
redis-cli \ -h c-<идентификатор_кластера>.rw.mdb.yandexcloud.net \ -p 6380 \ -a <пароль_кластера-приемника> \ --tls \ --cacert ~/.redis/YandexInternalRootCA.crt \ --pipe < <файл_дампа>
При подключении к нешардированному кластеру вместо FQDN хоста-мастера можно использовать особые FQDN.
Подключение к шардированному кластеру
-
Создайте скрипт с командами загрузки дампа:
load-dump.sh
shards=('<FQDN_хоста-мастера_в_шарде_1>' \ ... '<FQDN_хоста-мастера_в_шарде_N>') for shard in "${shards[@]}" ; do redis-cli -h "${shard}" \ -p 6380 \ -a "<пароль_кластера-приемника>" \ --tls \ --cacert ~/.redis/YandexInternalRootCA.crt \ --pipe < <файл_дампа> done
-
Запустите скрипт:
bash ./load-dump.sh
Во время работы скрипта будут выводиться сообщения об ошибках вставки данных. Это нормальное поведение команды
redis-cli
, связанное с тем, что в шардированном кластере каждый шард хранит только часть данных. Подробнее см. в разделе Шардирование в Managed Service for Redis.
-
-
Завершите интерактивную сессию
screen
:exit
Убедитесь, что дамп полностью восстановлен
- В консоли управления
перейдите в каталог, где нужно восстановить кластер. - В списке сервисов выберите Managed Service for Redis.
- Нажмите на имя нужного кластера и выберите вкладку Мониторинг.
Обратите внимание на график DB Keys, отображающий количество ключей, хранящихся в кластере. Если кластер шардированный, на графике будет выводиться количество ключей в каждом шарде. В этом случае количество ключей в кластере равно суммарному количеству ключей в шардах.
Общее количество ключей в кластере должно совпадать с числом ключей, обработанных утилитой redis-dump-go
при создании дампа.
Удалите созданные ресурсы
Удалите ресурсы, которые вы больше не будете использовать, чтобы за них не списывалась плата:
- Удалите кластер Yandex Managed Service for Redis.
- Если вы создавали промежуточную виртуальную машину, удалите ее.
- Если вы зарезервировали публичные статические IP-адреса, освободите и удалите их.
Чтобы удалить инфраструктуру, созданную с помощью Terraform:
-
В терминале перейдите в директорию с планом инфраструктуры.
-
Удалите конфигурационный файл (
redis-cluster-non-sharded.tf
илиredis-cluster-sharded.tf
). -
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Подтвердите изменение ресурсов.
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
Все ресурсы, которые были описаны в конфигурационном файле, будут удалены.
-