Skip to content
Snippets Groups Projects
versioning.md 8.31 KiB
Newer Older
Sergey V's avatar
Sergey V committed
# Versioning
Sergey V's avatar
Sergey V committed

Sergey V's avatar
Sergey V committed
Разделяем версию схемы и версию приложения. Для версионирования схемы используем правила SemVer. Для приложения - по желанию пользователя, единственное требование -- чтобы у любых двух приложений с разной логикой были разные пары (имя приложения, версиия приложения).
Sergey V's avatar
Sergey V committed

Приложение должно работать только когда в кластере на всех мастер инстансах во всех репликасетах приложения такой же версии. Проверка версий запущенных приложений делается через Raft log. Каждое приложение при старте ждет коммита своей версии в Raft log.
Sergey V's avatar
Sergey V committed

Sergey V's avatar
Sergey V committed
Версия схемы в кластере меняется только вперед. Любые изменения схемы сопровождаются увеличением версии. Откатить нельзя (кроме восстановления из backup).
Sergey V's avatar
Sergey V committed

Sergey V's avatar
Sergey V committed
Зависимость приложения от версии схемы задается явно двумя способами:
Sergey V's avatar
Sergey V committed

Sergey V's avatar
Sergey V committed
1. (Обязательно). В коде приложения. Если в приложении задана зависимость от схемы v3.2.1, то это приложение не должно запускаться, если в кластере и, соответственно, на инстансе не выполняется уcловие: 3.2.1 <= версия схемы < 4.0.0, за исключением случаев, описанных в 2. . В случае обнаружeния несовместимой версии схемы Picodata должна моментально останавливать приложение и ждать, пока схема станет совместимой. При этом должно выводиться соответствующее сообщение в лог.
2. (Опционально). Глобально в кластере в реплицируемом через Raft хранилище конфигурации может быть задано множество вариантов совместимости любой версии схемы с любой версией приложения. Этот признак совместимости имеет приоритет над первым. Т.е. когда Picodata запускает приложение, сначала проверяется признак совместимости по глобальному кластерному конфигу: если совместимо, то Picodata запускает приложение НЕЗАВИСИМО ОТ ПРАВИЛ SEMVER. Предполагается, что администратору может понадобиться задать совместимость таким образом при решении проблем, см. пример ниже.
Sergey V's avatar
Sergey V committed

Sergey V's avatar
Sergey V committed
Проверка совместимости версих включена по умолчанию, но ее можно выключить на случай, когда пользователь считает, что он умный и знает, что делает.
Sergey V's avatar
Sergey V committed

Sergey V's avatar
Sergey V committed
## Пример, когда нужно воспользоваться способом задания совместимости №2.
Sergey V's avatar
Sergey V committed

Sergey V's avatar
Sergey V committed
Выкатили новую версию приложения и новую обратно несовместимую версию схемы:
Sergey V's avatar
Sergey V committed

```
Sergey V's avatar
Sergey V committed
               APP  APP_DEPENDS_ON_SCHEMA  SCHEMA
    было:       v5                 v1.2.3  v1.2.3
    выкатили:   v6                 v2.0.0  v2.0.0
Sergey V's avatar
Sergey V committed
```

После выкатки обнаружось, что в приложении v6 критичный баг. Принято решение откатить приложение на v5. Но оно не запустится на схеме v2.0.0 даже если отключить проверку совместимости версий. Для решения проблемы схему меняют так, чтобы приложение v5 могло запуститься. Этим изменениям схемы присваивают версию v3.0.0. Глобально в кластерном конфиге задается совместимость app v5 и schema v3.0.0. После этого приложение v5 можно запустить в кластере с версией схемы v3.0.0, хотя приложение v5 было разработано и собрано в прошлом, когда про schema v3.0.0 еще не было известно.
Sergey V's avatar
Sergey V committed

Sergey V's avatar
Sergey V committed
## Алгоритм запуска инстанса.
1. Подключиться к Raft кластеру и актуализировать Raft журнал.
1. Сформировать из глобального конфига кластера параметры репликации для данного инстанса.
Sergey V's avatar
Sergey V committed
1. Проверить совместимость версии приложения и схемы в кластере. Если несовместимы, написать об этом в лог.
1. Закоммитить в глобальный конфиг через raft log версию запускаемого приложения.
Sergey V's avatar
Sergey V committed
1. Запустить Tarantool даже если версия приложения несовместима со схемой.
1. Накатить все изменения схемы из глобального конфига кластера.
1. Есили запускаемое приложение содержит обновления схемы, то применить их глобально в кластере.
Sergey V's avatar
Sergey V committed
1. Если версии совместимы, запустить приложение Picodata, иначе писать в лог и ждать, пока версии станут совместимы.
Sergey V's avatar
Sergey V committed

Sergey V's avatar
Sergey V committed
## Обновления и downtime
Sergey V's avatar
Sergey V committed

Sergey V's avatar
Sergey V committed
Под downtime подразумевается длительное время, когда клиенты приложения Picodata не могут в полной мере пользоваться его функциями. Switchover и failover происходят относительно быстро и не считаются downtime. Перезапуск репликасета Tarantool со снапшотами по 10 GB считается долгим, т.к. обычно занимает 10-20 минут, поэтому считается downtime.
Sergey V's avatar
Sergey V committed

Sergey V's avatar
Sergey V committed
Простой вариант. В этом варианте обновления будут проходить с даунтаймом на время, пока все инстансы раскатятся, перезапустятся, и Tarantool в них запустится из снапшота и накатит X-логи. Для выполнения такого обновления нужно обновить файлы приложения и перезапустить все инстансы в любом порядке, можно все сразу, можно по одному, без разницы.
Sergey V's avatar
Sergey V committed

Sergey V's avatar
Sergey V committed
Сложный вариант - обновление приложения Picodata без downtime.
1. В каждом replica set остановить все инстансы, кроме одного. Рекомендуется останавливать реплики, оставлять работать текущего мастера.
1. Обновить приложение (файлы) на остановленных инстансах.
1. Запустить ранее остановленные инстансы.
1. Дождаться, пока Tarantool считает данные и запустится.
1. Остановить инстансы, на которых приложение еще не обновлено. При этом произойдет switchover, запустятся новые версии приложения, выполнится обновление схемы.
1. Обновить приложение (файлы) на оставшихся инстансах и запустить их.