Канареечное (canary) развёртывание – это метод разработки и развертывания программного обеспечения, который позволяет выпускать новые функции и обновления постепенно – сначала для небольшой группы пользователей, а затем для всей базы пользователей.
Такой подход предполагает, что вы создаете новую версию программного обеспечения и развертываете ее для небольшой группы пользователей, но при этом остальные пользователи продолжают пользоваться старой версией. После чего команда разработчиков внимательно наблюдает за новой версией с целью убедиться, что она стабильна и работает как надо.
Если все будет идти хорошо, новую версию развернут уже для большего числа пользователей, и так далее, пока в конечном итоге она не достигнет всех пользователей. Таким образом, команда проекта минимизирует риск появления ошибок или каких-то других проблем, которые могут затронуть сразу всех пользователей.
Цель канареечного развертывания – снижение риска для большой базы пользователей при внедрении новых функций. Распространяя изменения среди пользователей постепенно, разработчики могут отслеживать производительность и стабильность новой версии и вносить все необходимые корректировки перед тем, как развернуть ее для всей базы пользователей. Тем самым переход на новую версию происходит более плавно.
1. Основные концепции и преимущества
Вот так выглядят основные концепции канареечного развертывания:
- Сначала новая версия развертывается для небольшой группы пользователей, а затем постепенно распространяется для большего числа.
- Новую версию необходимо внимательно отслеживать, чтобы убедиться, что она стабильна и работает правильно.
- При возникновении каких-либо проблем, можно быстро и легко откатить развертывание к предыдущей версии.
- Процесс развертывания стоит максимально автоматизировать, чтобы минимизировать человеческий фактор.
Канареечное развертывание имеет некоторые преимущества для DevOps, а именно:
- Внедряя изменения постепенно, вы, таким образом, минимизируете риск появления ошибок и прочих проблем, которые могут затронуть сразу всех пользователей.
- Разработчики могут быстрее получать обратную связь, что позволяет им вносить любые необходимые изменения до того, как новая версия будет развернута для всей базы пользователей.
- Отслеживая производительность и стабильность новой версии, разработчики могут убедиться в том, что она соответствует всем необходимым стандартам качества, до того, как развернут ее для всей базы пользователей.
- Канареечное развертывание помогает разработчикам и всем заинтересованным сторонам быть более уверенными в том, как пройдет процесс развертывания, поскольку снижает риск возникновения проблем, которые могут повлиять на взаимодействие с пользователями.
2. Терминология канареечного развертывания
Давайте пройдемся по стандартному жизненному циклу процесса.
Все начинается с группы Canary, то есть группы «ранних пользователей» новой версии системы. Параллельно с ней существует еще одна группа – Baseline. К этой группе относятся все пользователи, оставшиеся за пределами группы Canary.
Пока пользователи Canary продолжают использовать новую версию, канареечное развертывание распространяет ее на все большее количество пользователей. Это называется переключением трафика. Группа Canary растет, а группа Baseline – уменьшается, таким образом, система выполняет постепенное развертывание.
По ходу дела система мониторинга регистрирует все действия и показатели использования и генерирует метрики, которые нужны разработчикам в качестве обратной связи. После чего разработчики изучают это все и исправляют все, что необходимо, или в случае, если они не могут в данный момент устранить проблемы, просто откатывают программу к исходной версии.
Лучше всего автоматизировать все действия, касающиеся мониторинга и развертывания. Это даст разработчикам возможность сосредоточиться исключительно на устранении проблем.
Может оказаться так, что группа Canary обнаружит, что какие-то функции новой версии не оправдали ожиданий, а некоторые получились очень даже неплохими. Таким образом, разработчики могут помечать флагами функции, в которых есть проблемы, и исключать их из процесса развертывания.
Разработчики внимательно следят за обеими группами одновременно. Пользователи генерируют результаты А/В-тестирования, которые дают понять, как ведут себя старая и новая версии, и какая из них лучше. В новой версии также постоянно выполняются автоматические тестирования, обеспечивающие основательность проверки работоспособности группой Canary.
3. В чем отличие от обычного развертывания?
Если разобрать процессы жизненного цикла более высокого уровня, то различия между канареечными процессами развертывания и обычными становятся вполне очевидными.
- Вы выполняете развертывание постепенно, при этом контролируя его, вместо того, чтобы развертывать продукт сразу для всех пользователей, ожидая проблем, которые затронут всех сразу.
- Вы ограничиваете риск появления ошибок в новых версиях группой Canary, а не подвергаете опасности весь мир.
- Вы отслеживаете новую версию до того, как она дойдет до всех пользователей, а не после, вкладывая при этом огромное количество времени и ресурсов в «гиперопеку» в процессе релиза.
- Вы можете откатить новую версию до того, как она полностью развернется в рабочей среде. Впрочем, планируется дополнительное окно релиза, которое позволит отменять релиз после завершения рабочей версии.
- Канареечное развертывание естественным путем заставляет вас вкладываться в автоматизацию инструментов и процессов, если это возможно. Что же касается стандартных стратегий развертывания, здесь все мероприятия по автоматизации сами собой перемещаются в конец списка дел.
4. CI/CD-конвейер и канареечное развертывание
В обычном CI/CD-конвейере изменения автоматически создаются, тестируются и развертываются в промежуточной среде для последующего тестирования перед развертыванием в рабочей среде. Это также хорошо подходи для канареечного развертывания.
После того, как изменения буду развернуты в промежуточной среде и пройдут все необходимые тестирования, конвейер CI/CD автоматически развернет канареечную версию для небольшой группы пользователей в производственной среде.
Если вдруг что-то пойдет не так, вы просто запустите другой конвейер для отката этой версии. Или пометьте проблемные функции, и они никогда больше не попадут в конвейер развертывания. Все происходит автоматически, и вам больше не нужно об этом волноваться.
Так как канареечная версия полна автоматизированных тестов на работоспособность, все они, естественно, добавляются к основным функциям CI/CD-конвейеров. Так или иначе, это неотъемлемая часть любого хорошего CI/CD-конвейера.
5. Процесс и этапы канареечного развёртывания
Обобщив всю информацию, можно сказать, что это самый обычный процесс стандартного канареечного развертывания, который вы можете использовать для своего проекта. Вот он:
#1. Планирование и подготовка
На этом этапе команда разработчиков планирует и готовиться к канареечному развертыванию. Здесь происходит определение изменений и обновлений, которые нужно внести, создание новой версии ПО, а также определение метрик и показателей работоспособности, которые будут использоваться для отслеживания производительности новой версии. Кроме того, команда определяет группу пользователей, которые получат новую версию первыми, и план развертывания.
#2. Переключение трафика и мониторинг
Здесь новая версия ПО развертывается для пользователей, которых команда определила на этапе планирования. Для того, чтобы пользователи могли пользоваться новой версией, часть пользовательского трафика перенаправляется, но при этом старая версия по-прежнему функционирует для остальных пользователей. Новая версия тщательно отслеживается с помощью метрик и проверок работоспособности, проверяется ее производительность и стабильность. Это необходимо, чтобы гарантировать, что она работает так, как надо.
#3. Анализ и оценка производительности
Исходя из метрик и проверок работоспособности, определенных на этапе планирования, анализируется и оценивается производительность версии. Если новая версия работает без нареканий, со временем она дойдет и до всех пользователей. А если есть какие-то проблемы, то развертывание можно быстро откатить к предыдущей версии.
#4. Продвижение или откат развертывания
На этом этапе команда разработчиков принимает решение, продвигать новую версию дальше или откатить ее к предыдущей. Если новая версия работает хорошо и соответствует всем необходимым стандартам качества, она распространяется среди всех пользователей. Если же с новой версией возникли какие-либо проблемы, ее развертывание можно легко и быстро откатить к предыдущей версии.
6. Практические рекомендации и стратегии
Внедряя в свою платформу канареечное развертывание, начните с определения четких целей и того, как должен выглядеть конечный результат. Здесь вы можете конкретизировать такие вещи, как показатели производительности, критерии оценки пользователей и влияние на коммерческую деятельность.
Создайте небольшую группу пользователей, которые будут тестировать новую (канареечную) версию ПО. Большой размер группы на момент начала не дает никакого преимущества. Вам нужно быть как можно более подвижными, особенно в самом начале.
Как мы уже не раз говорили, отслеживайте производительность и стабильность новой версии с помощью метрик и проверок работоспособности. Старайтесь решать проблемы сразу по мере их возникновения. Когда речь идет о постепенном развертывании, то лучше отреагировать на проблему слишком остро, чем недооценить ее.
Распространяйте новую версию среди пользователей постепенно. Так вы обеспечите более плавный переход к новой версии.
По возможности используйте инструменты и процессы автоматизации, чтобы автоматизировать процессы развертывания и мониторинга. Добавьте их в конвейеры CI/CD, и запланированные процессы развертывания будут запускаться автоматически. Таким образом, вы сможете минимизировать человеческий фактор и гарантировать, что процесс развертывания будет согласованным и воспроизводимым.
Внедрите такую вещь, как флаги функций, чтобы иметь возможность включать и исключать определенные функции ПО. Вы сможете контролировать будущие процессы развертывания, и при этом вам не придется постоянно вручную вносить изменения или обновлять. Вы сможете сконцентрироваться на вещах, важных для разработчика, - на исправлении ошибок.
Используйте А/В-тестирование, чтобы сравнивать производительность двух разных версий ПО. Назначьте пользователей этих версий случайным образом, и определите, какая версия работает лучше. Учитывайте это, когда будете принимать решения.
Убедитесь, что вы можете быстро и в любое время выполнить откат развертывания, если вдруг с новой версией возникнут какие-то проблемы. Таким образом, вы сможете смягчить последствия любых проблем и быстро восстановить предыдущую версию ПО.
7. Проблемы и конкретные примеры
У канареечного развертывания есть явные преимущества, но все же существуют некоторые проблемы.
Одна из проблем канареечного развёртывания – это задержка в сети, которая может повлиять на производительность новой версии ПО. Разработчики могут решить эту проблему, прибегнув к помощи таких инструментов, как балансировщик нагрузки и сеть доставки содержимого, чтобы повысить производительность сети. Эта задержка будет влиять не только на внешних пользователей, но и на внутренние процессы, такие как развертывание и выполнение конвейеров CI/CD. Они должны выполняться максимально быстро, а иначе у вас выстроится очередь разработчиков в состоянии простоя, ожидающих завершения работы конвейеров.
Еще одна проблема – обеспечение согласованности данных между старой и новой версиями ПО. Чтобы решить эту проблему и гарантировать согласованность данных во всех версиях, разработчики могут воспользоваться такими методами, как репликация или синхронизация баз данных. Тот факт, что пользователи работают как в старой, так и в новой версиях одновременно, только увеличивают сомнения в том, что обе версии будут всегда полностью синхронизированы, и что пользователи не теряют никаких данных только потому, что находятся в одной из двух групп - Canary или Baseline. Это может оказаться крайне сложным, так что помогите себе, запустив надежные фоновые процессы.
Довольно известный пример – это Netflix. Эта компания использует канареечное развертывание для того, чтобы вносить изменения в свой стриминговый сервис. Чтобы внедрять изменения постепенно, компания использует комбинацию из автоматизированного тестирования, флагов функций и А/В-тестирования.
Еще один пример – Google. Компания использует канареечное тестирования, чтобы внедрять изменения в свои облачные службы. Аналогично, компания пользуется преимуществами автоматизированного тестирования, разделения трафика и приобщения мониторинга, чтобы развертывать изменения шаг за шагом – сначала для небольшой группы пользователей, а затем и для всей базы. С помощью такого подхода компания Google смогла улучшить качество и стабильность своих служб.
Заключение
Как и любой другой процесс, подход или стратегия, канареечное развертывание не является решением всех мировых проблем. Встречаются случаи, когда его практически невозможно реализовать из-за ограничений среды, недостатка знаний или полного отсутствия понятия концепции данной технологии.
Такое развертывание больше всего подходит для проектов нового времени, то есть проектов, где гибкое мышление является незыблемым качеством, автоматизация всех процессов – неоспоримым приоритетом, а максимальный уровень надежности – вполне обоснованным ожиданием заинтересованных лиц.
В таком случае канареечное развертывание в некотором смысле является следующим уровнем гибкой разработки. Оно может поднять команды на тот уровень проектов, где они еще никогда не были.