[Документация Yandex Cloud](../../index.md) > [Практические руководства](../index.md) > [Построение Data Platform](index.md) > Миграция БД из стороннего кластера Valkey™ в Yandex Managed Service for Valkey™

# Миграция базы данных из стороннего кластера Valkey™ в Yandex Managed Service for Valkey™

{% note info %}

В [регионе Казахстан](../../overview/concepts/region.md) доступна только [зона доступности](../../overview/concepts/geo-scope.md) `kz1-a`.

{% endnote %}

# Миграция базы данных из стороннего кластера Valkey™ в Yandex Managed Service for Valkey™

{% note info %}

В [регионе Казахстан](../../overview/concepts/region.md) доступна только [зона доступности](../../overview/concepts/geo-scope.md) `kz1-a`.

{% endnote %}

Для миграции данных в Valkey™ используется _логический дамп_ — файл с набором команд, последовательное выполнение которых восстанавливает состояние баз данных в кластере. Его можно создать разными способами, далее для примера используется [redis-dump-go](https://github.com/yannh/redis-dump-go/).

{% note info %}

Для миграции нельзя использовать бинарный дамп в формате RDB, т. к. Yandex Managed Service for Valkey™ не предоставляет доступ к файловой системе на хостах кластера.

{% endnote %}

Чтобы мигрировать базы данных Valkey™ из _кластера-источника_ в _кластер-приемник_:

1. [Подключитесь к кластеру-источнику и создайте логический дамп](#create-dump).
1. (Опционально) [Загрузите дамп на промежуточную виртуальную машину](#load-vm).

    Переносить данные с помощью виртуальной машины в Yandex Compute Cloud нужно, если:

    * К вашему кластеру Yandex Managed Service for Valkey™ нет доступа из интернета.
    * Ваше оборудование или соединение с кластером в Yandex Cloud недостаточно надежны.

1. [Восстановите дамп в кластере-приемнике](#restore-dump).
1. [Убедитесь, что дамп полностью восстановлен](#check-data).

Если созданные ресурсы вам больше не нужны, [удалите их](#clear-out).


## Необходимые платные ресурсы {#paid-resources}

* Кластер-приемник Yandex Managed Service for Valkey™: использование выделенных хостам вычислительных ресурсов, объем хранилища и резервных копий ([тарифы Valkey™](../../managed-valkey/pricing.md)).
* Публичные IP-адреса, если для хостов кластера включен публичный доступ ([тарифы Virtual Private Cloud](../../vpc/pricing.md)).
* Виртуальная машина, если она создана для загрузки дампа: использование вычислительных ресурсов, хранилища, публичного IP-адреса и операционной системы ([тарифы Compute Cloud](../../compute/pricing.md)).


## Перед началом работы {#before-you-begin}

### Подготовьте инфраструктуру {#deploy-infrastructure}

{% list tabs group=instructions %}

- Вручную {#manual}

    1. [Создайте кластер](../../managed-valkey/operations/cluster-create.md) Yandex Managed Service for Valkey™ любой подходящей конфигурации. Для подключения к кластеру с локальной машины пользователя, а не из облачной сети Yandex Cloud, включите поддержку TLS и публичный доступ для хостов при создании кластера.

        {% note info %}
        
        Публичный доступ к хостам кластера нужен, если вы планируете подключаться к кластеру через интернет. Этот вариант подключения более простой, и его рекомендуется использовать для прохождения руководства. К хостам без публичного доступа тоже можно подключиться, но только с виртуальных машин Yandex Cloud, расположенных в той же облачной сети, что и кластер.
        
        {% endnote %}

    1. (Опционально) [Создайте промежуточную виртуальную машину Linux](../../compute/operations/vm-create/create-linux-vm.md) в Yandex Compute Cloud в той же сети, что и кластер Yandex Managed Service for Valkey™ в следующей конфигурации:

        * В блоке **Образ загрузочного диска** выберите образ [Ubuntu 20.04](https://yandex.cloud/ru-kz/marketplace/products/yc/ubuntu-20-04-lts).
        * В блоке **Сетевые настройки**:

            * **Публичный IP-адрес** — `Автоматически`.
            * **Внутренний IPv4-адрес** — `Автоматически`.
            * **Группы безопасности** — выберите ту же группу безопасности, что и для кластера Yandex Managed Service for Valkey™.

    
    1. Если вы используете группы безопасности Virtual Private Cloud, [настройте их](../../managed-valkey/operations/connect/index.md#configuring-security-groups).


- Terraform {#tf}

    1. Если у вас еще нет Terraform, [установите его](../infrastructure-management/terraform-quickstart.md#install-terraform).
    1. [Получите данные для аутентификации](../infrastructure-management/terraform-quickstart.md#get-credentials). Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
    1. [Настройте и инициализируйте провайдер](../infrastructure-management/terraform-quickstart.md#configure-provider). Чтобы не создавать конфигурационный файл с настройками провайдера вручную, [скачайте его](https://github.com/yandex-cloud-examples/yc-terraform-provider-settings/blob/main/provider.tf).
    1. Поместите конфигурационный файл в отдельную рабочую директорию и [укажите значения параметров](../infrastructure-management/terraform-quickstart.md#configure-provider). Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.

    1. Скачайте в ту же рабочую директорию файл конфигурации для подходящего типа кластера:

        * [redis-cluster-non-sharded.tf](https://github.com/yandex-cloud-examples/yc-redis-data-migration-from-on-premise/blob/main/redis-cluster-non-sharded.tf) — для нешардированного кластера.
        * [redis-cluster-sharded.tf](https://github.com/yandex-cloud-examples/yc-redis-data-migration-from-on-premise/blob/main/redis-cluster-sharded.tf) — для [шардированного](../../managed-valkey/concepts/sharding.md) кластера.

        В каждом файле описаны:

        * сеть;
        * подсеть;
        * группа безопасности по умолчанию и правила, необходимые для подключения к кластеру и виртуальной машине;
        * кластер Yandex Managed Service for Valkey™ с публичным доступом из интернета;
        * (опционально) виртуальная машина с публичным доступом из интернета.

    1. Укажите в файле конфигурации:

        * Пароль для доступа к кластеру Yandex Managed Service for Valkey™.
        * (Опционально) Параметры виртуальной машины:

            * Идентификатор публичного [образа](../../compute/operations/images-with-pre-installed-software/get-list.md) виртуальной машины. Например, для [Ubuntu 20.04 LTS](https://yandex.cloud/ru-kz/marketplace/products/yc/ubuntu-20-04-lts).
            * Логин и абсолютный путь к [публичной части SSH-ключа](../../compute/operations/vm-connect/ssh.md#creating-ssh-keys), которые будут использоваться для доступа к виртуальной машине. По умолчанию в образе [Ubuntu 20.04 LTS](https://yandex.cloud/ru-kz/marketplace/products/yc/ubuntu-20-04-lts) указанный логин игнорируется, вместо него создается пользователь с логином `ubuntu`. Используйте его для подключения к виртуальной машине.

    1. Проверьте корректность файлов конфигурации Terraform с помощью команды:

        ```bash
        terraform validate
        ```

        Если в файлах конфигурации есть ошибки, Terraform на них укажет.

    1. Создайте необходимую инфраструктуру:

        1. Выполните команду для просмотра планируемых изменений:
        
           ```bash
           terraform plan
           ```
        
           Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
        
        1. Если вас устраивают планируемые изменения, внесите их:
           1. Выполните команду:
        
              ```bash
              terraform apply
              ```
        
           1. Подтвердите изменение ресурсов.
           1. Дождитесь завершения операции.

        В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в [консоли управления](https://kz.console.yandex.cloud).

{% endlist %}

### Установите дополнительное ПО {#install-extra-software}

1. (Опционально) Установите на локальный компьютер утилиты для скачивания и загрузки файлов по протоколу [SSH](../../glossary/ssh-keygen.md), например:

    * [WinSCP](https://winscp.net/eng/docs/lang:ru)
    * [Putty SCP](https://www.putty.org/)

1. Убедитесь, что на кластере-источнике установлена утилита [GNU Screen](https://www.gnu.org/software/screen/).

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

    ```bash
    screen -R
    ```

## Подключитесь к кластеру-источнику и создайте логический дамп {#create-dump}

1. Подключитесь к хосту-мастеру кластера-источника по SSH.
1. Загрузите архив с утилитой `redis-dump-go` со [страницы проекта](https://github.com/yannh/redis-dump-go/releases). Далее в примерах используется версия `0.5.1`.

    ```bash
    wget https://github.com/yannh/redis-dump-go/releases/download/v0.5.1/redis-dump-go_0.5.1_linux_amd64.tar.gz
    ```

1. Распакуйте архив в текущий каталог:

    ```bash
    tar xf redis-dump-go_0.5.1_linux_amd64.tar.gz
    ```

1. Изучите параметры запуска утилиты:

    ```bash
    ./redis-dump-go -h
    ```

1. Если для подключения к кластеру Valkey™ нужен пароль, укажите его в значении переменной окружения `REDISDUMPGO_AUTH`:

    ```bash
    export REDISDUMPGO_AUTH="<пароль_Valkey™>"
    ```

1. Запустите интерактивную сессию `screen`:

    ```bash
    screen
    ```

1. Запустите процесс создания логического дампа:

    ```bash
    ./redis-dump-go \
        -host <IP-адрес_или_FQDN_хоста-мастера_в_кластере_Valkey™> \
        -port <порт_Valkey™> > <файл_дампа>
    ```

    {% note tip %}

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

    {% endnote %}

1. Когда дамп будет создан, скачайте его на свой компьютер.

1. Завершите интерактивную сессию `screen`:

    ```bash
    exit
    ```

## (Опционально) Загрузите дамп на промежуточную виртуальную машину {#load-vm}


1. [Подключитесь к промежуточной виртуальной машине по SSH](../../compute/operations/vm-connect/ssh.md).


1. Загрузите дамп со своего компьютера на промежуточную виртуальную машину любым удобным способом.

## Восстановите дамп в кластере-приемнике {#restore-dump}

1. [Подключитесь к кластеру](../../managed-valkey/operations/connect/index.md) и запустите интерактивную сессию `screen`:

    ```bash
    screen
    ```

1. Запустите процесс восстановления дампа:

    {% list tabs group=connection %}

    - Подключение без TLS {#without-tls}

        **Перед подключением установите зависимости:**
        
        ```bash
        sudo apt update && sudo apt install -y redis-tools
        ```

        **Подключение с помощью Sentinel**

        ```bash
        host=$(redis-cli \
          -h <FQDN_любого_хоста_Valkey™> \
          -p 26379 \
          sentinel \
          get-master-addr-by-name \
          no-shards-no-tls | head -n 1)
        redis-cli \
          -h ${host} \
          -p 6379 \
          -a <пароль_кластера-приемника> \
          --pipe < <файл_дампа>
        ```

        **Подключение напрямую к мастеру**

        ```bash
        redis-cli \
          -h <FQDN_хоста-мастера> \
          -p 6379 \
          -a <пароль_кластера-приемника> \
          --pipe < <файл_дампа>
        ```

        При подключении к нешардированному кластеру вместо FQDN хоста-мастера можно использовать [особые FQDN](../../managed-valkey/operations/connect/fqdn.md#special-fqdns).

        **Подключение к шардированному кластеру**

        1. Создайте скрипт с командами загрузки дампа:

            `load-dump.sh`

            ```bash
            shards=('<FQDN_хоста-мастера_в_шарде_1>' \
                    ...
                    '<FQDN_хоста-мастера_в_шарде_N>')

            for shard in "${shards[@]}" ; do
              redis-cli -h "${shard}" \
                        -p 6379 \
                        -a "<пароль_кластера-приемника>" \
                        --pipe < <файл_дампа>
            done
            ```

        1. Запустите скрипт:

            ```bash
            bash ./load-dump.sh
            ```

            Во время работы скрипта будут выводиться сообщения об ошибках вставки данных. Это нормальное поведение команды `redis-cli`, связанное с тем, что в шардированном кластере каждый шард хранит только часть данных. Подробнее в разделе [Шардирование в Yandex Managed Service for Valkey™](../../managed-valkey/concepts/sharding.md).

    - Подключение с TLS {#with-tls}

        **Перед подключением установите зависимости:**
        
        Соберите утилиту `redis-tools` с поддержкой TLS одним из двух способов:
        
        * **Из репозитория**
        
            1. Подключите репозиторий:
        
                ```bash
                sudo apt-add-repository ppa:redislabs/redis
                ```
        
                Пакеты в этом репозитории уже собраны с флагом `BUILD_TLS=yes`.
        
            1. Установите утилиту:
        
                ```bash
                sudo apt update && sudo apt install -y redis-tools
                ```
        
        * **Вручную**
        
            Перейдите в директорию, куда хотите скачать дистрибутив. Скачайте стабильную версию утилиты и выполните сборку и установку:
        
            ```bash
            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**

        ```bash
        host=$(redis-cli \
               -h <FQDN_любого_хоста_Valkey™> \
               -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 < <файл_дампа>
        ```

        **Подключение напрямую к мастеру**

        ```bash
        redis-cli \
            -h c-<идентификатор_кластера>.rw.mdb.yandexcloud.kz \
            -p 6380 \
            -a <пароль_кластера-приемника> \
            --tls \
            --cacert ~/.redis/YandexInternalRootCA.crt \
            --pipe < <файл_дампа>
        ```

        При подключении к нешардированному кластеру вместо FQDN хоста-мастера можно использовать [особые FQDN](../../managed-valkey/operations/connect/fqdn.md#special-fqdns).

        **Подключение к шардированному кластеру**

        1. Создайте скрипт с командами загрузки дампа:

            `load-dump.sh`

            ```bash
            shards=('<FQDN_хоста-мастера_в_шарде_1>' \
                    ...
                    '<FQDN_хоста-мастера_в_шарде_N>')

            for shard in "${shards[@]}" ; do
              redis-cli -h "${shard}" \
                        -p 6380 \
                        -a "<пароль_кластера-приемника>" \
                        --tls \
                        --cacert ~/.redis/YandexInternalRootCA.crt \
                        --pipe < <файл_дампа>
            done
            ```

        1. Запустите скрипт:

            ```bash
            bash ./load-dump.sh
            ```

            Во время работы скрипта будут выводиться сообщения об ошибках вставки данных. Это нормальное поведение команды `redis-cli`, связанное с тем, что в шардированном кластере каждый шард хранит только часть данных. Подробнее в разделе [Шардирование в Yandex Managed Service for Valkey™](../../managed-valkey/concepts/sharding.md).

        {% endcut %}

    {% endlist %}

1. Завершите интерактивную сессию `screen`:

    ```bash
    exit
    ```

## Убедитесь, что дамп полностью восстановлен {#check-data}

1. В [консоли управления](https://kz.console.yandex.cloud) выберите каталог, где нужно восстановить кластер.
1. Перейдите в сервис **Yandex Managed Service for&nbsp;Valkey™**.
1. Нажмите на имя нужного кластера и выберите вкладку [Мониторинг](../../managed-valkey/operations/monitoring.md).

Обратите внимание на график **DB Keys**, отображающий количество ключей, хранящихся в кластере. Если кластер [шардированный](../../managed-valkey/concepts/sharding.md), на графике будет выводиться количество ключей в каждом шарде. В этом случае количество ключей в кластере равно суммарному количеству ключей в шардах.

Общее количество ключей в кластере должно совпадать с числом ключей, обработанных утилитой `redis-dump-go` при создании дампа.

## Удалите созданные ресурсы {#clear-out}

Удалите ресурсы, которые вы больше не будете использовать, чтобы за них не списывалась плата:

{% list tabs group=instructions %}

- Вручную {#manual}

    * [Удалите кластер Yandex Managed Service for Valkey™](../../managed-valkey/operations/cluster-delete.md).
    * Если вы создавали промежуточную виртуальную машину, [удалите ее](../../compute/operations/vm-control/vm-delete.md).
    * Если вы зарезервировали публичные статические IP-адреса, освободите и [удалите их](../../vpc/operations/address-delete.md).

- Terraform {#tf}

    1. В терминале перейдите в директорию с планом инфраструктуры.
    
        {% note warning %}
    
        Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
    
        {% endnote %}
    
    1. Удалите ресурсы:
    
        1. Выполните команду:
    
            ```bash
            terraform destroy
            ```
    
        1. Подтвердите удаление ресурсов и дождитесь завершения операции.
    
        Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.

{% endlist %}