Обновление до версии Tarantool DB 2.x¶
В этом руководстве описано, как обновить Tarantool DB версии 1.2.1 и выше до Tarantool DB 2.x. Релизы Tarantool DB 2.x основаны на Tarantool 3.x и несовместимы с Cartridge. Узнать больше о возможностях Tarantool DB 2.х: Tarantool DB 2.0.
Обратите внимание, что установка Tarantool DB 1.2.1 – обязательный шаг перед обновлением на Tarantool DB 2.x. Для использования пользовательского интерфейса необходимо раздеплоить TCM и etcd.
Примечание
В этом руководстве приведены ссылки на документацию по инсталлятору Ansible Tarantool Enterprise. Подробная документация по инсталлятору ATE доступна только зарегистрированным пользователям личного кабинета tarantool.io. Узнать больше: Об инсталляторе.
Содержание:
Базовый сценарий миграции с даунтаймом¶
Выполните резервное копирование кластера. Соответствующая инструкция приведена в документации по инсталлятору ATE в разделе Автоматическое резервирование.
Сгенерируйте конфигурацию кластера Tarantool 3.x c помощью утилиты
tools/client/get_tdb2_config.lua
:./tarantool tools/client/get_tdb2_config.lua > config.yml
Здесь:
config.yml
– файл, в который записывается созданная конфигурация Tarantool 3.x.
Подробное описание утилиты приведено в разделе Создание конфигурации для кластера Tarantool DB 2.x.
Теперь проверьте корректность конфигурации и заполните нужные секции. Подробнее про это можно прочитать в разделе Описание конфигурации.
Для работы через ATE требуется файл инвентаря, который содержит описание топологии вашего решения и настроек приложения или продукта. Подготовьте файл инвентаря для Tarantool DB 2.0, используя инструкцию в документации по инсталлятору. Поскольку у вас уже есть готовый файл с конфигурацией кластера, не указывайте в инвентаре поля
tarantool_config_global
иtarantool_config_replicaset
.Кроме того, если используется
supervised
failover, добавьте экземпляры-координаторы:tarantooldb_test_env_3: hosts: storage-1-2: storage-2-2: coordinator-3: tarantool_coordinator: true
Смотрите также: Пример инвентаря для Tarantool DB 2.x.
Установите etcd. Для корректной работы необходимо установить минимум 3 экземпляра etcd версии не ниже 3.4. Из-за ограничений инсталлятора ATE использовать Tarantool DB 2.x без etcd нельзя.
Загрузите конфигурацию Tarantool 3.x в etcd. При загрузке конфигурации в etcd используйте ключ
/tarantool/{{cartridge_app_name}}/config/all
.Здесь:
{{cartridge_app_name}}
– переменная из инвентаря для Tarantool DB версий 1.x и 2.x, обозначающая имя приложения.
Для загрузки конфигурации можно использовать
etcdctl
:ETCDCTL_API=3 etcdctl --endpoints=http://10.0.1.12:2379 put /tarantool/{{cartridge_app_name}}/config/all -- < config.yml
Разверните Tarantool Cluster Manager, чтобы получить доступ к веб-интерфейсу и обновляться в удобном режиме. Инструкция по запуску TCM приведена в документации инсталлятора ATE.
Настройте веб-интерфейс TCM. Для этого:
Войдите в TCM, используя адрес и пароль из инвентаря TCM – см. опции
tcm_host
,tcm_port
,tcm_bootstrap_password
.Перейдите на вкладку Clusters и нажмите кнопку Add.
Укажите название кластера и добавьте описание для него.
Переключитесь на второй экран настройки, используя кнопку Next.
На втором экране укажите следующие значения:
в поле Provider –
etcd
;в поле Prefix –
/tarantool/{{cartridge_app_name}}
, где{{cartridge_app_name}}
– это переменная из инвентаря;в поле Endpoints укажите эндпоинты etcd в формате
http://10.0.1.12:2379
.
Переключитесь на третий экран настройки, используя кнопку Next.
На третьем экране укажите следующие значения:
в поле Username –
admin
;в поле Password – пароль для пользователя
admin
из конфигурации.
В левом верхнем углу нажмите на кнопку Cluster и переключитесь на нужный кластер.
Перейдите во вкладку Configuration. Проверьте, что конфигурация загрузилась из etcd.
Остановите кластер Tarantool DB 1.x. Для этого вы можете использовать сценарий stop.yml.
Разверните Tarantool DB 2.x, используя соответствующий сценарий ATE.
Пример запуска
docker run --network host -it --rm \ -v ./key:/root/id_private_key:Z \ -v ./inventory.yml:/ansible/inventories/hosts_tarantooldb.yml:Z \ -v ./tarantooldb-2x-latest.linux.x86_64.tar.gz:/ansible/inventories/tarantooldb-2x-latest.linux.x86_64.tar.gz:Z \ -e ENV_SUPER_USER=astra \ ansible-tarantool-enterprise:1.4.1 \ ansible-playbook -i /ansible/inventories/hosts_tarantooldb.yml \ --extra-vars '{ "cartridge_package_path":"/ansible/inventories/tarantooldb-2x-latest.linux.x86_64.tar.gz", "ansible_ssh_private_key_file":"~/id_private_key", "super_user":"'${ENV_SUPER_USER}'", "tarantool_shared_become_user":"tarantool", }' \ /ansible/playbooks/install_3_0.yml --limit tarantooldb_test_env_1,tarantooldb_test_env_2,tarantooldb_test_env_3
Убедитесь, что в TCM все работает корректно. Для этого после запуска откройте в TCM вкладку Stateboard и проверьте, что кластер поднялся. Выберите экземпляр в любом из наборов реплик и в открывшемся окне перейдите во вкладку Terminal. Проверьте, что работают модули
crud
иdictionary
.Кластер уже готов к работе, но необходимо обновить схему данных. Чтобы обновить схему данных, в TCM на каждом master-узле вызовите
box.schema.upgrade
.
Описание конфигурации¶
Утилита get_tdb2_config.lua
создаст конфигурацию для текущей топологии кластера, но задать пути до файлов .xlog
и .snap
вам необходимо вручную.
В разделах ниже рассмотрена по частям конфигурация для кластера с 2 наборами реплик по 2 хранилища и 4 роутерами. Полный список опций конфигурации Tarantool 3.x приведен в документации Tarantool.
Директории с данными¶
Обратите внимание на секции конфигурации wal
и dir
.
Для успешного запуска необходимо указать корректные пути до директорий с файлами wal
и snap
для каждого экземпляра.
Здесь:
{{ instance_name }}
– имя экземпляра в Tarantool 3.x. В Cartridge это alias экземпляра.
wal:
dir: /app/tarantool/tarantooldb/workdir/tarantooldb.{{ instance_name }}/
snapshot:
dir: /app/snap/tarantooldb/tarantooldb.{{ instance_name }}/
Tarantool DB не поддерживает спейсы на движке vinyl
.
Тем не менее, если такие спейсы есть, укажите для них также правильный путь:
vinyl:
dir: /app/tarantool/tarantooldb/workdir/tarantooldb.{{ instance_name }}/
Пользователь admin¶
В Cartridge-приложении используется один пользователь admin
для репликации, шардирования и вызова хранимых процедур.
Этот же пользователь admin
указывается и в конфигурации Tarantool 3.x.
Также пользователю даются права на исполнение функции failover.execute
.
Это необходимо при использовании supervised
failover.
В качестве пароля укажите cluster cookie.
credentials:
users:
admin:
password: tarantooldb-test
roles:
- super
- sharding
- replication
privileges:
- permissions: ['execute']
functions: ['failover.execute']
Логирование¶
Теперь настройте логирование в нужный файл:
log:
file: /app/logs/tarantooldb/{{ instance_name }}.log
to: file
level: info
Восстановление после сбоев¶
В Tarantool 3.x есть три режима восстановления после сбоев (failover):
manual
– ручное управление лидером в наборе реплик;election
– восстановление после сбоев с использованием алгоритма RAFT;supervised
– управление восстановлением после сбоев через внешний координатор.
В зависимости от типа фейловера в Cartridge скрипт выставит соответствующее значение для Tarantool 3.x:
Фейловер Cartridge |
Фейловер Tarantool 3.x |
---|---|
|
|
|
|
|
|
|
|
Если вы используете синхронную репликацию, вы сможете выставить только режим election. В противном случае вам необходимо:
отказаться от использования синхронной репликации;
сделать спейсы асинхронными;
выполнить на
owner
-ах очереди транзакций методbox.ctl.demote
.
Чтобы узнать, какая реплика в наборе реплик является owner
-ом, вызовите box.info.synchro.
Топология¶
Скрипт разделит наборы реплик на 3 группы:
routers
– сюда попадут наборы реплик с рольюvshard-router
;storages
– сюда попадут наборы реплик с рольюvshard-storage
;others
– сюда попаду остальные наборы реплик.
При необходимости вы можете перенастроить группы под ваше приложение.
Рассмотрим конфигурацию для набора реплик из группы storages
.
Скрипт присвоит каждому экземпляру и набору реплик свой UUID.
Без них поднять кластер на данных Tarantool DB 1.x не получится.
В секциях roles
и roles_cfg
указаны роли и конфигурации для них в секциях для набора реплик и экземпляра.
Скрипт возьмет их из Tarantool DB 1.x и подставит в Tarantool DB 2.x.
Также обратите внимание на параметр memtx.memory
для памяти, выделенной на экземпляр.
Роль roles.metrics-export
отвечает за метрики, получаемые с экземпляра Tarantool 3.x.
Для работы этой роли поднимается http-сервер на порту, указнном в опции roles.metrics-export.http
.
Если в кластере Tarantool DB 1.x есть особые переменные (например, max_tuple_size
, slab_alloc_factor
или VINYL_MEMORY
),
укажите их в данной секции конфигурации. Если этого не сделать, для них будут взяты значения по умолчанию.
leader
для набора реплик указывается только при режиме manual
в failover.
Пример
storages:
replicasets:
shard-2:
database:
replicaset_uuid: 32d96df2-c2ba-4027-b63d-a42803bb1d50
roles_cfg: {}
roles:
- roles.metrics-export
- roles.expirationd
- roles.dictionary-storage
- roles.crud-storage
leader: storage-2-1 # используется только с failover manual
instances:
storage-2-1:
memtx:
memory: 536870912
database:
instance_uuid: 9feab7ac-e7cd-4b3b-8994-d0adaab4aab7
iproto:
listen:
- uri: 10.0.1.31:3303
advertise:
client: 10.0.1.31:3303
roles_cfg:
roles.metrics-export:
http:
- listen: 8093
endpoints:
- path: /metrics
format: prometheus
- path: /metrics_json
format: json
storage-2-2:
memtx:
memory: 536870912
database:
instance_uuid: 6cdf636d-1b87-41d2-8ec6-b544fcdf914b
iproto:
listen:
- uri: 10.0.1.6:3304
advertise:
client: 10.0.1.6:3304
roles_cfg:
roles.metrics-export:
http:
- listen: 8094
endpoints:
- path: /metrics
format: prometheus
- path: /metrics_json
format: json
Шардирование¶
Если количество бакетов в вашем кластере отличается от 30000, обратите внимание на секцию sharding
:
sharding:
bucket_count: 30000
Подключения для репликации и шардирования¶
В секции iproto
задайте пользователей для репликации и шардирования.
В этом руководстве только один пользователь – admin
, его и нужно указать в конфигурации:
iproto:
advertise:
peer:
password: tarantooldb-test
login: admin
sharding:
password: tarantooldb-test
login: admin
Дополнительные параметры¶
Задайте необходимые параметры в секциях process
, security
и console
:
process:
work_dir: /app/tarantool/tarantooldb/bin/tarantooldb.{{ instance_name }} #рабочая директория
pid_file: /app/tarantool/tarantooldb/run/{{ instance_name }}.pid #pid-файл
security: # отключение доступа без пароля как гость
disable_guest: true
console: # доступ через unix socket
socket: /app/tarantool/tarantooldb/run/{{ instance_name }}.control
enabled: true
Пример инвентаря Tarantool DB 2.0¶
---
all:
children:
ROUTERS:
children:
router-1:
router-2:
router-3:
router-4:
router-5:
router-6:
vars:
STORAGES:
children:
storage-1:
storage-2:
vars:
storage-1:
hosts:
storage-1-1:
storage-1-2:
vars:
replicaset_alias: storage-1
storage-2:
hosts:
storage-2-1:
storage-2-2:
vars:
replicaset_alias: storage-2
router-1:
hosts:
router-1:
vars:
replicaset_alias: router-1
router-2:
hosts:
router-2:
vars:
replicaset_alias: router-2
router-3:
hosts:
router-3:
vars:
replicaset_alias: router-3
router-4:
hosts:
router-4:
vars:
replicaset_alias: router-4
router-5:
hosts:
router-5:
vars:
replicaset_alias: router-5
router-6:
hosts:
router-6:
vars:
replicaset_alias: router-6
tarantooldb_test_env_1:
hosts:
storage-1-1:
router-1:
router-2:
router-3:
coordinator-1:
tarantool_coordinator: true
vars:
ansible_host: '10.0.1.12'
ansible_user: 'astra'
tarantooldb_test_env_2:
hosts:
storage-2-1:
router-4:
router-5:
router-6:
coordinator-2:
tarantool_coordinator: true
vars:
ansible_host: '10.0.1.31'
ansible_user: 'astra'
tarantooldb_test_env_3:
hosts:
storage-1-2:
storage-2-2:
coordinator-3:
tarantool_coordinator: true
vars:
ansible_host: '10.0.1.6'
ansible_user: 'astra'
etcd_hosts:
hosts:
'10.0.1.12':
'10.0.1.31':
'10.0.1.6':
vars:
ansible_user: 'astra'
vars:
ansible_ssh_common_args: -o IdentitiesOnly=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no
ansible_ssh_retries: 5
cartridge_app_name: tarantooldb
tarantool_3_0_version_support: true
tarantool_etcd_host: "10.0.1.12"
etcd_host: "10.0.1.12"
cartridge_failover_params:
state_provider: "etcd2"
etcd2_params:
endpoints:
- http://10.0.1.12:2379
- http://10.0.1.31:2379
- http://10.0.1.6:2379
Пример инвентаря TCM¶
---
cluster-manager:
hosts:
tcm:
tcm_host: localhost
tcm_port: 8081
tcm_etcd_host: "10.0.1.12"
tcm_bootstrap_password: secret
tcm_cluster_tt_command: /app/tarantool/tarantooldb/dist/tdb/tt # укажите путь до tt в вашем контуре
ansible_host: '10.0.1.12'
ansible_user: 'astra'
vars:
ansible_ssh_common_args: -o IdentitiesOnly=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no