VK Docs logo
Помощь
Обновлена 18 июня 2026 г. в 14:44

Сценарии администрирования кластера

Добавлено в версии 1.18.0

Данная инструкция описывает процесс добавления и удаления роутеров и хранилищ (как отдельных экземпляров, так и целых наборов реплик) в существующий кластер Tarantool 3 с использованием Ansible-ролей.

Добавление экземпляров в кластер

Общие шаги для всех операций добавления

Все операции добавления выполняются в три этапа с помощью следующих плейбуков:

  1. install_3_0.yml — установка и запуск новых экземпляров
  2. etcd_3_0.yml — загрузка обновленной конфигурации в ETCD
  3. tbcs.yml — загрузка обновленной конфигурации в TbCS (Tarantool-based Config Storage)
  4. check_3_0.yml — проверка статуса кластера

Добавление роутера в кластер

Роутеры (routers) отвечают за маршрутизацию запросов к хранилищам. Добавление роутера не требует ребалансировки данных.

Добавление экземпляра роутера в инвентарь

На примере инвентаря inventory.yml добавляем новый роутер core_router-r03:

all:  children:    tarantool:      children:        core_router:          children:            # Существующие роутеры            core_router-r01:              hosts:                core_router-r01-i01:                  iproto:                    advertise:                      client: 127.0.0.1:3307                    listen:                    - uri: 127.0.0.1:3307                  replicaset_alias: core_router-r01                  roles_cfg:                    roles.httpd:                      default:                        listen: 8087            core_router-r02:              hosts:                core_router-r02-i01:                  iproto:                    advertise:                      client: 127.0.0.1:3308                    listen:                    - uri: 127.0.0.1:3308                  replicaset_alias: core_router-r02                  roles_cfg:                    roles.httpd:                      default:                        listen: 8088            # Новый экземпляр роутера            core_router-r03:              hosts:                core_router-r03-i01:                  iproto:                    advertise:                      client: 127.0.0.1:3309                    listen:                    - uri: 127.0.0.1:3309                  replicaset_alias: core_router-r03                  roles_cfg:                    roles.httpd:                      default:                        listen: 8089

Добавление хоста в группу vm_1

vm_1:      hosts:        # ... существующие хосты        core_router-r03-i01: {}

Запуск плейбуков

# Установка и запуск нового экземпляраansible-playbook -i inventory.yml playbooks/install_3_0.yml# Загрузка конфигурации в ETCDansible-playbook -i inventory.yml playbooks/etcd_3_0.yml# Проверка статуса кластераansible-playbook -i inventory.yml playbooks/check_3_0.yml

Проверка логов

journalctl -xe -u my-app@core_router-r03-i01

Проверка через TCM

После успешного добавления роутера проверьте его состояние в веб-интерфейсе TCM (Tarantool Cluster Manager):

  1. Откройте веб-интерфейс TCM (по умолчанию http://<tcm-host>:8080).
  2. Авторизуйтесь с учетными данными администратора.
  3. В списке кластеров выберите нужный кластер.
  4. Убедитесь, что новый роутер отображается в топологии кластера со статусом Online.

Добавление хранилища в существующий набор реплик

При добавлении хранилища (storage) в существующий набор реплик данные автоматически синхронизируются с мастера. Ребалансировка данных не требуется, так как бакеты остаются в тех же наборах реплик.

Добавление экземпляра хранилища в инвентарь

На примере набора реплик core_storage-r01 добавляем новый экземпляр хранилища core_storage-r01-i04:

core_storage:          children:            core_storage-r01:              vars:                labels:                  server: '{{ tarantool_ansible_host }}'                tarantool_config_replicaset:                  memtx:                    memory: 512000000                  roles:                  - app.roles.queue                  sharding:                    roles:                    - storage                replicaset_alias: core_storage-r01              hosts:                # Существующие экземпляры                core_storage-r01-i01:                  iproto:                    advertise:                      client: 127.0.0.1:3301                    listen:                    - uri: 127.0.0.1:3301                  roles_cfg:                    roles.httpd:                      default:                        listen: 8081                core_storage-r01-i02:                  iproto:                    advertise:                      client: 127.0.0.1:3302                    listen:                    - uri: 127.0.0.1:3302                  replication:                    anon: true                  roles_cfg:                    roles.httpd:                      default:                        listen: 8082                core_storage-r01-i03:                  iproto:                    advertise:                      client: 127.0.0.1:3303                    listen:                    - uri: 127.0.0.1:3303                  roles_cfg:                    roles.httpd:                      default:                        listen: 8083                # Новый экземпляр хранилища                core_storage-r01-i04:                  iproto:                    advertise:                      client: 127.0.0.1:3313                    listen:                    - uri: 127.0.0.1:3313                  replication:                    anon: true  # Если реплика анонимная                  roles_cfg:                    roles.httpd:                      default:                        listen: 8093

Добавление хоста в группу vm_1

vm_1:      hosts:        # ... существующие хосты        core_storage-r01-i04: {}

Запуск плейбуков

# Установка и запуск нового экземпляраansible-playbook -i inventory.yml playbooks/install_3_0.yml# Загрузка конфигурации в ETCDansible-playbook -i inventory.yml playbooks/etcd_3_0.yml# Проверка статуса кластераansible-playbook -i inventory.yml playbooks/check_3_0.yml

Проверка репликации

В логах нового экземпляра должна быть информация о синхронизации данных:

journalctl -xe -u my-app@core_storage-r01-i04 | grep -i replica

Проверка через TCM

  1. Откройте веб-интерфейс TCM.
  2. Авторизуйтесь с учетными данными администратора.
  3. В списке кластеров выберите нужный кластер.
  4. Найдите набор реплик core_storage-r01.
  5. Проверьте информацию о состоянии репликации между мастером и новой репликой, убедитесь в отсутствии ошибок.

Добавление нового набора реплик хранилищ

При добавлении нового набора реплик происходит автоматическая ребалансировка данных между всеми наборами реплик. Новый шард получит свою долю бакетов.

Важные моменты перед добавлением набора реплик

Параметр rebalancer_mode в конфигурации шардирования управляет режимом ребалансировки:

tarantool_config_global:  sharding:    bucket_count: 1000    rebalancer_mode: 'auto'  # Автоматическая ребалансировка

Возможные значения:

  • auto — ребалансировка выполняется автоматически (по умолчанию)
  • off — ребалансировка отключена
  • manual — ручной режим ребалансировки

Добавление набора реплик в инвентарь

Добавляем новый набор реплик core_storage-r04 с тремя экземплярами:

core_storage:          children:            # ... существующие наборы реплик (core_storage-r01, r02, r03)            # Новый набор реплик            core_storage-r04:              vars:                labels:                  server: '{{ tarantool_ansible_host }}'                tarantool_config_replicaset:                  memtx:                    memory: 512000000                  roles:                  - app.roles.queue                  sharding:                    roles:                    - storage                replicaset_alias: core_storage-r04              hosts:                core_storage-r04-i01:                  iproto:                    advertise:                      client: 127.0.0.1:3320                    listen:                    - uri: 127.0.0.1:3320                  roles_cfg:                    roles.httpd:                      default:                        listen: 8100                core_storage-r04-i02:                  iproto:                    advertise:                      client: 127.0.0.1:3321                    listen:                    - uri: 127.0.0.1:3321                  replication:                    anon: true                  roles_cfg:                    roles.httpd:                      default:                        listen: 8101                core_storage-r04-i03:                  iproto:                    advertise:                      client: 127.0.0.1:3322                    listen:                    - uri: 127.0.0.1:3322                  roles_cfg:                    roles.httpd:                      default:                        listen: 8102

Добавление хостов в группу vm_1

vm_1:      hosts:        # ... существующие хосты        core_storage-r04-i01: {}        core_storage-r04-i02: {}        core_storage-r04-i03: {}

Запуск плейбуков

# Установка и запуск новых экземпляровansible-playbook -i inventory.yml playbooks/install_3_0.yml# Загрузка конфигурации в ETCD (здесь происходит ребалансировка)ansible-playbook -i inventory.yml playbooks/etcd_3_0.yml# Проверка статуса кластераansible-playbook -i inventory.yml playbooks/check_3_0.yml

Мониторинг ребалансировки

После добавления набора реплик можно отслеживать процесс ребалансировки в логах:

# Логи одного из экземпляров нового набора репликjournalctl -xe -u my-app@core_storage-r04-i01 | grep -i rebalance# Или проверка через консоль экземпляраtt connect core_storage-r04-i01:3320> vshard.router.info()

Проверка распределения бакетов

Подключитесь к любому экземпляру хранилища и проверьте статус шардирования:

-- Проверка количества бакетов в наборе репликvshard.storage.buckets_count()-- Проверка статуса ребалансировкиvshard.storage.rebalancer_state()

Проверка через TCM

  1. Откройте веб-интерфейс TCM.
  2. Авторизуйтесь с учетными данными администратора.
  3. В списке кластеров выберите нужный кластер.
  4. Убедитесь, что новый набор реплик отображается в топологии кластера.
  5. Проверьте распределение бакетов между всеми наборами реплик.

Обновление конфигурации клиентов

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

Пример для gRPC-сервера из инвентаря:

consumer:                      queues:                        queue:                          connections:                            storage-1:                            # Добавить новые хранилища, если добавлялся набор реплик                            - 127.0.0.1:3320                            - 127.0.0.1:3321                            - 127.0.0.1:3322                      tarantool:                        connections:                          storage-1:                          # Добавить новые хранилища                          - 127.0.0.1:3320                          - 127.0.0.1:3321                          - 127.0.0.1:3322                    producer:                      queues:                        queue:                          connections:                            routers:                            # Добавить новые роутеры                            - 127.0.0.1:3309                      tarantool:                        connections:                          routers:                          # Добавить новые роутеры                          - 127.0.0.1:3309

Сводная таблица по операциям добавления

Операция
Ребалансировка данных
Требует обновления клиентов
Добавление роутера
Нет
Да (для использования нового роутера)
Добавление хранилища в набор реплик
Нет
Нет
Добавление набора реплик хранилищ
Да (автоматически при rebalancer_mode: auto)
Да (для доступа к новым хранилищам)

Проверка работоспособности после операций добавления

После всех операций выполните полную проверку:

# Проверка всех экземпляровansible-playbook -i inventory.yml playbooks/check_3_0.yml# Проверка через eval (пример — получение списка наборов реплик)ansible-playbook -i inventory.yml playbooks/eval_3_0.yml \  -e "eval_command='return box.info.replication'"

Удаление экземпляров из кластера

Общие шаги для операций удаления из кластера

Удаление экземпляров из кластера Tarantool 3.x выполняется путем исключения их из конфигурации в ETCD. После удаления экземпляра из инвентаря и обновления конфигурации в ETCD, кластер перестает видеть этот экземпляр.

Автоматическое удаление экземпляров из _cluster (autoexpel)

Добавлено в версии 3.3.0

При удалении экземпляров из конфигурации кластера (инвентаря и ETCD) может возникнуть ошибка mismatch of the number of replicas in the config with box.space._cluster. Это происходит потому, что информация об удаленных экземплярах остается в системном спейсе _cluster, и кластер продолжает ожидать их подключения. Для автоматического удаления экземпляров из _cluster при их исключении из конфигурации используется опция replication.autoexpel.

Принцип работы

Опция replication.autoexpel позволяет экземпляру в режиме read-write (мастеру) автоматически удалять из _cluster те экземпляры, чьи имена начинаются с заданного префикса и которые отсутствуют в текущей YAML-конфигурации кластера.

Опция настраивается на уровнях global, group или replicaset (не на уровне отдельного экземпляра).

Настройка autoexpel

Добавьте секцию autoexpel в конфигурацию репликации:

replication:  autoexpel:    enabled: true    by: prefix    prefix: '{% raw %}{{ replicaset_name }}{% endraw %}'

В примере выше {% raw %}{{ replicaset_name }}{% endraw %} — это переменная конфигурации Tarantool. Конструкция {% raw %}...{% endraw %} используется для экранирования Jinja2-синтаксиса Ansible, чтобы значение {{ replicaset_name }} попало в конфигурацию Tarantool как есть и было интерпретировано уже самим Tarantool, а не Ansible.

Параметры:

Параметр
Тип
Значение по умолчанию
Описание
enabled
boolean
false
Включает автоматическое удаление экземпляров из _cluster.
by
string
Критерий определения экземпляров, принадлежащих кластеру. Единственное поддерживаемое значение — "prefix".
prefix
string
Префикс имен экземпляров. Экземпляры с этим префиксом, отсутствующие в конфигурации, будут автоматически удалены из _cluster.

В примере выше используется переменная {{ replicaset_name }}, которая автоматически подставляет имя набора реплик. Это гарантирует, что экземпляры, относящиеся к данному набору реплик, будут корректно обработаны при удалении.

Применение настроек

После добавления опции autoexpel в конфигурацию необходимо обновить конфигурацию в ETCD:

ansible-playbook -i inventory.yml playbooks/etcd_3_0.yml

Или через консоль экземпляра:

require('config'):reload()

Порядок действий при удалении с autoexpel

  1. Удалите экземпляр из инвентаря (закомментируйте или удалите его секцию).
  2. Обновите конфигурацию в ETCD с помощью плейбука etcd_3_0.yml.
  3. Read-write экземпляр (мастер) автоматически обнаружит, что экземпляр с заданным префиксом отсутствует в новой конфигурации, и удалит его из _cluster.
  4. Ошибка mismatch исчезает, кластер перестает ожидать подключения удаленного экземпляра.

Удаление роутера из кластера

Удаление роутера не требует ребалансировки данных, так как роутеры не хранят данные.

Удаление роутера из инвентаря

Удалите или закомментируйте удаляемый роутер в инвентаре:

# Было:core_router:  children:    core_router-r01:    core_router-r02:    core_router-r03:  # Удалить эту секцию# Стало:core_router:  children:    core_router-r01:    core_router-r02:

Также удалите хост из всех групп:

vm_1:  hosts:    # ... другие хосты    # core_router-r03-i01: {}  # Удалить

Обновление конфигурации в ETCD

Запустите плейбук для загрузки обновленной конфигурации в ETCD:

ansible-playbook -i inventory.yml playbooks/etcd_3_0.yml

После обновления конфигурации в ETCD роутер перестанет быть частью кластера.

Проверка статуса кластера после удаления экземпляра

ansible-playbook -i inventory.yml playbooks/check_3_0.yml

Проверка через TCM

  1. Откройте веб-интерфейс TCM.
  2. Авторизуйтесь с учетными данными администратора.
  3. В списке кластеров выберите нужный кластер.
  4. Убедитесь, что удаленный роутер больше не отображается в топологии кластера.
  5. Проверьте, что статус кластера Healthy или все узлы в статусе Online.

Удаление хранилища из набора реплик

При удалении хранилища из набора реплик данные остаются на оставшихся экземплярах набора реплик. Ребалансировка данных не требуется.

Удаление экземпляра хранилища из инвентаря

Удалите или закомментируйте удаляемый экземпляр хранилища в инвентаре:

core_storage-r01:  hosts:    core_storage-r01-i01: {}    core_storage-r01-i02: {}    core_storage-r01-i03: {}    # core_storage-r01-i04: {}  # Удалить

Также удалите хост из всех групп:

vm_1:  hosts:    # ... другие хосты    # core_storage-r01-i04: {}  # Удалить

Обновление конфигурации в ETCD

ansible-playbook -i inventory.yml playbooks/etcd_3_0.yml

После обновления конфигурации в ETCD экземпляр хранилища перестанет быть частью кластера.

{note:tip} Если после удаления экземпляра возникает ошибка mismatch of the number of replicas in the config with box.space._cluster, настройте автоматическую очистку _cluster с помощью опции autoexpel. {/note}

Проверка работоспособности кластера после удаления экземпляра хранилища

# Проверка статуса кластераansible-playbook -i inventory.yml playbooks/check_3_0.yml

Проверка состояния набора реплик

# Проверка статуса репликацииansible-playbook -i inventory.yml playbooks/eval_3_0.yml \  -e "eval_command='return box.info.replication()'"# Проверка кворумаansible-playbook -i inventory.yml playbooks/eval_3_0.yml \  -e "eval_command='return box.info.synchro.quorum()'"

Проверка через TCM

  1. Откройте веб-интерфейс TCM.
  2. Авторизуйтесь с учетными данными администратора.
  3. В списке кластеров выберите нужный кластер.
  4. Проверьте информацию о состоянии репликации, убедитесь в отсутствии ошибок.

Удаление из инвентаря

core_storage-r01:  hosts:    core_storage-r01-i01: {}    core_storage-r01-i02: {}    core_storage-r01-i03: {}    # core_storage-r01-i04: {}  # Удалитьvm_1:  hosts:    # ... другие хосты    # core_storage-r01-i04: {}  # Удалить

Удаление набора реплик хранилищ

При удалении набора реплик и установке параметра sharding.rebelancer_mode: auto происходит автоматическая ребалансировка данных между оставшимися наборами реплик.

Важные моменты перед удалением

Параметр rebalancer_mode в конфигурации шардирования управляет режимом ребалансировки:

tarantool_config_global:  sharding:    bucket_count: 1000    rebalancer_mode: 'auto'  # Автоматическая ребалансировка

Возможные значения:

  • auto — ребалансировка выполняется автоматически (по умолчанию)
  • off — ребалансировка отключена
  • manual — ручной режим ребалансировки

При удалении набора реплик хранилищ необходимо сначала перенести все бакеты на другие наборы реплик. Это выполняется установкой веса набора реплик в 0.

Установка веса набора реплик в 0 (резервирование бакетов)

Добавьте weight: 0 для удаляемого набора реплик в инвентарь:

core_storage-r04:  vars:    labels:      server: '{{ tarantool_ansible_host }}'    tarantool_config_replicaset:      memtx:        memory: 512000000      roles:      - app.roles.queue      sharding:        roles:        - storage        weight: 0  # Добавить для ребалансировки    replicaset_alias: core_storage-r04  hosts:    core_storage-r04-i01:    core_storage-r04-i02:    core_storage-r04-i03:

Обновление конфигурации в ETCD и начало ребалансировки

ansible-playbook -i inventory.yml playbooks/etcd_3_0.yml

После обновления конфигурации в ETCD начнется ребалансировка данных — все бакеты будут перенесены с core_storage-r04 на другие наборы реплик.

Мониторинг ребалансировки перед удалением

# Проверка статуса ребалансировки (рекомендуемый способ)ansible-playbook -i inventory.yml playbooks/eval_3_0.yml \  -e "tarantool_shared_hosts=core_storage-r04-i01" \  -e "eval_command='local i=vshard.storage.info(); return {total=i.bucket.total,active=i.bucket.active,sending=i.bucket.sending,receiving=i.bucket.receiving,rebalancing=vshard.storage.rebalancing_is_in_progress()}'"

Критерии завершения ребалансировки (все должны выполняться):

  • total: 0 — все бакеты перенесены с репликасета
  • active: 0 — нет активных бакетов
  • sending: 0 — нет бакетов в процессе отправки
  • receiving: 0 — нет бакетов в процессе получения
  • rebalancing: false — ребалансер не выполняет перенос

Альтернативные способы проверки:

# Проверка через vshard.storage.info().bucket (только статус бакетов)ansible-playbook -i inventory.yml playbooks/eval_3_0.yml \  -e "tarantool_shared_hosts=core_storage-r04-i01" \  -e "eval_command='return vshard.storage.info().bucket'"# Проверка флага активности ребалансировкиansible-playbook -i inventory.yml playbooks/eval_3_0.yml \  -e "tarantool_shared_hosts=core_storage-r04-i01" \  -e "eval_command='return vshard.storage.rebalancing_is_in_progress()'"

Ожидание завершения ребалансировки

Повторяйте проверку из пункта Мониторинг ребалансировки перед удалением до тех пор, пока все критерии завершения не будут выполнены:

  • Все бакеты перенесены (total: 0)
  • Нет активных переносов (sending: 0, receiving: 0)
  • Ребалансер неактивен (rebalancing: false)

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

Удаление набора реплик из инвентаря

После завершения ребалансировки (когда total: 0, sending: 0, receiving: 0 и rebalancing: false) удалите набор реплик из инвентаря:

# Было:core_storage:  children:    core_storage-r01:    core_storage-r02:    core_storage-r03:    core_storage-r04:  # Удалить эту секцию полностью# Стало:core_storage:  children:    core_storage-r01:    core_storage-r02:    core_storage-r03:

Также удалите хосты из всех групп`:

vm_1:  hosts:    # ... другие хосты    # core_storage-r04-i01: {}  # Удалить    # core_storage-r04-i02: {}  # Удалить    # core_storage-r04-i03: {}  # Удалить

Обновление конфигурации в ETCD для удаления

ansible-playbook -i inventory.yml playbooks/etcd_3_0.yml

После обновления конфигурации в ETCD набор реплик перестанет быть частью кластера.

Проверка работоспособности кластера после удаления набора реплик хранилищ

# Проверка статуса кластераansible-playbook -i inventory.yml playbooks/check_3_0.yml

Проверка через TCM

  1. Откройте веб-интерфейс TCM.
  2. Авторизуйтесь с учетными данными администратора.
  3. В списке кластеров выберите нужный кластер.
  4. Убедитесь, что удаленный набор реплик больше не отображается в топологии кластера.
  5. Убедитесь в корректном распределении бакетов между оставшимися наборами реплик.

Полная очистка данных

Для полного удаления данных набора реплик используйте плейбук cleanup_replicaset.yml:

ansible-playbook -i inventory.yml playbooks/cleanup_replicaset.yml \  -e "tarantool_shared_hosts=core_storage-r04-i01,core_storage-r04-i02,core_storage-r04-i03" \  -e "tarantool_cleanup_instances=['core_storage-r04-i01','core_storage-r04-i02','core_storage-r04-i03']" \  -e "cartridge_app_name=my-app"

Параметры:

  • tarantool_shared_hosts — хосты, на которых находятся экземпляры для очистки (через запятую)
  • tarantool_cleanup_instances — список имен экземпляров для очистки
  • cartridge_app_name — имя приложения (используется в именах systemd-юнитов)

Что делает плейбук:

  1. Останавливает systemd-юниты для указанных экземпляров.
  2. Удаляет директории данных (cartridge_data_dir/instance_name).
  3. Удаляет run-директории (cartridge_run_dir/instance_name).
  4. Удаляет лог-файлы (cartridge_log_dir_parent/instance_name*).

Ручная очистка (альтернативный способ):

Если необходимо выполнить очистку вручную:

# Остановка экземпляровsystemctl stop my-app@core_storage-r04-i01systemctl stop my-app@core_storage-r04-i02systemctl stop my-app@core_storage-r04-i03# Удаление директорий данныхrm -rf /var/lib/tarantool/my-app/core_storage-r04-i01rm -rf /var/lib/tarantool/my-app/core_storage-r04-i02rm -rf /var/lib/tarantool/my-app/core_storage-r04-i03

Удаление из инвентаря

core_storage:  children:    core_storage-r01:    core_storage-r02:    core_storage-r03:    # core_storage-r04:  # Удалитьvm_1:  hosts:    # ... другие хосты    # core_storage-r04-i01: {}  # Удалить    # core_storage-r04-i02: {}  # Удалить    # core_storage-r04-i03: {}  # Удалить

Сводная таблица по операциям удаления

Операция
Ребалансировка данных
Предварительные шаги
Удаление роутера
Нет
Удаление из инвентаря
Удаление хранилища из набора реплик
Нет
Удаление из инвентаря
Удаление набора реплик хранилищ
Да (перенос бакетов)
1. Установка weight: 0
2. Ожидание ребалансировки
3. Удаление из инвентаря

Проверка работоспособности после операций удаления

После всех операций выполните полную проверку:

# Проверка всех экземпляровansible-playbook -i inventory.yml playbooks/check_3_0.yml# Проверка статуса vshardansible-playbook -i inventory.yml playbooks/eval_3_0.yml \  -e "eval_command='return vshard.router.info()'"# Проверка распределения бакетовansible-playbook -i inventory.yml playbooks/eval_3_0.yml \  -e "eval_command='return vshard.storage.buckets_count()'"