Обновление кластера с репликацией
Ниже приведены общие инструкции по обновлению кластера Tarantool с репликацией. Для обновления с некоторых версий требуются дополнительные шаги - см. разделы, посвященные конкретным версиям, в разделе Обновления.
Кластер с репликацией можно обновить без простоя благодаря его избыточности. При отключении экземпляра на время обновления его роль переходит к другому экземпляру из набора реплик - основному хранилищу или роутеру Таким образом можно обновлять все экземпляры по очереди.
Общие шаги по обновлению кластера:
- Убедитесь в совместимости приложения с целевой версией Tarantool.
- Проверьте состояние кластера.
- Установите целевую версию Tarantool на узлах кластера.
- Обновите наборы реплик хранилища по очереди.
- Обновите узлы-роутеры по очереди.
Если в процессе обновления возникли проблемы, можно выполнить откат к исходной версии. Инструкции по откату приведены в разделе Откат.
Перед обновлением убедитесь, что приложение совместимо с целевой версией Tarantool:
- Настройте среду разработки с установленной целевой версией Tarantool. Инструкции по установке см. на странице загрузки Tarantool и в руководстве по установке tt.
- Разверните приложение в этой среде и проверьте его работу. При возникновении проблем измените код приложения для обеспечения совместимости с целевой версией.
Когда приложение готово к работе на целевой версии Tarantool, можно приступать к обновлению рабочей среды.
Выполните эти шаги перед обновлением, чтобы убедиться в корректной работе кластера:
-
На каждом экземпляре
routerвыполните проверку vshard.router:tarantool> vshard.router.info()-- no issues in the output-- sum of 'bucket.available_rw' == total number of buckets -
На каждом экземпляре
storageвыполните проверку репликации:tarantool> box.info-- box.info.status == 'running'-- box.info.ro == 'false' on one instance in each replica set.-- box.info.replication[*].upstream.status == 'follow'-- box.info.replication[*].downstream.status == 'follow'-- box.info.replication[*].upstream.lag <= box.cfg.replication_timeout-- can also be moderately larger under a write load -
На каждом экземпляре
storageвыполните проверку vshard.storage:tarantool> vshard.storage.info()-- no issues in the output-- replication.status == 'follow' -
Проверьте логи всех экземпляров на наличие ошибок приложения.
При обнаружении проблем обязательно устраните их перед началом процедуры обновления.
Установите целевую версию Tarantool на все хосты кластера. Это можно сделать с помощью пакетного менеджера или утилиты tt. Инструкции по установке см. на странице загрузки Tarantool и в руководстве по установке tt.
Убедитесь, что целевая версия Tarantool установлена, выполнив команду tarantool -v на всех хостах.
Обновляйте экземпляры router по очереди:
- Остановите один экземпляр
router. - Запустите этот экземпляр на целевой версии Tarantool.
- Повторите предыдущие шаги для каждого экземпляра
router.
После завершения обновления экземпляров router выполните проверку vshard.router на каждом из них.
При обновлении модуля crud действует особый порядок обновления.
Подробнее см. в разделе Обновление модуля crud.
Перед обновлением экземпляров storage:
-
Отключите failover в Cartridge:
tt cartridge failover disableили используйте веб-интерфейс Cartridge (вкладка Cluster, кнопка Failover:
). -
Отключите балансировщик:
tarantool> vshard.storage.rebalancer_disable() -
Убедитесь, что для параметра
upgrade_schemaв Cartridge установлено значениеfalse.
Обновите экземпляры хранилища, выполнив следующие шаги для каждого набора реплик:
- Выберите реплику (экземпляр только для чтения) из набора реплик. Остановите эту реплику и запустите её
снова на целевой версии Tarantool. Дождитесь, пока она достигнет статуса
running(box.info.status == running). - Поочередно перезапустите все остальные экземпляры только для чтения из набора реплик на целевой версии.
- Назначьте одну из обновленных реплик новым мастером, следуя инструкции из раздела Переключение мастера.
- Перезапустите последний экземпляр набора реплик (бывший мастер, теперь реплика) на целевой версии.
- Выполните функцию box.schema.upgrade() на новом мастере. Это обновит системные спейсы Tarantool до текущей установленной версии. Позже механизм репликации передаст изменения на другие узлы.
- Выполните функцию
box.snapshot()на каждом узле набора реплик, чтобы реплики сразу увидели обновленное состояние базы данных при перезапуске.
После выполнения этих шагов включите failover или балансировщик обратно:
-
Включите failover в Cartridge:
tt cartridge failover set [mode]или используйте веб-интерфейс Cartridge (вкладка Cluster, кнопка Failover: Disabled).
-
Включите балансировщик:
tarantool> vshard.storage.rebalancer_enable()
Выполните эти шаги после обновления, чтобы убедиться в корректной работе кластера:
-
На каждом экземпляре
routerвыполните проверку vshard.router:tarantool> vshard.router.info()-- no issues in the output-- sum of 'bucket.available_rw' == total number of buckets -
На каждом экземпляре
storageвыполните проверку репликации:tarantool> box.info-- box.info.status == 'running'-- box.info.ro == 'false' on one instance in each replica set.-- box.info.replication[*].upstream.status == 'follow'-- box.info.replication[*].downstream.status == 'follow'-- box.info.replication[*].upstream.lag <= box.cfg.replication_timeout-- can also be moderately larger under a write load -
На каждом экземпляре
storageвыполните проверку vshard.storage:tarantool> vshard.storage.info()-- no issues in the output-- replication.status == 'follow' -
Проверьте логи всех экземпляров на наличие ошибок приложения.
Если откат выполняется до достижения точки невозврата, ваши данные полностью совместимы с версией, которая была до обновления. В этом случае откат выполняется так же: перезапустите уже обновленные узлы на исходной версии.
Если в процессе обновления точка невозврата пройдена (выполнена функция
box.schema.upgrade()), для отката требуется понижение версии схемы до исходной.
Чтобы проверить, доступно ли автоматическое понижение версии до вашей исходной версии, выполните
функцию box.schema.downgrade_versions(). Если нужная версия присутствует в списке, выполните следующие шаги на
каждом обновленном наборе реплик для отката:
- Выполните функцию
box.schema.downgrade(<version>)на мастере, указав исходную версию. - Выполните функцию
box.snapshot()на каждом экземпляре набора реплик, чтобы реплики сразу увидели пониженную версию базы данных после перезапуска. - Перезапустите все read-only экземпляры набора реплик на исходной версии по очереди.
- Назначьте один из обновленных экземпляров новым мастером, следуя соответствующей инструкции из раздела Переключение мастера.
- Перезапустите последний экземпляр набора реплик (бывший мастер, теперь реплика) на исходной версии.
Затем включите failover или балансировщик обратно, как описано в разделе Обновление хранилищ.
В случае неудачного обновления после прохождения точки невозврата выполните следующие шаги для отката к исходной версии:
- Остановите все экземпляры кластера.
- Сохраните файлы снимков состояния и
xlogсо всех экземпляров, данные которых были изменены после последней процедуры резервного копирования. Эти файлы помогут применить изменения позже. - Сохраните последние резервные копии со всех экземпляров.
- Восстановите исходную версию Tarantool на всех хостах кластера.
- Запустите кластер на исходной версии Tarantool.
-
Вручную примените последние изменения данных из сохраненных на шаге 2 файлов
xlogс помощью модуля xlog. На экземплярах, где произошли эти изменения, выполните следующее:- Определите значение vclock последней операции в исходном WAL.
- Воспроизведите операции из более нового xlog, начиная с этого значения vclock, на данном экземпляре.
Дополнительные сведения о восстановлении Tarantool см. в разделе Аварийное восстановление.
Выполните функцию box.info:
tarantool> box.info
Убедитесь, что выполняются следующие условия:
-
Параметр
box.info.statusимеет значениеrunning. -
Параметры
box.info.replication[*].upstream.statusиbox.info.replication[*].downstream.statusимеют значениеfollow. -
Параметр
box.info.replication[*].upstream.lagменьше или равенbox.cfg.replication_timeout(может быть умеренно больше при нагрузке на запись). -
Параметр
box.info.roимеет значениеfalseпо крайней мере на одном экземпляре в каждом наборе реплик.
Затем выполните функцию box.info еще раз и проверьте, что значения box.info.replication[*].upstream.lag обновились.
Выполните функцию vshard.storage.info():
tarantool> vshard.storage.info()
Убедитесь, что выполняются следующие условия:
- Нет проблем или предупреждений.
- Параметр
replication.statusимеет значениеfollow.
Выполните функцию vshard.router.info():
tarantool> vshard.router.info()
Убедитесь, что выполняются следующие условия:
- Нет проблем или предупреждений.
- Все бакеты доступны (сумма значений параметра
bucket.available_rwпо всем наборам реплик равна общему количеству бакетов).
-
Cartridge. Если кластер работает на Cartridge, переключить мастер можно в веб-интерфейсе. Для этого перейдите на вкладку Cluster, нажмите Edit replica set и перетащите экземпляр в начало списка Failover priority, чтобы сделать его мастером.
-
Raft. Если в кластере используется автоматический выбор лидера, переключите мастера, выполнив следующие шаги:
- Выберите кандидата - экземпляр в режиме read-only, который станет новым мастером.
- Выполните функцию
box.ctl.promote()на кандидате. Операция запустит и дождется завершения выборов. - Выполните функцию
box.cfg{ election_mode = "voter" }на текущем мастере. - Убедитесь, что кандидат стал новым мастером: значение параметра
box.info.roдолжно бытьfalse.
-
Устаревший способ. Если кластер не работает на Cartridge и не использует автоматический выбор лидера, переключите мастера, выполнив следующие шаги:
-
Выберите кандидата – экземпляр в режиме read-only, который станет новым мастером.
-
Выполните функцию
box.cfg{ read_only = true }на текущем мастере. -
Убедитесь, что значение vclock кандидата совпадает со значением мастера: значение параметра
box.info.vclock[<master_id>]на кандидате должно быть равно значению параметраbox.info.lsnна мастере. Здесь<master_id>– это значениеbox.info.idна мастере.Если значения vclock не совпадают, остановите процедуру переключения и восстановите состояние набора реплик, выполнив функцию
box.cfg{ read_only == false }на мастере. Затем выберите другого кандидата и повторите процедуру.
-
После переключения мастера выполните проверку репликации на каждом экземпляре набора реплик.