Сценарии администрирования кластера
Добавлено в версии 1.18.0
Данная инструкция описывает процесс добавления и удаления роутеров и хранилищ (как отдельных экземпляров, так и целых наборов реплик) в существующий кластер Tarantool 3 с использованием Ansible-ролей.
Все операции добавления выполняются в три этапа с помощью следующих плейбуков:
- install_3_0.yml — установка и запуск новых экземпляров
- etcd_3_0.yml — загрузка обновленной конфигурации в ETCD
- tbcs.yml — загрузка обновленной конфигурации в TbCS (Tarantool-based Config Storage)
- 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:3307listen:- uri: 127.0.0.1:3307replicaset_alias: core_router-r01roles_cfg:roles.httpd:default:listen: 8087core_router-r02:hosts:core_router-r02-i01:iproto:advertise:client: 127.0.0.1:3308listen:- uri: 127.0.0.1:3308replicaset_alias: core_router-r02roles_cfg:roles.httpd:default:listen: 8088# Новый экземпляр роутераcore_router-r03:hosts:core_router-r03-i01:iproto:advertise:client: 127.0.0.1:3309listen:- uri: 127.0.0.1:3309replicaset_alias: core_router-r03roles_cfg:roles.httpd:default:listen: 8089
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 (Tarantool Cluster Manager):
- Откройте веб-интерфейс TCM (по умолчанию
http://<tcm-host>:8080). - Авторизуйтесь с учетными данными администратора.
- В списке кластеров выберите нужный кластер.
- Убедитесь, что новый роутер отображается в топологии кластера со статусом 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: 512000000roles:- app.roles.queuesharding:roles:- storagereplicaset_alias: core_storage-r01hosts:# Существующие экземплярыcore_storage-r01-i01:iproto:advertise:client: 127.0.0.1:3301listen:- uri: 127.0.0.1:3301roles_cfg:roles.httpd:default:listen: 8081core_storage-r01-i02:iproto:advertise:client: 127.0.0.1:3302listen:- uri: 127.0.0.1:3302replication:anon: trueroles_cfg:roles.httpd:default:listen: 8082core_storage-r01-i03:iproto:advertise:client: 127.0.0.1:3303listen:- uri: 127.0.0.1:3303roles_cfg:roles.httpd:default:listen: 8083# Новый экземпляр хранилищаcore_storage-r01-i04:iproto:advertise:client: 127.0.0.1:3313listen:- uri: 127.0.0.1:3313replication:anon: true # Если реплика анонимнаяroles_cfg:roles.httpd:default:listen: 8093
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.
- Авторизуйтесь с учетными данными администратора.
- В списке кластеров выберите нужный кластер.
- Найдите набор реплик
core_storage-r01. - Проверьте информацию о состоянии репликации между мастером и новой репликой, убедитесь в отсутствии ошибок.
При добавлении нового набора реплик происходит автоматическая ребалансировка данных между всеми наборами реплик. Новый шард получит свою долю бакетов.
Параметр rebalancer_mode в конфигурации шардирования управляет режимом ребалансировки:
tarantool_config_global:sharding:bucket_count: 1000rebalancer_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: 512000000roles:- app.roles.queuesharding:roles:- storagereplicaset_alias: core_storage-r04hosts:core_storage-r04-i01:iproto:advertise:client: 127.0.0.1:3320listen:- uri: 127.0.0.1:3320roles_cfg:roles.httpd:default:listen: 8100core_storage-r04-i02:iproto:advertise:client: 127.0.0.1:3321listen:- uri: 127.0.0.1:3321replication:anon: trueroles_cfg:roles.httpd:default:listen: 8101core_storage-r04-i03:iproto:advertise:client: 127.0.0.1:3322listen:- uri: 127.0.0.1:3322roles_cfg:roles.httpd:default:listen: 8102
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.
- Авторизуйтесь с учетными данными администратора.
- В списке кластеров выберите нужный кластер.
- Убедитесь, что новый набор реплик отображается в топологии кластера.
- Проверьте распределение бакетов между всеми наборами реплик.
После добавления новых экземпляров необходимо обновить конфигурацию клиентских приложений, чтобы они могли использовать новые узлы.
Пример для gRPC-сервера из инвентаря:
consumer:queues:queue:connections:storage-1:# Добавить новые хранилища, если добавлялся набор реплик- 127.0.0.1:3320- 127.0.0.1:3321- 127.0.0.1:3322tarantool:connections:storage-1:# Добавить новые хранилища- 127.0.0.1:3320- 127.0.0.1:3321- 127.0.0.1:3322producer:queues:queue:connections:routers:# Добавить новые роутеры- 127.0.0.1:3309tarantool: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:
ansible-playbook -i inventory.yml playbooks/etcd_3_0.yml
После обновления конфигурации в ETCD роутер перестанет быть частью кластера.
ansible-playbook -i inventory.yml playbooks/check_3_0.yml
- Откройте веб-интерфейс TCM.
- Авторизуйтесь с учетными данными администратора.
- В списке кластеров выберите нужный кластер.
- Убедитесь, что удаленный роутер больше не отображается в топологии кластера.
- Проверьте, что статус кластера 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: {} # Удалить
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.
- Авторизуйтесь с учетными данными администратора.
- В списке кластеров выберите нужный кластер.
- Проверьте информацию о состоянии репликации, убедитесь в отсутствии ошибок.
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: 1000rebalancer_mode: 'auto' # Автоматическая ребалансировка
Возможные значения:
auto— ребалансировка выполняется автоматически (по умолчанию)off— ребалансировка отключенаmanual— ручной режим ребалансировки
При удалении набора реплик хранилищ необходимо сначала перенести все бакеты на другие наборы реплик. Это выполняется установкой веса набора реплик в 0.
Добавьте weight: 0 для удаляемого набора реплик в инвентарь:
core_storage-r04:vars:labels:server: '{{ tarantool_ansible_host }}'tarantool_config_replicaset:memtx:memory: 512000000roles:- app.roles.queuesharding:roles:- storageweight: 0 # Добавить для ребалансировкиreplicaset_alias: core_storage-r04hosts:core_storage-r04-i01:core_storage-r04-i02:core_storage-r04-i03:
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: {} # Удалить
ansible-playbook -i inventory.yml playbooks/etcd_3_0.yml
После обновления конфигурации в ETCD набор реплик перестанет быть частью кластера.
# Проверка статуса кластераansible-playbook -i inventory.yml playbooks/check_3_0.yml
- Откройте веб-интерфейс TCM.
- Авторизуйтесь с учетными данными администратора.
- В списке кластеров выберите нужный кластер.
- Убедитесь, что удаленный набор реплик больше не отображается в топологии кластера.
- Убедитесь в корректном распределении бакетов между оставшимися наборами реплик.
Для полного удаления данных набора реплик используйте плейбук 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-юнитов)
Что делает плейбук:
- Останавливает systemd-юниты для указанных экземпляров.
- Удаляет директории данных (
cartridge_data_dir/instance_name). - Удаляет run-директории (
cartridge_run_dir/instance_name). - Удаляет лог-файлы (
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: 02. Ожидание ребалансировки 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()'"