Обновление Tarantool
В разделе описана миграция Tarantool с версии 3.2.1 до 3.6.2 для инсталляции VK Object Storage. Перед началом процедуры убедитесь, что пакет tarantool на конкретной машине обновлен до версии 3.2.1.
Обновляйте сначала маршрутизаторы, затем связанные с ними базы:
switchover-autofailover.wires.hitbox.fringe.matter.nylon.pairdb.filedb.jqueue.shinobi.
-
Проверьте, что версия дистрибутива — 26.Х.Х:
$ cat distrib/version.txt -
Проверьте состояние всех сервисов:
$ switchover -p hotbox status <ИМЯ_СЕРВИСА> -
Проверьте мониторинг: не должно быть ошибок и высокой задержки репликации.
-
Проверьте, что в логах нет
END=5**,failed,error,err,dieи других ошибок. -
При обновлении
filedbпроверьте состояниеvshard:$ switchover -p hotbox eval --cluster --yes nylon 'vshard.router.info().status'$ switchover -p hotbox eval --cluster --yes filedb 'vshard.storage.info().status'Статус должен быть равен
0. Это означает, что алерты отсутствуют. -
Проверьте, что
touchingне запущен (подробнее в документе Руководство администратора VK Object Storage в разделе Тачинг):$ hb touching status -
Только для stateful-компонентов: установите флаг для пропуска изменения схемы для всех сервисов, которые будут обновлены на новую версию Tarantool:
$ for component in {filedb,matter,pairdb,hitbox,jqueue,shinobi}; do switchover etcd set /hotbox/${component}/common/app/scheme/skip true; done -
Если установлен
policebank, установите дополнительный флаг:$ switchover etcd set /hotbox/policebank/common/app/scheme/skip true -
Если установлен
usagedb, установите дополнительный флаг:$ switchover etcd set /hotbox/usagedb/common/app/scheme/skip true -
Перезагрузите все сервисы, которые обновляются:
$ for component in {filedb,matter,pairdb,hitbox,jqueue,shinobi}; do switchover -p hotbox pr --cluster --yes ${component}; done -
Если установлен
policebank, перезагрузите его:$ switchover -p hotbox pr --cluster --yes policebank -
Если установлен
usagedb, перезагрузите его:$ switchover -p hotbox pr --cluster --yes usagedb -
Проверьте, что перезагрузка прошла успешно:
$ for component in {filedb,matter,pairdb,hitbox,jqueue,shinobi}; do switchover -p hotbox eval --cluster --yes ${component} 'return package.reload.reloaded'; done -
Только для stateful-компонентов: убедитесь, что перезагрузка прошла успешно и изменение схемы отключено:
$ grep "Skip box.schema changes for migration" /var/log/<component>/*.log -
Отключите
autofailoverдля обновляемого сервиса:$ sudo -E ./01_deploy_helper.sh ansible-playbook -i inventory.yml -e @ansible-vault.yml -e @vault-transit -e @vault vk.s3.autofailover --tags service_stop_task -
Только для stateful-компонентов: создайте снимок:
$ for component in {filedb,matter,pairdb,hitbox,jqueue,shinobi}; do switchover -p hotbox eval --cluster --yes ${component} 'return box.snapshot()'; done -
Только для stateful-компонентов: скопируйте
snapиxlogфайлы в безопасное место:$ cp -r /var/lib/tarantool/{snaps,xlogs}/<ИМЯ_СЕРВИСА>/
К stateless-компонентам относятся fringe, wires, nylon и другие.
-
Остановите обновляемый сервис:
$ systemctl stop tarantool@<ИМЯ_СЕРВИСА>.service -
Удалите
snap- иxlog-файлы (если они есть):$ rm -rf /var/lib/tarantool/snaps/<ИМЯ_СЕРВИСА>/*.snap$ rm -rf /var/lib/tarantool/xlogs/<ИМЯ_СЕРВИСА>/*.xlog -
Запустите обновляемый сервис:
$ systemctl start tarantool@<ИМЯ_СЕРВИСА>.service -
Понаблюдайте за состоянием системы некоторое время. Проверьте состояние сервисов, мониторинг, логи и
vshard(раздел Подготовка). -
Убедитесь, что обновление версии схемы прошло успешно — ожидаемая версия схемы
3.3.0:$ switchover -p hotbox eval --cluster <ИМЯ_КЛАСТЕРА> "return box.space._schema.index.primary:select('version', {iterator='EQ'})"
К stateful-компонентам относятся hitbox, matter, filedb, pairdb, jqueue и другие.
-
Соберите всех мастеров на реплики
_01(только для компонентов с несколькими шардами — по одной команде на шард):$ switchover -p hotbox sw matter@matter_001_01$ switchover -p hotbox sw matter@matter_002_01$ switchover -p hotbox sw filedb@filedb_001_01$ switchover -p hotbox sw hitbox@hitbox_01$ switchover -p hotbox sw pairdb@pairdb_01$ switchover -p hotbox sw jqueue@jqueue_01Повторите команды
sw matter@...иsw filedb@...для всех шардов соответствующих компонентов. -
Убедитесь, что мастеров вне
_01не осталось — вывода быть не должно:$ switchover -p hotbox s matter | grep 'role:master' | grep -v '_01'$ switchover -p hotbox s filedb | grep 'role:master' | grep -v '_01'$ switchover -p hotbox s hitbox | grep 'role:master' | grep -v '_01'$ switchover -p hotbox s pairdb | grep 'role:master' | grep -v '_01'$ switchover -p hotbox s jqueue | grep 'role:master' | grep -v '_01' -
Выполните последовательный перезапуск реплик — всех инстансов, кроме бывшего мастера (
_01). Порядок между репликами значения не имеет:$ systemctl restart tarantool@<ИМЯ_СЕРВИСА>.serviceПеред рестартом следующего инстанса дождитесь, пока перезапущенный выполнит репликацию: в выводе
switchover -p hotbox s <ИМЯ_КЛАСТЕРА>должно бытьok/<МАСТЕР>:follow/0.000s, и не должно появиться новыхCRITилиHIGHсообщений (команда проверки сообщений:switchover -p hotbox s <ИМЯ_КЛАСТЕРА> --only-alerts). -
Выполните перезапуск оставшейся реплики — бывшего мастера. Это делается в последнюю очередь: при отключенном
autofailover(шаг 11 раздела Подготовка) мастер не обновится автоматически, и набор реплик останется без мастера на все время его простоя (сообщениеCRIT master_is_down, запись недоступна).$ systemctl restart tarantool@<ИМЯ_СЕРВИСА>.service -
Понаблюдайте за состоянием системы. Проверьте:
switchover -p hotbox s <ИМЯ_КЛАСТЕРА> --only-alerts— не должно бытьCRITилиHIGH;- у всех реплик статус
ok/<МАСТЕР>:follow/0.000s(задержка репликации0); - состояние
vshard(см. шаг 5 раздела Подготовка).
-
Выполните обновление версии схемы Tarantool:
$ switchover -p hotbox eval --cluster <ИМЯ_КЛАСТЕРА>:rw 'return box.session.su("admin"), box.schema.upgrade()' -
Убедитесь, что обновление версии схемы прошло успешно — ожидаемая версия схемы
3.3.0:$ switchover -p hotbox eval --cluster <ИМЯ_КЛАСТЕРА> "return box.space._schema.index.primary:select('version', {iterator='EQ'})"
-
Включите схему для обновленных сервисов:
$ for component in {filedb,matter,pairdb,hitbox,jqueue,shinobi}; do switchover etcd set /hotbox/${component}/common/app/scheme/skip false; done -
Выполните перезагрузку обновленных сервисов:
$ switchover -p hotbox eval --cluster <ИМЯ_КЛАСТЕРА> 'return package.reload()' -
Создайте снимок:
$ switchover -p hotbox eval --cluster <ИМЯ_КЛАСТЕРА> 'return box.snapshot()' -
Если установлен
policebank, создайте снимок:$ switchover etcd set /hotbox/policebank/common/app/scheme/skip false$ switchover -p hotbox pr --cluster --yes policebank -
Если установлен
usagedb, создайте снимок:$ switchover etcd set /hotbox/usagedb/common/app/scheme/skip false$ switchover -p hotbox pr --cluster --yes usagedb -
Включите
autofailoverдля обновленных сервисов:$ sudo -E ./01_deploy_helper.sh ansible-playbook -i inventory.yml -e @ansible-vault.yml -e @vault-transit -e @vault vk.s3.autofailover --tags service_start_task