[Документация Yandex Cloud](../../index.md) > [Yandex Managed Service for Valkey™](../index.md) > [Пошаговые инструкции](index.md) > Кластеры > Миграция хостов в другую зону доступности

# Миграция хостов кластера Valkey™ в другую зону доступности


{% note info %}

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

{% endnote %}


Хосты кластера Yandex Managed Service for Valkey™ располагаются в [зонах доступности](../../overview/concepts/geo-scope.md) Yandex Cloud. Чтобы перенести хосты из одной зоны в другую, добавьте в кластер хосты, расположенные в целевой зоне доступности, и удалите хосты в первоначальной зоне доступности:

1. [Создайте подсеть](../../vpc/operations/subnet-create.md) в зоне доступности, в которую вы переносите хосты.
1. Если в кластере используется [класс хостов](../concepts/instance-types.md#available-flavors) b2.medium или b3-c1-m4, [измените его](update.md#change-resource-preset) на другой класс. Иначе вы не сможете добавить хост в кластер и выполнить миграцию.

   Кластер недоступен около пяти — семи минут после изменения класса хостов.

   Прежний класс можно будет вернуть после миграции.

1. Добавьте хост в кластер:

   {% list tabs group=instructions %}

   - Консоль управления {#console}

      1. Перейдите в сервис **Yandex Managed Service for&nbsp;Valkey™**.
      1. Нажмите на имя нужного кластера и перейдите на вкладку **Хосты**.
      1. Нажмите кнопку ![image](../../_assets/console-icons/plus.svg) **Создать хост**.
      1. Укажите параметры хоста:

         * Зону доступности, куда переносятся хосты.
         * Новую подсеть.
         * Выберите опцию **Публичный доступ**, если хост должен быть доступен извне Yandex Cloud.

      1. Нажмите **Сохранить**.

   - CLI {#cli}

      Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), [установите и инициализируйте его](../../cli/quickstart.md#install).

      По умолчанию используется каталог, указанный при [создании](../../cli/operations/profile/profile-create.md) профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду `yc config set folder-id <идентификатор_каталога>`. Также для любой команды вы можете указать другой каталог с помощью параметров `--folder-name` или `--folder-id`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

      Выполните команду:

      ```bash
      yc managed-redis host add \
         --cluster-name <имя_кластера> \
         --host zone-id=<зона_доступности>,`
               `subnet-id=<ID_новой_подсети>,`
               `assign-public-ip=<разрешить_публичный_доступ_к_хосту>
      ```

      Имя кластера можно получить со [списком кластеров в каталоге](cluster-list.md#list-clusters).

      В параметре `zone-id` укажите зону, куда вы переносите хосты.

   - Terraform {#tf}

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

         ```hcl
         resource "yandex_mdb_redis_cluster_v2" "<имя_кластера>" {
           ...
           hosts = {
             ...
             "<имя_нового_хоста>" = {
               zone             = "<зона_доступности>"
               subnet_id        = "<идентификатор_новой_подсети>"
               assign_public_ip = <разрешить_публичный_доступ_к_хосту>
             }
           }
         }
         ```

         В параметре `zone` укажите зону, куда вы переносите хосты.

      1. Проверьте корректность настроек.

         1. В командной строке перейдите в каталог, в котором расположены актуальные конфигурационные файлы Terraform с планом инфраструктуры.
         1. Выполните команду:
         
            ```bash
            terraform validate
            ```
         
            Если в файлах конфигурации есть ошибки, Terraform на них укажет.

      1. Подтвердите изменение ресурсов.

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

   - REST API {#api}

       1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:
       
           ```bash
           export IAM_TOKEN="<IAM-токен>"
           ```
       
       1. Воспользуйтесь методом [Cluster.AddHosts](../api-ref/Cluster/addHosts.md) и выполните запрос, например, с помощью [cURL](https://curl.se/):
       
           
           ```bash
           curl \
               --request POST \
               --header "Authorization: Bearer $IAM_TOKEN" \
               --header "Content-Type: application/json" \
               --url 'https://mdb.api.yandexcloud.kz/managed-redis/v1/clusters/<идентификатор_кластера>/hosts:batchCreate' \
               --data '{
                         "hostSpecs": [
                           {
                             "zoneId": "<зона_доступности>",
                             "subnetId": "<идентификатор_подсети>",
                             "shardName": "<имя_шарда>",
                             "replicaPriority": "<приоритет_хоста>",
                             "assignPublicIp": <разрешить_публичный_доступ_к_хосту>
                           }
                         ]
                       }'
           ```
       
       
           Где `hostSpecs` — параметры хоста:
       
           * `zoneId` — [зона доступности](../../overview/concepts/geo-scope.md).
           * `subnetId` — [идентификатор подсети](../../vpc/concepts/network.md#subnet). Необходимо указывать, если в выбранной зоне доступности создано две или больше подсетей.
           * `shardName` — имя шарда для хоста. Этот параметр используется, только если включено [шардирование кластера](../concepts/sharding.md).
           * `replicaPriority` — приоритет назначения хоста мастером при [выходе из строя основного мастера](../concepts/replication.md#master-failover).
           * `assignPublicIp` — доступность хоста из интернета по публичному IP-адресу: `true` или `false`. Включить публичный доступ можно, только если в кластере включена поддержка TLS.
       
           Идентификатор кластера можно запросить со [списком кластеров в каталоге](cluster-list.md#list-clusters).
       
       1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/Cluster/addHosts.md#yandex.cloud.operation.Operation).

   - gRPC API {#grpc-api}

       1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:
       
           ```bash
           export IAM_TOKEN="<IAM-токен>"
           ```
       
       1. Клонируйте репозиторий [cloudapi](https://github.com/yandex-cloud/cloudapi):
          
          ```bash
          cd ~/ && git clone --depth=1 https://github.com/yandex-cloud/cloudapi
          ```
          
          Далее предполагается, что содержимое репозитория находится в директории `~/cloudapi/`.
       
       1. Воспользуйтесь вызовом [ClusterService.AddHosts](../api-ref/grpc/Cluster/addHosts.md) и выполните запрос, например, с помощью [gRPCurl](https://github.com/fullstorydev/grpcurl):
       
           
           ```bash
           grpcurl \
               -format json \
               -import-path ~/cloudapi/ \
               -import-path ~/cloudapi/third_party/googleapis/ \
               -proto ~/cloudapi/yandex/cloud/mdb/redis/v1/cluster_service.proto \
               -rpc-header "Authorization: Bearer $IAM_TOKEN" \
               -d '{
                     "cluster_id": "<идентификатор_кластера>",
                     "host_specs": [
                       {
                         "zone_id": "<зона_доступности>",
                         "subnet_id": "<идентификатор_подсети>",
                         "shard_name": "<имя_шарда>",
                         "replica_priority": "<приоритет_хоста>",
                         "assign_public_ip": <разрешить_публичный_доступ_к_хосту>
                       }
                     ] 
                   }' \
               mdb.api.yandexcloud.kz:443 \
               yandex.cloud.mdb.redis.v1.ClusterService.AddHosts
           ```
       
       
           Где `host_specs` — параметры хоста:
       
           * `zone_id` — [зона доступности](../../overview/concepts/geo-scope.md).
           * `subnet_id` — [идентификатор подсети](../../vpc/concepts/network.md#subnet). Необходимо указывать, если в выбранной зоне доступности создано две или больше подсетей.
           * `shard_name` — имя шарда для хоста. Этот параметр используется, только если включено [шардирование кластера](../concepts/sharding.md).
           * `replica_priority` — приоритет назначения хоста мастером при [выходе из строя основного мастера](../concepts/replication.md#master-failover).
           * `assign_public_ip` — доступность хоста из интернета по публичному IP-адресу: `true` или `false`. Включить публичный доступ можно, только если в кластере включена поддержка TLS.
       
           Идентификатор кластера можно запросить со [списком кластеров в каталоге](cluster-list.md#list-clusters).
       
       1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/grpc/Cluster/addHosts.md#yandex.cloud.operation.Operation).

   {% endlist %}

1. Чтобы успешно выполнять подключение к базе данных после миграции, укажите FQDN нового хоста в вашем бэкенде или клиенте (например, в коде или графической IDE). Удалите FQDN прежнего хоста в первоначальной зоне.

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

   ```bash
   yc managed-redis host list --cluster-name <имя_кластера>
   ```

   FQDN указан в выводе команды, в столбце `NAME`.

1. Удалите хосты в первоначальной зоне доступности:

   {% list tabs group=instructions %}

   - Консоль управления {#console}

      1. Перейдите в сервис **Yandex Managed Service for&nbsp;Valkey™**.
      1. Нажмите на имя нужного кластера и выберите вкладку **Хосты**.
      1. Нажмите на значок ![image](../../_assets/console-icons/ellipsis.svg) в строке нужного хоста, выберите пункт **Удалить** и подтвердите удаление.

   - CLI {#cli}

      Выполните команду для каждого хоста:

      ```bash
      yc managed-redis host delete <FQDN_хоста> --cluster-name <имя_кластера>
      ```

   - Terraform {#tf}

      1. В конфигурационном файле Terraform с планом инфраструктуры удалите из блока `hosts` в описании кластера хосты с первоначальной зоной доступности.
      1. Проверьте корректность настроек.

         1. В командной строке перейдите в каталог, в котором расположены актуальные конфигурационные файлы Terraform с планом инфраструктуры.
         1. Выполните команду:
         
            ```bash
            terraform validate
            ```
         
            Если в файлах конфигурации есть ошибки, Terraform на них укажет.

      1. Введите слово `yes` и нажмите **Enter**.

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

   - REST API {#api}

       1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:
       
           ```bash
           export IAM_TOKEN="<IAM-токен>"
           ```
       
       1. Воспользуйтесь методом [Cluster.DeleteHosts](../api-ref/Cluster/deleteHosts.md) и выполните запрос, например, с помощью [cURL](https://curl.se/):
       
           ```bash
           curl \
               --request POST \
               --header "Authorization: Bearer $IAM_TOKEN" \
               --header "Content-Type: application/json" \
               --url 'https://mdb.api.yandexcloud.kz/managed-redis/v1/clusters/<идентификатор_кластера>/hosts:batchDelete' \
               --data '{
                         "hostNames": [ "<имя_хоста>" ]
                       }'
           ```
       
           Где `hostNames` — имя удаляемого хоста. Чтобы узнать имя, [получите список хостов в кластере](hosts.md#list).
       
           Идентификатор кластера можно запросить со [списком кластеров в каталоге](cluster-list.md#list-clusters).
       
       1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/Cluster/deleteHosts.md#yandex.cloud.operation.Operation).

   - gRPC API {#grpc-api}

       1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:
       
           ```bash
           export IAM_TOKEN="<IAM-токен>"
           ```
       
       1. Клонируйте репозиторий [cloudapi](https://github.com/yandex-cloud/cloudapi):
          
          ```bash
          cd ~/ && git clone --depth=1 https://github.com/yandex-cloud/cloudapi
          ```
          
          Далее предполагается, что содержимое репозитория находится в директории `~/cloudapi/`.
       
       1. Воспользуйтесь вызовом [ClusterService.DeleteHosts](../api-ref/grpc/Cluster/deleteHosts.md) и выполните запрос, например, с помощью [gRPCurl](https://github.com/fullstorydev/grpcurl):
       
           ```bash
           grpcurl \
               -format json \
               -import-path ~/cloudapi/ \
               -import-path ~/cloudapi/third_party/googleapis/ \
               -proto ~/cloudapi/yandex/cloud/mdb/redis/v1/cluster_service.proto \
               -rpc-header "Authorization: Bearer $IAM_TOKEN" \
               -d '{
                     "cluster_id": "<идентификатор_кластера>",
                     "host_names": [ "<имя_хоста>" ]
                   }' \
               mdb.api.yandexcloud.kz:443 \
               yandex.cloud.mdb.redis.v1.ClusterService.DeleteHosts
           ```
       
           Где `host_names` — имя удаляемого хоста. Чтобы узнать имя, [получите список хостов в кластере](hosts.md#list).
       
           Идентификатор кластера можно запросить со [списком кластеров в каталоге](cluster-list.md#list-clusters).
       
       1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/grpc/Cluster/deleteHosts.md#yandex.cloud.operation.Operation).

   {% endlist %}

1. Дождитесь, когда кластер перейдет в состояние **Alive**. В консоли управления перейдите на страницу каталога и выберите сервис **Yandex Managed Service for&nbsp;Valkey™**. Состояние кластера отображается в столбце **Доступность**.