Настройка среды с горизонтальным масштабированием
Начиная с версии TCF 0.11.0 в TCF доступна функциональность горизонтального масштабирования репликаторов. Она позволяет распределять нагрузку репликации за счёт использования нескольких процессов, каждый из которых обслуживает отдельные наборы реплик. Такой подход позволяет масштабировать репликацию независимо от размера кластеров, гибко управлять ресурсами и изоляцией нагрузки, повысить отказоустойчивость и предсказуемость поведения системы при росте числа набора реплик.
Данная инструкция описывает порядок развёртывания и настройки кластеров Tarantool DB 2.х с учётом горизонтального масштабирования набора реплик, а также особенности конфигурации их процессов в такой топологии. Каждый кластер состоит из 5 узлов (1 роутер и 2 набора реплик хранилищ по 2 узла в каждом). В примере в качестве хранилища состояния используется etcd.
В руководстве кластеры развернуты вручную с помощью утилиты tt CLI. Пример запуска кластеров Tarantool DB с TCF через Docker Compose можно найти в документации Tarantool DB.
Перед настройкой и запуском кластеров требуется распаковать архивы с TCF 0.11 или выше и TDB версий 2.x и 3.0 или выше. Для этого необходимо заранее выполнить шаги из раздела руководства по установке.
Перед разворачиванием кластеров Tarantool DB и TCF установите etcd. Подробнее о настройке хранилища конфигурации и состояния можно узнать в соответствующем разделе.
Запустите etcd с флагами --listen-client-urls и --advertise-client-urls:
$ etcd --listen-client-urls http://127.0.0.1:2379 \--advertise-client-urls http://127.0.0.1:2379
-
Перейдите в директорию
tarantooldbи выполните в ней команду tt init. Команда создаст окружениеtt, в том числе файл конфигурацииtt.yaml, который используется утилитой tt CLI. -
В директории
instances.enabledсозданногоtt-окружения создайте директорииcluster1иcluster2. -
В директории
instances.enabled/cluster1создайте файлsource.yaml. Этот файл содержит конфигурацию Tarantool Cluster 1. Экземпляры в этой конфигурации принимают входящие запросы на порты 3301–3305:
Здесь:
dbadmin– администратор TCF;peer– пользователь используется для репликации данных внутри кластера;storage– пользователь используется при запросах роутера к экземплярам хранилища;tcf_replicator– пользователь для репликации между кластерами, которыми управляет TCF;tcf_dml– пользователь используется внешними пользователями/приложениями для выполнения операций с данными (DML – Data Manipulation Language).
Подробнее о пользователях, необходимых для корректной работы TCF, можно узнать в разделе Роли и пользователи.
-
В директории
instances.enabled/cluster1создайте файлinstances.yaml– список экземпляров, которые будут запущены в текущем окружении:router-001-a:storage-001-a:storage-001-b:storage-002-a:storage-002-b: -
В директории
instances.enabled/cluster1создайте файлconfig.yaml. Этот файл содержит конфигурацию централизованного хранилища etcd.config:etcd:endpoints:- http://127.0.0.1:2379prefix: /cluster1http:request:timeout: 3 -
В директории
instances.enabled/cluster2создайте файлsource.yamlс конфигурацией кластера Tarantool Cluster 2. Экземпляры в этой конфигурации принимают входящие запросы на порты 13301-13305: -
В директории
instances.enabled/cluster2создайте файлinstances.yaml:router-001-a:storage-001-a:storage-001-b:storage-002-a:storage-002-b: -
В директории
instances.enabled/cluster2создайте файлconfig.yaml.config:etcd:endpoints:- http://127.0.0.1:2379prefix: /cluster2http:request:timeout: 3 -
В директории
instances.enabledсоздайте директориюmigrations/scenario. В этой директории создайте файл миграции001_migration.lua:local helpers = require('tt-migrations.helpers')local function apply_scenario()local space = box.schema.space.create('writers')space:format({{name = 'id', type = 'number'},{name = 'bucket_id', type = 'number'},{name = 'name', type = 'string'},{name = 'age', type = 'number'},})space:create_index('primary', {parts = {'id'}})space:create_index('bucket_id', {parts = {'bucket_id'}})helpers.register_sharding_key('writers', {'id'})endreturn {apply = {scenario = apply_scenario,},}В миграции создается шардированный спейс
writersс ключом шардированияidи первичным индексомprimary.
В качестве веб-интерфейса кластеров Tarantool DB используется Tarantool Cluster Manager, или TCM. Tarantool Cluster Manager – это инструмент для настройки и отслеживания кластеров Tarantool EE и управления ими. Подробная информация о TCM приведена в документации Tarantool.
Задать настройки для запуска TCM можно в файле конфигурации.
Для этого создайте файл tcm.yaml в директории instances.enabled/cluster1:
Здесь:
-
http– имя и порт хоста, на котором запущен TCM. По умолчанию, TCM запускается на порту 8080; -
storage– настройки хранилища конфигурации и узлов etcd, настроенных и запущенных ранее; -
security– настройки безопасности TCM; -
initial-settings– кластеры, которые создаются автоматически при первом запуске TCM. В конфигурации TCM автоматически созданы кластеры Tarantool Cluster 1 и Tarantool Cluster 2. Кластеры используют общий etcd, но имеют различные префиксы –/cluster1и/cluster2.Полная информация об опциях конфигурации TCM приведена в документации TCM.
Чтобы запустить TCM с конфигурацией из файла:
-
Откройте новую вкладку терминала.
-
Перейдите в директорию
instances.enabled/cluster1. -
Запустите TCM:
$ tcm -c tcm.yaml
Узнать больше: Начало работы с TCM.
Запустите активный кластер (Tarantool Cluster 1). Для этого:
-
Перейдите в директорию
tarantooldb:$ cd tarantooldb -
Загрузите конфигурацию кластера в централизованное хранилище из YAML-файла, используя команду tt cluster publish:
$ tt cluster publish http://127.0.0.1:2379/cluster1 ./instances.enabled/cluster1/source.yamlЗдесь:
http://127.0.0.1:2379/cluster1– адрес etcd;./instances.enabled/cluster1/source.yaml– публикуемый файл конфигурации.
-
Запустите кластер:
$ tt start cluster1 -
Проверьте статус кластера:
$ tt status cluster1Результат будет выглядеть следующим образом:
INSTANCE STATUS PID MODE CONFIG BOX UPSTREAMcluster1:router-001-a RUNNING 502612 RW ready running --cluster1:storage-001-a RUNNING 502613 RW ready running --cluster1:storage-001-b RUNNING 502614 RO ready running --cluster1:storage-002-a RUNNING 502611 RW ready running --cluster1:storage-002-b RUNNING 502611 RO ready running -- -
Запустите модуль шардирования
vshard:$ tt replicaset vshard bootstrap cluster1Результат будет выглядеть следующим образом:
• Discovery application...Orchestrator: centralized configReplicasets state: bootstrapped• router-001Failover: offMaster: single• router-001-a localhost:3301 rw• storage-001Failover: manualMaster: single• storage-001-a 127.0.0.1:3302 rw• storage-001-b 127.0.0.1:3303 read• storage-002Failover: manualMaster: single• storage-002-a 127.0.0.1:3304 rw• storage-002-b 127.0.0.1:3305 read• Bootstrapping vshard• Done. -
Загрузите миграции в кластер:
$ tt migrations publish http://127.0.0.1:2379/cluster1 ./instances.enabled/cluster1/migrations -
Примените загруженные миграции:
$ tt migrations apply http://127.0.0.1:2379/cluster1 --tarantool-username=dbadmin --tarantool-password=secretРезультат будет выглядеть следующим образом:
• router-001:• 001_migration.lua: successfully applied• storage-001:• 001_migration.lua: successfully applied• storage-002:• 001_migration.lua: successfully applied
Запустите пассивный кластер (Tarantool Cluster 2). Для этого:
-
Перейдите в директорию
tarantooldb:$ cd tarantooldb -
Загрузите конфигурацию кластера в централизованное хранилище из YAML-файла, используя команду tt cluster publish:
$ tt cluster publish http://127.0.0.1:2379/cluster2 ./instances.enabled/cluster2/source.yamlЗдесь:
http://127.0.0.1:2379/cluster2– адрес etcd;./instances.enabled/cluster2/source.yaml– публикуемый файл конфигурации.
-
Запустите кластер:
$ tt start cluster2 -
Проверьте статус кластера:
$ tt status cluster2Результат будет выглядеть следующим образом:
INSTANCE STATUS PID MODE CONFIG BOX UPSTREAMcluster2:storage-001-a RUNNING 502899 RW ready running --cluster2:storage-001-b RUNNING 502896 RO ready running --cluster2:storage-002-a RUNNING 502611 RW ready running --cluster2:storage-002-b RUNNING 502612 RO ready running -- -
Запустите модуль шардирования
vshard:$ tt replicaset vshard bootstrap cluster2Результат будет выглядеть следующим образом:
• Discovery application...Orchestrator: centralized configReplicasets state: bootstrapped• router-001Failover: offMaster: single• router-001-a 127.0.0.1:13301 rw• storage-001Failover: manualMaster: single• storage-001-a 127.0.0.1:13302 rw• storage-001-b 127.0.0.1:13303 read• storage-002Failover: manualMaster: single• storage-002-a 127.0.0.1:13304 rw• storage-002-b 127.0.0.1:13305 read• Bootstrapping vshard• Done. -
Загрузите миграции в кластер:
$ tt migrations publish http://127.0.0.1:2379/cluster2 ./instances.enabled/cluster2/migrations -
Примените загруженные миграции:
$ tt migrations apply http://127.0.0.1:2379/cluster2 --tarantool-username=dbadmin --tarantool-password=secretРезультат будет выглядеть следующим образом:
• router-001:• 001_migration.lua: successfully applied• storage-001:• 001_migration.lua: successfully applied• storage-002:• 001_migration.lua: successfully applied
Проверка работы и состояния кластеров описана в соответствующем разделе.
Для репликации данных между кластерами Tarantool Cluster 1 → Tarantool Cluster 2 компоненты Gateway и Destination будут запускаться в нескольких экземплярах. В связи с этим к конфигурации репликации предъявляется обязательное требование: в совокупности все экземпляры Gateway должны обеспечивать чтение изменений со всех шардов исходного кластера, а все экземпляры Destination — запись данных во все шарды целевого кластера. Таким образом, для корректной работы репликации требуется создать и запустить 4 отдельных конфигурационных файла и 4 процесса TCF.
-
Чтобы сконфигурировать первый экземпляр Gateway, в директории с распакованным архивом TCF создайте файл
config_gateway_1to2_001.yamlи вставьте следующую конфигурацию:
Этот процесс читает изменения только из экземпляров хранилища в наборе реплик (шарде) storage-001 кластера Tarantool Cluster 1.
-
Для конфигурации второго экземпляра Gateway создайте файл
config_gateway_1to2_002.yamlи вставьте следующую конфигурацию:Данный экземпляр Gateway подключается к экземплярам хранилища в наборе реплик
storage-002, читает поток изменений только из этого шарда и дополняет первый Gateway, обеспечивая покрытие исходного кластера. -
На этом шаге необходимо настроить первый экземпляр Destination. Для этого создайте файл
config_destination_1to2_001.yamlи вставьте следующую конфигурацию:Данный экземпляр Destination принимает данные от всех Gateway, маршрутизирует операции только в экземпляры хранилища в наборе реплик
storage-001целевого кластера и отвечает за запись данных в соответствующие экземпляры хранилища. -
Для конфигурации второго экземпляра Destination создайте файл
config_destination_1to2_002.yamlи вставьте следующую конфигурацию:Данный экземпляр Destination принимает данные от всех Gateway, маршрутизирует операции только в экземпляры хранилища в наборе реплик
storage-002целевого кластера и отвечает за запись данных в соответствующие экземпляры хранилища. -
После подготовки всех конфигурационных файлов запустите каждый компонент отдельным процессом:
./tcf-gateway --config config_gateway_1to2_001.yaml./tcf-gateway --config config_gateway_1to2_002.yaml./tcf-destination --config config_destination_1to2_001.yaml./tcf-destination --config config_destination_1to2_002.yamlКогда компонент Destination будет готов к работе, вывод результатов работы команды может выглядеть так:
2025-02-27T17:43:38+03:00 INFO src/pkg/ttpusher/pusher.go:427 "CDC State successfully fetched" Pusher=General/SubscribeПроверить статус Gateway необходимо после запуска компонента Destination. Когда компонент Gateway готов к работе, вывод результатов работы команды может выглядеть так:
2025-02-27T17:42:53+03:00 INFO src/internal/gateway/server.go:512 Connected "Replica set"=e0f5488a-00c5-4c53-9b3a-ec052610357b Host=localhost:13303 From="&{VClock:[0 3117] OwnerID:0 ConfirmedVClock:[]}"
Чтобы проверить успешную репликацию данных с Tarantool Cluster 1 на Tarantool Cluster 2:
-
Перейдите в веб-интерфейс ТСМ.
-
В TCM над вкладкой Stateboard выберите кластер Tarantool Cluster 1 в выпадающем списке Clusters.
-
Подключитесь к узлу-роутеру. Для этого нажмите на
router-001, выберите экземплярrouter-001-aи в открывшемся окне перейдите на вкладку Terminal (TT Connect). -
Добавьте в созданный ранее спейс
writersновый кортеж:crud.insert_object('writers', {id = 1,name = 'Haruki Murakami',age = 75}, {noreturn = true}) -
Проверьте, что в спейсе появились данные. Для этого перейдите на вкладку Tuples и выберите в списке спейс
writers. В открывшейся вкладке видно, что в спейс добавлен новый кортежHaruki Murakami. -
Переключитесь на Tarantool Cluster 2 и перейдите на вкладку Tuples.
-
Выберите в списке спейс
writersи проверьте, что в открывшейся вкладке также появился кортежHaruki Murakami.
Для организации обратной репликации из Tarantool Cluster 2 в Tarantool Cluster 1 используется та же схема масштабирования, что и для прямого направления.
-
Чтобы сконфигурировать первый экземпляр Gateway, в директории с распакованным архивом TCF создайте файл
config_gateway_2to1_001.yamlи вставьте следующую конфигурацию:
Этот процесс читает изменения только из экземпляров хранилища в наборе реплик (шарде) storage-001 кластера Tarantool Cluster 2.
-
Для конфигурации второго экземпляра Gateway создайте файл
config_gateway_2to1_002.yamlи вставьте следующую конфигурацию:Данный экземпляр обслуживает экземпляры хранилища в шарде
storage-002и совместно с предыдущим экземпляром Gateway обеспечивает чтение изменений со всего Tarantool Cluster 2. -
На этом шаге необходимо настроить первый экземпляр Destination. Для этого создайте файл
config_destination_2to1_001.yamlи вставьте следующую конфигурацию:Экземпляр Destination принимает данные от всех Gateway кластера Tarantool Cluster 2 и выполняет запись только в экземпляры хранилища в шарде
storage-001. -
Для конфигурации второго экземпляра Destination создайте файл
config_destination_2to1_002.yamlи вставьте следующую конфигурацию:Данный экземпляр получает данные от всех Gateway, выполняет запись исключительно в экземпляры хранилища в шарде
storage-002.
Чтобы проверить репликацию с Tarantool Cluster 2 на Tarantool Cluster 1, необходимо переключить состояние кластеров и сделать Tarantool Cluster 2 активным. Подробнее про смену состояния кластеров читайте в соответствующем разделе.
-
Получите состояние Tarantool Cluster 1:
$ curl -X GET --location "http://127.0.0.1:8081/tcf/status"active -
Переключите состояние кластеров на противоположные. Для этого отправьте POST-запрос на адрес обработчика запроса вида
/tcf/toggle:$ curl -X POST --location "http://127.0.0.1:8081/tcf/toggle" -
Проверьте состояние Tarantool Cluster 1:
$ curl -X GET --location "http://127.0.0.1:8081/tcf/status"passive -
Проверьте состояние Tarantool Cluster 2:
$ curl -X GET --location "http://127.0.0.1:8081/tcf/status"active
После подготовки всех конфигурационных файлов и смены состояния кластеров запустите каждый компонент отдельным процессом:
./tcf-gateway --config config_gateway_2to1_001.yaml./tcf-gateway --config config_gateway_2to1_002.yaml./tcf-destination --config config_destination_2to1_001.yaml./tcf-destination --config config_destination_2to1_002.yaml
Когда компонент Destination будет готов к работе, вывод результатов работы команды может выглядеть так:
2025-02-27T17:43:38+03:00 INFO src/pkg/ttpusher/pusher.go:427 "CDC State successfully fetched" Pusher=General/Subscribe
Проверить статус Gateway необходимо после запуска компонента Destination. Когда компонент Gateway готов к работе, вывод результатов работы команды может выглядеть так:
2025-02-27T17:42:53+03:00 INFO src/internal/gateway/server.go:512 Connected "Replica set"=e0f5488a-00c5-4c53-9b3a-ec052610357b Host=localhost:13303 From="&{VClock:[0 3117] OwnerID:0 ConfirmedVClock:[]}"
-
В TCM над вкладкой Stateboard выберите кластер Tarantool Cluster 2 в выпадающем списке Clusters.
-
Подключитесь к узлу хранилища. Для этого нажмите на набор реплик
storage-001, выберите экземплярstorage-001-aи в открывшемся окне перейдите на вкладку Terminal (TT Connect). -
Во вкладке Terminal добавьте в спейс новый кортеж:
crud.insert_object('writers', {id = 2,name = 'Eiji Mikage',age = 41}, {noreturn = true}) -
Проверьте, что в спейсе появились данные. Для этого перейдите на вкладку Tuples и выберите в списке спейс
writers. В открывшейся вкладке видно, что в спейс добавлен новый кортежEiji Mikage. -
Переключитесь на Tarantool Cluster 1 и перейдите на вкладку Tuples.
-
Выберите в списке спейс
writersи проверьте, что в открывшейся вкладке также появился кортежEiji Mikage.