Size: a a a

2021 January 05

A

Artur in ctodailychat
Oleg
Я бы не сказал что мы специально тестируем именно момент отката. Это происходит само собой - т.е. у нас есть 1 RC Stage, куда QA выкатывает новую фичу и в рамках нее схема меняется на новую. Когда QA выкатывает другую фичу, то предыдущая должна успешно откатиться и потом накатиться новая. И так несколько раз за день.
понятно, спасибо! выглядит немного опасно) стало интересно в фразе “иногда приходится все стопать и руками что-то докручивать (тьфу-тьфу, давно так не делали)” иногда и давно - это как?
источник

A

Artur in ctodailychat
Igor V
Ключ к успеху:  релиз новой версии схемы и релиз новой версии приложения это два разных релиза разделенных по времени. Кроме того, база какое-то время может находится в промежутном состоянии между релизами.

Правила простые, но требуют дисциплины.

Например, в релизе А добавляем колонку, а уже в релизе Б делаем ее NOT NULL.
Или если раньше писали в таблицу M, а в новой версии нужно писать в таблицу Z, то вначале выкатываем таблицу Z + on insert  триггер для М. Затем через какое-то время выкатываем приложение и деактивируем триггер.

Никогда ничего не удаляем в том же релизе где добавляем.

С таким подходом откат изменений вообще не является проблемой, потому что каждый компонент живет своей жизнью.
получается, в релизе 1 колонка добавляется в базу, в релизе 2 - в приложение? или деплоймент состоит из двух независимых шагов?
источник

O

Oleg in ctodailychat
Artur
понятно, спасибо! выглядит немного опасно) стало интересно в фразе “иногда приходится все стопать и руками что-то докручивать (тьфу-тьфу, давно так не делали)” иногда и давно - это как?
так приходилось делать, например, если кто-то решил повесить в PostgreSQL 9.x дефолт на новую колонку, куда идет активная запись. И в этот момент мир замирает. К счастью мы стали умнее и PG больше так не делает.
Но вцелом это приходит со временем - что можно, что нельзя. Грубо говоря сделать update all на базе сотни GB плохая идея
источник

AS

Alexey Samoylov in ctodailychat
У нас просто ничего не удаляется и почти ничего не альтерится, это позволяет старым инстансам приложения работать со старой схемой, а новым пользоваться уже новой. Ну и, как правильно выше сказали, миграция схемы и миграция данных это организационно две разных миграции.
источник

ИМ

Илья Макеев... in ctodailychat
а ктонить в курсе как мне пэйпал сам карту привязал новую вместо старой?
источник

IV

Igor V in ctodailychat
Artur
получается, в релизе 1 колонка добавляется в базу, в релизе 2 - в приложение? или деплоймент состоит из двух независимых шагов?
База релизится отдельно от приложения.

Зарелизили базу - добавили новую колонку с NULL
Через несколько дней зарелизили приложение которое пришет в эту колонку и резолвит NULL на значения по-умолчанию. В этом релизе или в следующем делаем колонку NOT NULL
источник

A

Artur in ctodailychat
Alexey Samoylov
У нас просто ничего не удаляется и почти ничего не альтерится, это позволяет старым инстансам приложения работать со старой схемой, а новым пользоваться уже новой. Ну и, как правильно выше сказали, миграция схемы и миграция данных это организационно две разных миграции.
я правильно понимаю, что это накладывает ограничения вроде того, что not null поле должно иметь default? а как происходит изменение, например, отношения сущностей один-ко-многим на многие-ко-многим?
источник

A

Artur in ctodailychat
Igor V
База релизится отдельно от приложения.

Зарелизили базу - добавили новую колонку с NULL
Через несколько дней зарелизили приложение которое пришет в эту колонку и резолвит NULL на значения по-умолчанию. В этом релизе или в следующем делаем колонку NOT NULL
понятно. организационно для разработчика у вас это одна задача или несколько? как вы делаете так, чтоб банально не забыть?
источник

AS

Alexey Samoylov in ctodailychat
Artur
я правильно понимаю, что это накладывает ограничения вроде того, что not null поле должно иметь default? а как происходит изменение, например, отношения сущностей один-ко-многим на многие-ко-многим?
Если записей много, то автоматически связи пересчитывать при деплое через ci/cd и не получится скорее всего, можно упереться в таймауты исполнения шагов. То есть тут только ручками.
источник

AS

Alexey Samoylov in ctodailychat
Задеплоил новый тулинг, апдейтишь свои сотни гиг неспешно батчами
источник

A

Artur in ctodailychat
у нас проблемы с таймаутами пока не предвидится. но есть проблема со стабильностью качества. поэтому максимально все на всех стадиях делается автоматически скриптами из гита, никаких ручек
источник

O

Oleg in ctodailychat
Alexey Samoylov
Задеплоил новый тулинг, апдейтишь свои сотни гиг неспешно батчами
Такое можно делать еще в рамках функциональности самого приложения. Т.е. у нас приложение умеет делать отложенные задачи. Вот заполнение новых колонок данными это такая же фича приложения как и другие
источник

ES

Egor Suvorov in ctodailychat
Artur
хочу в 2021 развивать у себя в компании тему с отказоустойчивостью, в том числе откатов деплойментов. но не понимаю пока даже концептуального решения для этого: либо при откате теряются пользовательские данные, либо запускаются скрипты отката на предыдущую версию схемы, которые по сути могут так же с легкостью крэшнуться
#fomo
источник

AS

Alexey Samoylov in ctodailychat
Artur
у нас проблемы с таймаутами пока не предвидится. но есть проблема со стабильностью качества. поэтому максимально все на всех стадиях делается автоматически скриптами из гита, никаких ручек
Ну тогда просто не переименовывайте колонки, не ковыряйте нот нулл на живую, и осторожно добавляйте внешние ключи. И с энамами могут быть сложности.
источник

A

Artur in ctodailychat
ну вот кстати, может, где-то есть хорошее описание этого подхода с перечислением подобных ограничений?
источник

A

Artur in ctodailychat
или каждый сам для себя его заново выдумывает
источник

AS

Alexey Samoylov in ctodailychat
Каждый сам их в сентри рано или поздно видит 😐
источник

A

Artur in ctodailychat
))
источник

IV

Igor V in ctodailychat
Artur
понятно. организационно для разработчика у вас это одна задача или несколько? как вы делаете так, чтоб банально не забыть?
Есть набор правил что делать в ситуации когда добавляем, меняем, переносим в другую таблицу, удаляем колонку или удаляем таблицу. Все они в вики.  Некоторые правила вынесены в CI (например, что нельзя добавлять и удалять в одном релизе), а другие решаются на организационом уровне. Так например, изменение схемы всегда требует ревью от ключевых разработчиков. Разработчик не может менять схему без скриптов для backward/forward compatibility. Дальше уже при планировании релиза решается как именно выкатывать.

Здесь абсолютно не важно как именно задача была прописанна в джире, потому что мы релизим артефакты, а не задачи про их созданию. Обычно на командом уровне есть свои практики как описывать такие задачи.
источник

A

Artur in ctodailychat
например, сегодня гуглил эту тему, и  между делом нашел https://www.martinfowler.com/articles/evodb.html. с удовлетворением отметил, что мы и так это все делаем, но это не решает проблему откатов, к сожалению. а вот был бы такой же гайд про chaos engineering for rdmbs schema migrations
источник