VK Docs logo
Помощь
Обновлена 8 апреля 2026 г. в 14:19

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

Добавлено в версии 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_body='return box.info.replication'"

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

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

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

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

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

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

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

# Было: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 экземпляр хранилища перестанет быть частью кластера.

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

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

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

# Проверка статуса репликацииansible-playbook -i inventory.yml playbooks/eval_3_0.yml \  -e "eval_body='return box.info.replication()'"# Проверка кворумаansible-playbook -i inventory.yml playbooks/eval_3_0.yml \  -e "eval_body='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_body='return vshard.router.info()'"# Проверка распределения бакетовansible-playbook -i inventory.yml playbooks/eval_3_0.yml \  -e "eval_body='return vshard.storage.buckets_count()'"