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

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


{% note info %}

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

{% endnote %}


Хосты кластера Managed Service for Apache Kafka® располагаются в зонах доступности Yandex Cloud. Хосты Apache Kafka® можно перенести из одной зоны в другую. Процесс переноса различается для кластеров с одним и несколькими хостами.

{% note info %}

Для кластеров, хосты которых располагаются в [зоне доступности](../../overview/concepts/geo-scope.md) `kz1-d`, недоступно:

- использование платформы Intel Broadwell;
- хранилище на локальных SSD-дисках при использовании платформы Intel Cascade Lake.

{% endnote %}

Если кластер Managed Service for Apache Kafka® является эндпоинтом в сервисе Yandex Data Transfer, перезапустите трансфер для его корректной работы. Подробнее о том, какие трансферы нужно перезапускать и как это сделать, в разделе [Особенности миграции в сервисе Yandex Data Transfer](#data-transfer).

## Миграция кластера с одним хостом {#one-host}

Есть несколько способов провести миграцию:

* [Воспользоваться интерфейсами Yandex Cloud](#yandex-cloud-interfaces). В этом случае меняется зона доступности в конфигурации кластера. Создавать дополнительный кластер не нужно.

   Этот вариант проще в реализации, но во время миграции кластер будет простаивать, пока его зона доступности будет меняться. Это может занять несколько минут.

* [Воспользоваться вспомогательными инструментами](#auxiliary-instruments) MirrorMaker или Yandex Data Transfer. В этом случае создается новый кластер, в который переносятся данные из первоначального кластера.

   Этот вариант сложнее в реализации, так как требует создания и настройки инфраструктуры. Но он позволяет избежать простоя: вы можете поддерживать два кластера с актуальными данными, пока не удалите первоначальный кластер.

### Миграция кластера с одним хостом с помощью интерфейсов Yandex Cloud {#yandex-cloud-interfaces}

Чтобы в кластере Managed Service for Apache Kafka® перенести хост Apache Kafka® в другую зону доступности:

1. [Создайте подсеть](../../vpc/operations/subnet-create.md) в зоне доступности, в которую вы переносите кластер.
1. Если группа безопасности кластера настроена для подсети в зоне доступности, из которой переносится кластер, перенастройте группу для новой подсети. Для этого в правилах группы безопасности замените CIDR исходной подсети на CIDR новой подсети.
1. Измените зону доступности у кластера и его хоста Apache Kafka®:

   {% list tabs group=instructions %}

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

      1. В [консоли управления](https://kz.console.yandex.cloud) выберите каталог.
      1. [Перейдите](https://kz.console.yandex.cloud/link/managed-kafka) в сервис **Managed Service for&nbsp;Kafka**.
      1. В строке с нужным кластером нажмите на значок ![image](../../_assets/console-icons/ellipsis.svg), затем выберите ![image](../../_assets/console-icons/pencil.svg) **Редактировать**.
      1. В разделе **Сетевые настройки** укажите новую зону доступности.
      1. Укажите подсеть в новой зоне доступности, если в ней находится больше одной подсети.
      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`. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.

      Чтобы изменить зону доступности у кластера и его хоста Apache Kafka®, выполните команду:

      ```bash
      yc managed-kafka cluster update <имя_или_идентификатор_кластера> \
         --zone-ids <зона_доступности> \
         --subnet-ids <идентификатор_подсети>
      ```

      Если в новой зоне доступности находится только одна подсеть, параметр `--subnet-ids` указывать не обязательно.

   - Terraform {#tf}

      1. Откройте актуальный конфигурационный файл Terraform с планом инфраструктуры.

         Как создать такой файл, описано в разделе [Создание кластера Apache Kafka®](cluster-create.md).

      1. Укажите в описании кластера Managed Service for Apache Kafka® новую подсеть в параметре `subnet_ids` и новую зону доступности в параметре `zones`:

         ```hcl
         resource "yandex_mdb_kafka_cluster" "<имя_кластера>" {
           ...
           subnet_ids = ["<подсеть>"]
           config {
             ...
             zones = ["<зона_доступности>"]
           }
           ...
         }
         ```

         Если в новой зоне доступности находится только одна подсеть, параметр `subnet_ids` указывать не обязательно.

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

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

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

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

      Подробнее в [документации провайдера Terraform](../../terraform/resources/mdb_kafka_cluster.md).

      {% note warning "Ограничения по времени" %}
      
      Провайдер Terraform ограничивает время на выполнение всех операций с кластером Managed Service for Apache Kafka® 60 минутами.
      
      Операции, длящиеся дольше указанного времени, прерываются.
      
      {% cut "Как изменить эти ограничения?" %}
      
      Добавьте к описанию кластера блок `timeouts`, например:
      
      ```hcl
      resource "yandex_mdb_kafka_cluster" "<имя_кластера>" {
        ...
        timeouts {
          create = "1h30m" # Полтора часа
          update = "2h"    # 2 часа
          delete = "30m"   # 30 минут
        }
      }
      ```
      
      {% endcut %}
      
      {% endnote %}

   - REST API {#api}

       1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:

          ```bash
          export IAM_TOKEN="<IAM-токен>"
          ```

       1. Воспользуйтесь методом [Cluster.update](../api-ref/Cluster/update.md) и выполните запрос, например, с помощью [cURL](https://curl.se/):

          {% note warning %}
          
          Метод API переопределит все параметры изменяемого объекта, которые не были явно переданы в запросе, на значения по умолчанию. Чтобы избежать этого, перечислите настройки, которые вы хотите изменить, в параметре `updateMask` (одной строкой через запятую).
          
          {% endnote %}

          ```bash
          curl \
              --request PATCH \
              --header "Authorization: Bearer $IAM_TOKEN" \
              --header "Content-Type: application/json" \
              -url 'https://mdb.api.yandexcloud.kz/managed-kafka/v1/clusters/<идентификатор_кластера>' \
              --data '{
                        "updateMask": "configSpec.zoneId,subnetIds",
                        "subnetIds": [
                          "<подсеть>"
                        ]
                        "configSpec": {
                          "zoneId": [
                            "<зона_доступности>"
                          ]
                        }
                      }'
          ```

          Где:

          * `updateMask` — перечень изменяемых параметров в одну строку через запятую.

              Укажите нужные параметры:
              * `subnetIds` — если нужно изменить список подсетей.
              * `configSpec.zoneId` — если нужно изменить зону доступности.
          * `subnetIds` — массив строк. Каждая строка — идентификатор подсети. Если в новой зоне доступности находится только одна подсеть, параметр `subnetIds` указывать не обязательно.
          * `zoneId` — новая зона доступности кластера.

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

       1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/Cluster/update.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/Update](../api-ref/grpc/Cluster/update.md) и выполните запрос, например, с помощью [gRPCurl](https://github.com/fullstorydev/grpcurl):

            {% note warning %}
            
            Метод API переопределит все параметры изменяемого объекта, которые не были явно переданы в запросе, на значения по умолчанию. Чтобы избежать этого, перечислите настройки, которые вы хотите изменить, в параметре `update_mask` (в виде массива строк `paths[]`).
            
            {% cut "Формат перечисления настроек" %}
            
            ```yaml
            "update_mask": {
                "paths": [
                    "<настройка_1>",
                    "<настройка_2>",
                    ...
                    "<настройка_N>"
                ]
            }
            ```
            
            {% endcut %}
            
            {% endnote %}

            ```bash
            grpcurl \
                -format json \
                -import-path ~/cloudapi/ \
                -import-path ~/cloudapi/third_party/googleapis/ \
                -proto ~/cloudapi/yandex/cloud/mdb/kafka/v1/cluster_service.proto \
                -rpc-header "Authorization: Bearer $IAM_TOKEN" \
                -d '{
                      "cluster_id": "<идентификатор_кластера>",
                      "update_mask": {
                        "paths": [
                          "subnet_ids",
                          "config_spec.zone_id"
                        ]
                      },
                      "subnet_ids": [
                        "<подсеть>"
                      ]
                      "config_spec": {
                        "zone_id": [
                          "<зона_доступности>"
                        ]
                      }
                    }' \
                mdb.api.yandexcloud.kz:443 \
                yandex.cloud.mdb.kafka.v1.ClusterService.Update
            ```

            Где:

            * `update_mask` — перечень изменяемых параметров в виде массива строк `paths[]`.

               Укажите нужные параметры:
               * `subnet_ids` — если нужно изменить список подсетей.
               * `config_spec.zone_id` — если нужно изменить зону доступности.
            * `subnet_ids` — массив строк. Каждая строка — идентификатор подсети. Если в новой зоне доступности находится только одна подсеть, параметр `subnet_ids` указывать не обязательно.
            * `zone_id` — новая зона доступности кластера.

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

       1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/grpc/Cluster/update.md#yandex.cloud.operation.Operation).

   {% endlist %}

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

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

   {% list tabs group=instructions %}
   
   - Консоль управления {#console}
   
      1. В [консоли управления](https://kz.console.yandex.cloud) перейдите в нужный каталог.
      1. Перейдите в сервис **Managed Service for&nbsp;Kafka**.
      1. Нажмите на имя нужного кластера, затем выберите вкладку **Хосты**.
   
   - CLI {#cli}
   
      ```bash
      yc managed-kafka cluster list-hosts <имя_или_идентификатор_кластера>
      ```
   
      FQDN указан в выводе команды, в столбце `NAME`.
   
   - REST API {#api}
   
       1. Воспользуйтесь методом [Cluster.listHosts](../api-ref/Cluster/listHosts.md) и выполните запрос, например, с помощью [cURL](https://curl.se/):
   
           ```bash
           curl \
               --request GET \
               --header "Authorization: Bearer $IAM_TOKEN" \
               --url 'https://mdb.api.yandexcloud.kz/managed-kafka/v1/clusters/<идентификатор_кластера>/hosts'
           ```
   
           Идентификатор кластера можно запросить со [списком кластеров в каталоге](cluster-list.md#list-clusters).
   
       1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/Cluster/listHosts.md#yandex.cloud.mdb.kafka.v1.ListClusterHostsResponse). FQDN указан в ответе в поле `hosts[].name`.
   
   - gRPC API {#grpc-api}
   
       1. Воспользуйтесь вызовом [ClusterService/ListHosts](../api-ref/grpc/Cluster/listHosts.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/kafka/v1/cluster_service.proto \
               -rpc-header "Authorization: Bearer $IAM_TOKEN" \
               -d '{
                       "cluster_id": "<идентификатор_кластера>"
                   }' \
               mdb.api.yandexcloud.kz:443 \
               yandex.cloud.mdb.kafka.v1.ClusterService.ListHosts
           ```
   
           Идентификатор кластера можно запросить со [списком кластеров в каталоге](cluster-list.md#list-clusters).
   
       1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/grpc/Cluster/listHosts.md#yandex.cloud.mdb.kafka.v1.ListClusterHostsResponse). FQDN указан в ответе в поле `hosts[].name`.
   
   {% endlist %}

### Миграция кластера с одним хостом с помощью вспомогательных инструментов {#auxiliary-instruments}

Чтобы в кластере Managed Service for Apache Kafka® перенести хост Apache Kafka® в другую зону доступности:

1. [Создайте подсеть](../../vpc/operations/subnet-create.md) в зоне доступности, в которую вы переносите кластер.
1. Если группа безопасности кластера настроена для подсети в зоне доступности, из которой переносится кластер, перенастройте группу для новой подсети. Для этого в правилах группы безопасности замените CIDR исходной подсети на CIDR новой подсети.
1. [Создайте кластер](cluster-create.md) Managed Service for Apache Kafka®, конфигурация которого отличается от конфигурации первоначального кластера только подсетью и группой безопасности.
1. Перенесите данные из первоначального кластера в новый с помощью одного из двух инструментов:

   * [MirrorMaker](../tutorials/kafka-connectors.md) — подойдет как встроенный в Managed Service for Apache Kafka® MirrorMaker-коннектор, так и утилита MirrorMaker.
   * [Data Transfer](../../data-transfer/tutorials/mkf-to-mkf.md).

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

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

   {% list tabs group=instructions %}
   
   - Консоль управления {#console}
   
      1. В [консоли управления](https://kz.console.yandex.cloud) перейдите в нужный каталог.
      1. Перейдите в сервис **Managed Service for&nbsp;Kafka**.
      1. Нажмите на имя нужного кластера, затем выберите вкладку **Хосты**.
   
   - CLI {#cli}
   
      ```bash
      yc managed-kafka cluster list-hosts <имя_или_идентификатор_кластера>
      ```
   
      FQDN указан в выводе команды, в столбце `NAME`.
   
   - REST API {#api}
   
       1. Воспользуйтесь методом [Cluster.listHosts](../api-ref/Cluster/listHosts.md) и выполните запрос, например, с помощью [cURL](https://curl.se/):
   
           ```bash
           curl \
               --request GET \
               --header "Authorization: Bearer $IAM_TOKEN" \
               --url 'https://mdb.api.yandexcloud.kz/managed-kafka/v1/clusters/<идентификатор_кластера>/hosts'
           ```
   
           Идентификатор кластера можно запросить со [списком кластеров в каталоге](cluster-list.md#list-clusters).
   
       1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/Cluster/listHosts.md#yandex.cloud.mdb.kafka.v1.ListClusterHostsResponse). FQDN указан в ответе в поле `hosts[].name`.
   
   - gRPC API {#grpc-api}
   
       1. Воспользуйтесь вызовом [ClusterService/ListHosts](../api-ref/grpc/Cluster/listHosts.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/kafka/v1/cluster_service.proto \
               -rpc-header "Authorization: Bearer $IAM_TOKEN" \
               -d '{
                       "cluster_id": "<идентификатор_кластера>"
                   }' \
               mdb.api.yandexcloud.kz:443 \
               yandex.cloud.mdb.kafka.v1.ClusterService.ListHosts
           ```
   
           Идентификатор кластера можно запросить со [списком кластеров в каталоге](cluster-list.md#list-clusters).
   
       1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/grpc/Cluster/listHosts.md#yandex.cloud.mdb.kafka.v1.ListClusterHostsResponse). FQDN указан в ответе в поле `hosts[].name`.
   
   {% endlist %}

1. [Удалите первоначальный кластер](cluster-delete.md) Managed Service for Apache Kafka®.

## Миграция кластера с несколькими хостами {#multiple-hosts}

{% note info %}

В [кластерах с версией Apache Kafka® 3.6 или выше](../concepts/index.md#kraft) не используются хосты ZooKeeper. Миграция возможна только для конфигурации с тремя брокерами в одной зоне доступности.

{% endnote %}

Если создать кластер версии Apache Kafka® 3.5 из более чем одного хоста-брокера, в кластер автоматически добавляются три отдельных хоста ZooKeeper. Каждому из хостов назначается подсеть из разных зон доступности. После создания кластера для него нельзя сменить подсеть в зоне доступности.

Процесс миграции кластера версии Apache Kafka® 3.5 зависит от того, в каких зонах доступности располагаются хосты Apache Kafka® и ZooKeeper до миграции и сколько подсетей находится в каждой зоне доступности. Ознакомьтесь с частными случаями в [примерах](#examples), чтобы лучше понять особенности миграции.

Чтобы в кластере с версией Apache Kafka® 3.5 перенести хосты Apache Kafka® в другую зону доступности:

1. Узнайте, в каких зонах доступности располагаются хосты Apache Kafka® и ZooKeeper:

   {% list tabs group=instructions %}

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

      1. В [консоли управления](https://kz.console.yandex.cloud) выберите каталог.
      1. [Перейдите](https://kz.console.yandex.cloud/link/managed-kafka) в сервис **Managed Service for&nbsp;Kafka**.
      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-kafka cluster list-hosts <имя_или_идентификатор_кластера>
      ```

      Зона доступности указана в выводе команды, в столбце `ZONE ID`.

   - REST API {#api}

       1. [Получите IAM-токен для аутентификации в API](../api-ref/authentication.md) и поместите токен в переменную среды окружения:

           ```bash
           export IAM_TOKEN="<IAM-токен>"
           ```

       1. Воспользуйтесь методом [Cluster.listHosts](../api-ref/Cluster/listHosts.md) и выполните запрос, например, с помощью [cURL](https://curl.se/):

           ```bash
           curl \
               --request GET \
               --header "Authorization: Bearer $IAM_TOKEN" \
               --url 'https://mdb.api.yandexcloud.kz/managed-kafka/v1/clusters/<идентификатор_кластера>/hosts'
           ```

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

       1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/Cluster/listHosts.md#yandex.cloud.mdb.kafka.v1.ListClusterHostsResponse). Зона доступности указана в ответе в поле `hosts[].zoneId`.

   - 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/ListHosts](../api-ref/grpc/Cluster/listHosts.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/kafka/v1/cluster_service.proto \
               -rpc-header "Authorization: Bearer $IAM_TOKEN" \
               -d '{
                       "cluster_id": "<идентификатор_кластера>"
                   }' \
               mdb.api.yandexcloud.kz:443 \
               yandex.cloud.mdb.kafka.v1.ClusterService.ListHosts
           ```

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

       1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/grpc/Cluster/listHosts.md#yandex.cloud.mdb.kafka.v1.ListClusterHostsResponse). Зона доступности указана в ответе в поле `hosts[].zone_id`.

   {% endlist %}

1. Если в списке нет целевой зоны доступности, куда вы переносите хосты Apache Kafka®, [создайте подсеть](../../vpc/operations/subnet-create.md) в этой зоне.

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

1. Проверьте группу безопасности кластера. Если она настроена для подсети в исходной зоне доступности, перенастройте группу для подсети в целевой зоне доступности. Для этого в правилах группы безопасности замените CIDR исходной подсети на CIDR целевой подсети.
1. Измените зону доступности у кластера и его хостов Apache Kafka®:

   {% list tabs group=instructions %}

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

      1. В [консоли управления](https://kz.console.yandex.cloud) выберите каталог.
      1. [Перейдите](https://kz.console.yandex.cloud/link/managed-kafka) в сервис **Managed Service for&nbsp;Kafka**.
      1. В строке с нужным кластером нажмите на значок ![image](../../_assets/console-icons/ellipsis.svg), затем выберите ![image](../../_assets/console-icons/pencil.svg) **Редактировать**.
      1. В разделе **Сетевые настройки** укажите новый набор зон доступности. Их количество не должно уменьшиться.

         {% note warning %}

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

         {% endnote %}

      1. Укажите подсеть в новой зоне доступности, если:

         * выполняется миграция в зону доступности, где хосты Apache Kafka® или ZooKeeper ранее не размещались;
         * в целевой зоне доступности находится больше одной подсети.

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

   - CLI {#cli}

      Чтобы изменить набор зон доступности у кластера и его хостов Apache Kafka®, выполните команду:

      ```bash
      yc managed-kafka cluster update <имя_или_идентификатор_кластера> \
         --zone-ids <зоны_доступности> \
         --subnet-ids <идентификаторы_подсетей>
      ```

      В параметре `--zone-ids` перечислите зоны доступности через запятую. Их количество не должно уменьшиться.

      {% note warning %}

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

      {% endnote %}

      В параметре `--subnet-ids` через запятую перечислите подсети для зон доступности `kz1-a`, `kz1-b` и `kz1-d`. Подсети для этих зон должны быть указаны, даже если хосты Apache Kafka® размещаются в меньшем количестве зон. Все три зоны доступности нужны для хостов ZooKeeper.

   - Terraform {#tf}

      1. Откройте актуальный конфигурационный файл Terraform с планом инфраструктуры.

         Как создать такой файл, описано в разделе [Создание кластера Apache Kafka®](cluster-create.md).

      1. Измените в описании кластера Managed Service for Apache Kafka® список зон доступности в параметре `zones`:

         ```hcl
         resource "yandex_mdb_kafka_cluster" "<имя_кластера>" {
           ...
           config {
             ...
             zones = ["<зоны_доступности>"]
           }
           ...
         }
         ```

         Количество зон доступности не должно уменьшиться.

         {% note warning %}

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

         {% endnote %}

      1. Измените в параметре `subnet_ids` список подсетей, если выполняются два условия:

         * вы переносите хосты Apache Kafka® в зону доступности, где хосты ZooKeeper ранее не размещались;
         * в целевой зоне доступности находится больше одной подсети.

         Если хосты кластера размещаются в зонах доступности `kz1-a` и `kz1-b` и вы меняете зоны доступности на `kz1-a`, `kz1-b` и `kz1-d`, укажите подсеть, только если в зоне `kz1-d` несколько подсетей. Иначе подсеть указывать не нужно.

         ```hcl
         resource "yandex_mdb_kafka_cluster" "<имя_кластера>" {
           ...
           subnet_ids = ["<подсети>"]
           ...
         }
         ```

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

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

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

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

      Подробнее в [документации провайдера Terraform](../../terraform/resources/mdb_kafka_cluster.md).

      {% note warning "Ограничения по времени" %}
      
      Провайдер Terraform ограничивает время на выполнение всех операций с кластером Managed Service for Apache Kafka® 60 минутами.
      
      Операции, длящиеся дольше указанного времени, прерываются.
      
      {% cut "Как изменить эти ограничения?" %}
      
      Добавьте к описанию кластера блок `timeouts`, например:
      
      ```hcl
      resource "yandex_mdb_kafka_cluster" "<имя_кластера>" {
        ...
        timeouts {
          create = "1h30m" # Полтора часа
          update = "2h"    # 2 часа
          delete = "30m"   # 30 минут
        }
      }
      ```
      
      {% endcut %}
      
      {% endnote %}

   - REST API {#api}

       1. Воспользуйтесь методом [Cluster.update](../api-ref/Cluster/update.md) и выполните запрос, например, с помощью [cURL](https://curl.se/):

          {% note warning %}
          
          Метод API переопределит все параметры изменяемого объекта, которые не были явно переданы в запросе, на значения по умолчанию. Чтобы избежать этого, перечислите настройки, которые вы хотите изменить, в параметре `updateMask` (одной строкой через запятую).
          
          {% endnote %}

          ```bash
          curl \
              --request PATCH \
              --header "Authorization: Bearer $IAM_TOKEN" \
              --header "Content-Type: application/json" \
              -url 'https://mdb.api.yandexcloud.kz/managed-kafka/v1/clusters/<идентификатор_кластера>' \
              --data '{
                        "updateMask": "configSpec.zoneId,subnetIds",
                        "subnetIds": [
                          <список_подсетей>
                        ],
                        "configSpec": {
                          "zoneId": [
                            <список_зон_доступности>
                          ]
                        }
                      }'
          ```

          Где:

          * `updateMask` — перечень изменяемых параметров в одну строку через запятую.

            Укажите нужные параметры:
            * `subnetIds` — если нужно изменить список подсетей.
            * `configSpec.zoneId` — если нужно изменить список зон доступности.
          * `subnetIds` — массив строк. Каждая строка — идентификатор подсети. Измените список подсетей, если выполняются два условия:

            * вы переносите хосты Apache Kafka® в зону доступности, где хосты ZooKeeper ранее не размещались;
            * в целевой зоне доступности находится больше одной подсети.

            Если хосты кластера размещаются в зонах доступности `kz1-a`, `kz1-b` и `kz1-c` и вы меняете зоны доступности на `kz1-a`, `kz1-b` и `kz1-d`, укажите подсеть, только если в зоне `kz1-d` несколько подсетей. Иначе подсеть указывать не нужно.
          * `zoneId` — новый набор зон доступности кластера. Их количество не должно уменьшиться.

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

       1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/Cluster/update.md#yandex.cloud.operation.Operation).

   - gRPC API {#grpc-api}

       1. Воспользуйтесь вызовом [ClusterService/Update](../api-ref/grpc/Cluster/update.md) и выполните запрос, например, с помощью [gRPCurl](https://github.com/fullstorydev/grpcurl):

           {% note warning %}
           
           Метод API переопределит все параметры изменяемого объекта, которые не были явно переданы в запросе, на значения по умолчанию. Чтобы избежать этого, перечислите настройки, которые вы хотите изменить, в параметре `update_mask` (в виде массива строк `paths[]`).
           
           {% cut "Формат перечисления настроек" %}
           
           ```yaml
           "update_mask": {
               "paths": [
                   "<настройка_1>",
                   "<настройка_2>",
                   ...
                   "<настройка_N>"
               ]
           }
           ```
           
           {% endcut %}
           
           {% endnote %}

           ```bash
           grpcurl \
               -format json \
               -import-path ~/cloudapi/ \
               -import-path ~/cloudapi/third_party/googleapis/ \
               -proto ~/cloudapi/yandex/cloud/mdb/kafka/v1/cluster_service.proto \
               -rpc-header "Authorization: Bearer $IAM_TOKEN" \
               -d '{
                     "cluster_id": "<идентификатор_кластера>",
                     "update_mask": {
                       "paths": [
                         "subnet_ids",
                         "config_spec.zone_id"
                       ]
                     },
                     "subnet_ids": [
                       <список_подсетей>
                     ],
                     "config_spec": {
                       "zone_id": [
                         <список_зон_доступности>
                       ]
                     }
                   }' \
               mdb.api.yandexcloud.kz:443 \
               yandex.cloud.mdb.kafka.v1.ClusterService.Update
           ```

           Где:

           * `update_mask` — перечень изменяемых параметров в виде массива строк `paths[]`.

              Укажите нужные параметры:
              * `subnet_ids` — если нужно изменить список подсетей.
              * `config_spec.zone_id` — если нужно изменить список зон доступности.
           * `subnet_ids` — массив строк. Каждая строка — идентификатор подсети. Измените список подсетей, если выполняются два условия:

             * вы переносите хосты Apache Kafka® в зону доступности, где хосты ZooKeeper ранее не размещались;
             * в целевой зоне доступности находится больше одной подсети.

             Если хосты кластера размещаются в зонах доступности `kz1-a`, `kz1-b` и `kz1-c` и вы меняете зоны доступности на `kz1-a`, `kz1-b` и `kz1-d`, укажите подсеть, только если в зоне `kz1-d` несколько подсетей. Иначе подсеть указывать не нужно.
           * `zone_id` — новый набор зон доступности кластера. Их количество не должно уменьшиться.

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

       1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/grpc/Cluster/update.md#yandex.cloud.operation.Operation).

   {% endlist %}

Чтобы в кластере с версией Apache Kafka® 3.6 или выше перенести хосты Apache Kafka® в другую зону доступности:

1. [Создайте подсеть](../../vpc/operations/subnet-create.md) в целевой зоне доступности, куда вы переносите хосты Apache Kafka®.
1. Проверьте группу безопасности кластера. Если она настроена для подсети в исходной зоне доступности, перенастройте группу для подсети в целевой зоне доступности. Для этого в правилах группы безопасности замените CIDR исходной подсети на CIDR целевой подсети.
1. Измените зону доступности у кластера и его хостов Apache Kafka®:

   {% list tabs group=instructions %}

   - CLI {#cli}

      Чтобы изменить зону доступности у кластера и его хостов Apache Kafka®, выполните команду:

      ```bash
      yc managed-kafka cluster update <имя_или_идентификатор_кластера> \
         --zone-ids <зона_доступности> \
         --subnet-ids <идентификатор_подсети>
      ```

   - Terraform {#tf}

      1. Откройте актуальный конфигурационный файл Terraform с планом инфраструктуры.

         Как создать такой файл, описано в разделе [Создание кластера Apache Kafka®](cluster-create.md).

      1. Измените в описании кластера Managed Service for Apache Kafka® зону доступности в параметре `zones`:

         ```hcl
         resource "yandex_mdb_kafka_cluster" "<имя_кластера>" {
           ...
           config {
             ...
             zones = ["<зона_доступности>"]
           }
           ...
         }
         ```

      1. Укажите в параметре `subnet_ids` подсеть в целевой зоне доступности.

         ```hcl
         resource "yandex_mdb_kafka_cluster" "<имя_кластера>" {
           ...
           subnet_ids = ["<подсеть>"]
           ...
         }
         ```

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

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

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

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

      Подробнее в [документации провайдера Terraform](../../terraform/resources/mdb_kafka_cluster.md).

      {% note warning "Ограничения по времени" %}
      
      Провайдер Terraform ограничивает время на выполнение всех операций с кластером Managed Service for Apache Kafka® 60 минутами.
      
      Операции, длящиеся дольше указанного времени, прерываются.
      
      {% cut "Как изменить эти ограничения?" %}
      
      Добавьте к описанию кластера блок `timeouts`, например:
      
      ```hcl
      resource "yandex_mdb_kafka_cluster" "<имя_кластера>" {
        ...
        timeouts {
          create = "1h30m" # Полтора часа
          update = "2h"    # 2 часа
          delete = "30m"   # 30 минут
        }
      }
      ```
      
      {% endcut %}
      
      {% endnote %}

   - REST API {#api}

       1. Воспользуйтесь методом [Cluster.update](../api-ref/Cluster/update.md) и выполните запрос, например, с помощью [cURL](https://curl.se/):

          {% note warning %}
          
          Метод API переопределит все параметры изменяемого объекта, которые не были явно переданы в запросе, на значения по умолчанию. Чтобы избежать этого, перечислите настройки, которые вы хотите изменить, в параметре `updateMask` (одной строкой через запятую).
          
          {% endnote %}

          ```bash
          curl \
              --request PATCH \
              --header "Authorization: Bearer $IAM_TOKEN" \
              --header "Content-Type: application/json" \
              -url 'https://mdb.api.yandexcloud.kz/managed-kafka/v1/clusters/<идентификатор_кластера>' \
              --data '{
                        "updateMask": "configSpec.zoneId,subnetIds",
                        "subnetIds": [
                          <подсеть_в_целевой_зоне_доступности>
                        ],
                        "configSpec": {
                          "zoneId": [
                            <целевая_зона_доступности>
                          ]
                        }
                      }'
          ```

          Где:

          * `updateMask` — перечень изменяемых параметров в одну строку через запятую.

             В данном случае укажите параметры `subnetIds` и `configSpec.zoneId`.

          * `subnetIds` — массив строк. Каждая строка — идентификатор подсети. Укажите только подсеть в целевой зоне доступности.
          * `zoneId` — новый набор зон доступности кластера. Укажите только целевую зону доступности.

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

       1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/Cluster/update.md#yandex.cloud.operation.Operation).

   - gRPC API {#grpc-api}

       1. Воспользуйтесь вызовом [ClusterService/Update](../api-ref/grpc/Cluster/update.md) и выполните запрос, например, с помощью [gRPCurl](https://github.com/fullstorydev/grpcurl):

           {% note warning %}
           
           Метод API переопределит все параметры изменяемого объекта, которые не были явно переданы в запросе, на значения по умолчанию. Чтобы избежать этого, перечислите настройки, которые вы хотите изменить, в параметре `update_mask` (в виде массива строк `paths[]`).
           
           {% cut "Формат перечисления настроек" %}
           
           ```yaml
           "update_mask": {
               "paths": [
                   "<настройка_1>",
                   "<настройка_2>",
                   ...
                   "<настройка_N>"
               ]
           }
           ```
           
           {% endcut %}
           
           {% endnote %}

           ```bash
           grpcurl \
               -format json \
               -import-path ~/cloudapi/ \
               -import-path ~/cloudapi/third_party/googleapis/ \
               -proto ~/cloudapi/yandex/cloud/mdb/kafka/v1/cluster_service.proto \
               -rpc-header "Authorization: Bearer $IAM_TOKEN" \
               -d '{
                     "cluster_id": "<идентификатор_кластера>",
                     "update_mask": {
                       "paths": [
                         "subnet_ids",
                         "config_spec.zone_id"
                       ]
                     },
                     "subnet_ids": [
                       <подсеть_в_целевой_зоне_доступности>
                     ],
                     "config_spec": {
                       "zone_id": [
                         <целевая_зона_доступности>
                       ]
                     }
                   }' \
               mdb.api.yandexcloud.kz:443 \
               yandex.cloud.mdb.kafka.v1.ClusterService.Update
           ```

           Где:

           * `update_mask` — перечень изменяемых параметров в виде массива строк `paths[]`.

              В данном случае массив состоит из строк `subnetIds` и `configSpec.zoneId`.

           * `subnetIds` — массив строк. Каждая строка — идентификатор подсети. Укажите только подсеть в целевой зоне доступности.
           * `zoneId` — новый набор зон доступности кластера. Укажите только целевую зону доступности.

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

       1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/grpc/Cluster/update.md#yandex.cloud.operation.Operation).

   {% endlist %}

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

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

{% list tabs group=instructions %}

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

   1. В [консоли управления](https://kz.console.yandex.cloud) перейдите в нужный каталог.
   1. Перейдите в сервис **Managed Service for&nbsp;Kafka**.
   1. Нажмите на имя нужного кластера, затем выберите вкладку **Хосты**.

- CLI {#cli}

   ```bash
   yc managed-kafka cluster list-hosts <имя_или_идентификатор_кластера>
   ```

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

- REST API {#api}

    1. Воспользуйтесь методом [Cluster.listHosts](../api-ref/Cluster/listHosts.md) и выполните запрос, например, с помощью [cURL](https://curl.se/):

        ```bash
        curl \
            --request GET \
            --header "Authorization: Bearer $IAM_TOKEN" \
            --url 'https://mdb.api.yandexcloud.kz/managed-kafka/v1/clusters/<идентификатор_кластера>/hosts'
        ```

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

    1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/Cluster/listHosts.md#yandex.cloud.mdb.kafka.v1.ListClusterHostsResponse). FQDN указан в ответе в поле `hosts[].name`.

- gRPC API {#grpc-api}

    1. Воспользуйтесь вызовом [ClusterService/ListHosts](../api-ref/grpc/Cluster/listHosts.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/kafka/v1/cluster_service.proto \
            -rpc-header "Authorization: Bearer $IAM_TOKEN" \
            -d '{
                    "cluster_id": "<идентификатор_кластера>"
                }' \
            mdb.api.yandexcloud.kz:443 \
            yandex.cloud.mdb.kafka.v1.ClusterService.ListHosts
        ```

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

    1. Убедитесь, что запрос был выполнен успешно, изучив [ответ сервера](../api-ref/grpc/Cluster/listHosts.md#yandex.cloud.mdb.kafka.v1.ListClusterHostsResponse). FQDN указан в ответе в поле `hosts[].name`.

{% endlist %}

### Примеры миграции кластера с несколькими хостами {#examples}

Примеры ниже позволяют понять, в каких ситуациях нужно указывать подсеть, чтобы выполнить миграцию кластера Managed Service for Apache Kafka® версии 3.5 с несколькими хостами в другую зону доступности.

#### Хост ZooKeeper уже расположен в целевой зоне доступности {#already-located}

Допустим, кластер содержит следующий набор хостов:

* хост Apache Kafka® №1 — в зоне доступности `kz1-a`;
* хост Apache Kafka® №2 — в зоне доступности `kz1-c`;
* хост ZooKeeper №1 — в зоне доступности `kz1-a`;
* хост ZooKeeper №2 — в зоне доступности `kz1-b`;
* хост ZooKeeper №3 — в зоне доступности `kz1-d`.

Нужно перенести хосты Apache Kafka® в зоны доступности `kz1-a` и `kz1-d`.

Так как хост ZooKeeper №3 уже расположен в зоне `kz1-d`, значит, он размещается в определенной подсети в этой же зоне доступности. Эта подсеть будет использована при миграции, так как после создания кластера его подсети изменить нельзя. В результате при миграции не нужно указывать подсеть.

#### В целевой зоне доступности не располагается ни один хост, и есть одна подсеть {#one-subnet}

Допустим, кластер содержит следующий набор хостов:

* хост Apache Kafka® №1 — в зоне доступности `kz1-a`;
* хост Apache Kafka® №2 — в зоне доступности `kz1-b`;
* хост Apache Kafka® №3 — в зоне доступности `kz1-c`;
* хост ZooKeeper №1 — в зоне доступности `kz1-a`;
* хост ZooKeeper №2 — в зоне доступности `kz1-b`;
* хост ZooKeeper №3 — в зоне доступности `kz1-c`.

Нужно перенести хосты Apache Kafka® в зоны доступности `kz1-a`, `kz1-b` и `kz1-d`.

Ни один хост до миграции не размещается в зоне доступности `kz1-d`. Но в ней находится только одна подсеть, поэтому при миграции не нужно указывать подсеть.

#### В целевой зоне доступности не располагается ни один хост, и в ней находятся несколько подсетей {#several-subnets}

Допустим, кластер содержит следующий набор хостов:

* хост Apache Kafka® №1 — в зоне доступности `kz1-a`;
* хост Apache Kafka® №2 — в зоне доступности `kz1-b`;
* хост Apache Kafka® №3 — в зоне доступности `kz1-c`;
* хост ZooKeeper №1 — в зоне доступности `kz1-a`;
* хост ZooKeeper №2 — в зоне доступности `kz1-b`;
* хост ZooKeeper №3 — в зоне доступности `kz1-c`.

Нужно перенести хосты Apache Kafka® в зоны доступности `kz1-a`, `kz1-b` и `kz1-d`.

Ни один хост до миграции не размещается в зоне доступности `kz1-d`. В ней находится несколько подсетей, поэтому при миграции нужно указать подсеть.

## Особенности миграции в сервисе Yandex Data Transfer {#data-transfer}

Если кластер выступает в роли [эндпоинта](../../data-transfer/concepts/index.md#endpoint) при передаче данных с помощью сервиса Data Transfer и используется [тип трансфера](../../data-transfer/concepts/transfer-lifecycle.md#transfer-types) **Репликация** или **Копирование и репликация**, перезапустите трансфер после миграции кластера. Так трансфер получит сведения о новой топологии кластера.

Трансферы типа **Копирование** перезапускать не нужно, так как во время их активации информация о новой топологии передается автоматически.

Чтобы перезапустить трансфер, выберите один из двух способов:

* [Деактивируйте](../../data-transfer/operations/transfer.md#deactivate) трансфер и дождитесь его перехода в статус **Остановлен**. Затем [активируйте](../../data-transfer/operations/transfer.md#activate) трансфер и дождитесь его перехода в статус **Реплицируется**.
* Измените какую-либо [настройку трансфера](../../data-transfer/operations/transfer.md#update) или [эндпоинта](../../data-transfer/operations/endpoint/index.md#update).

Подробнее читайте в разделе [Миграция эндпоинтов и трансфера Data Transfer в другую зону доступности](../../data-transfer/operations/endpoint/migration-to-an-availability-zone.md).

Пример переноса данных с помощью сервиса Data Transfer в [практическом руководстве](../../data-transfer/tutorials/mkf-to-mkf.md).