Lamoda приехала!
В контейнерах.
О том, как мы переходим на докер.
Александр
Афенов
Senior
developer
Lamoda
Кто мы?
IT в Lamoda
• Подразделения в Москве и Вильнюсе
• ~300 сотрудников
• In-house разработка 60+ проектов
Команда bobcat
• Сервис order processing
Наши проекты:
• Сайт
• Мобильные приложения (Android, iOS)
• Система управления складом
• Менеджмент адресных объектов
• Автоматизация работы собственной службы доставки
• Сервис по взаимодействию с внешними курьерками
• Система рекомендаций
• Автоматизация работы студии
• Процессинг заказов
• Сервис оплаты
• …
Мы используем:
О процессе разработки:
• Pull request
• Code review
• Тестирование
Предпосылки к докеризации
Разница между окружениями
BLACK FRIDAY
Разделение ответственности
• Администраторы отвечают за железо и сеть
• Разработчики отвечают за программное обеспечение
• Любая система легко декомпозируется
Выбор программного обеспечения
Выбор service discovery
Consul / ZooKeeper
Выбор оркестратора
Kubernetes Mesosphere Nomad
Синхронизация балансера и Consul
Nginx+
Service instance 1 Service instance 2 Service instance N
CONSUL
traefik
Service instance 1 Service instance 2 Service instance N
CONSUL
Возникшие трудности
О логировании
• Логи приложения
• Access-логи
• Логи обменов
Fallback
balancer
Order processing
instance
CREATE ORDER
MySQL Cluster
connect
I’ve gone away
HTTP 500
Fallback
OpenResty: nginx & LuaJIT
Файловые маунты
S3 / Ceph
Cronjobs
Nomad scheduler vs application container
Итоги
• Единообразное окружение на бою, в тестировании и
разработке
• Упрощение отладки и воспроизведения проблем
• Разработчики не думают о железе
• Системные администраторы не касаются работы ПО
• Простота технического аудита систем
https://www.nomadproject.io/
https://www.nginx.com/products/
https://traefik.io/
https://openresty.org
http://ceph.com/
Александр
Афенов
Senior
developer
Lamoda
Вопросы?
www.tech.lamoda.rualeksandr.afenov@lamoda.ru
Кейс
Swiftmailer tricky failure

Александр Афенов

Editor's Notes

  • #3 Один из крупнейших e-commerce в России Предоставляем как услуги business to client Продаем одежду, обувь, аксессуары, храним миллионы товаров на собственных складах и складах партнеров и развозим как своей службой доставки Lamoda Express, так и при помощи внешних курьерских служб Так же представляем B2B услуги по размещению товаров других компаний на нашем сайте
  • #4 Москва – разработка оснвоных информационных систем Вильнюс – программное обеспечение для колл-центра часть системных администраторов
  • #6 СВОЙ САЙТ И МОБИЛЬНЫЙ САЙТ ПРИЛОЖЕНИЯ КОГДА-ТО БЫЛИ ЛИШЬ ВЬЮШКАМИ ДЛЯ МОБ САЙТА НО СЕЙЧАС МЫ КРУТЫЕ Управление складом: от банального подсчета KPI сотрудников до разработки прошивок для мобильных сканеров штрихкодов И автоматизации управления сортировщиками и конвеерами Синхронизация адресных объектов с внешними системами Своя доставка Курьерки – статусы, оповещения Обработка и хранение миллионов заказов Взаимодействие с сервисами оплаты
  • #7 Мы используем php7 / go в сервисах для пушей, питон в апи сайта и модуле по работе с купонами, в качестве хранилищ выступают постгре и мускуль, используем редис для кешей и счетчиков мониторинга, Solr в поиске, RabbitMQ для обмена сообщениями
  • #8 Для управления проектом, постановки задач и логирования времени используем Jira, код ворочаем в Stash Команда смотрит и одобряет (в идеале) pull request, после чего задача переходит в стадию тестирования. Именно на этом процессе остановимся чуть подробнее, так как желание его видоизменить – одна из предпосылок к докеризации. QA-специалист раскладывает ветку из стеша на своем личном стенде. И вот тут есть нюанс
  • #9 Теперь поговорим о том, что же такое докеризация и какие к этому были предпосылки Докер - это открытая платформа для доставки приложений, которая реализует концепцию контейнерной виртуализации И позволяет запустить ваше приложение в изолированных контейнерах, сэкономив ресурсы по сравнению с виртуальными машинами, работающими через гипервизор Одним из своих основных плюсов авторы докера называют устранение типовой проблемы «на моём компе все это работало правильно» именно об этом мы и поговорим чуть подробнее
  • #10 Нюанс. На определенном этапе сложилось расхождения на организационном уровне: поддержкой боевых и тестовых стендов занимались разные люди, что привело к расхождению инфраструктур. Стенд тестировщика в виртуалке на FreeBsd. Ветки раскладываются через jenkins, агент которого есть на каждой виртуалке. На бою cent os Таким образом закономерно появилось желание унифицировать окружение в разработке, тестировании и на бою. Разработчик при выполнении задачи и при отладке наблюдает состояние системы максимально приближенное к боевому. Это же касается и тестировщика, который в итоге получает на руки систему в виде множества контейнерор похожих на продакшен. И тут мы переходим к следующей причине, исторической
  • #11 Одна из отправных точек Что такое черная пятница Это крупнейший день распродаж в году, приходится на двадцатые числа ноября Вы могли слышать о таких событиях как «киберпонедельник» или «день холостяка» Для наших it-систем такой день означает одно: большой наплыв посетителей, многократный рост нагрузки по сравнению с любым другим днём года, необходимость Временно выделить дополнительные вычислительные ресурсы и многократно убедиться в том, что не возникнет проблем со стабильностью работы Имела место быть смена команд системных администраторов перед Черной пятницей несколько лет назад. Важно понимать, что для крупного e-commerce-проекта это один из важнейших дней в году, но сокращение «ЧП» появилось не просто так. Подобная акция – это серьезная проверка на прочность по части производительности и стабильности работы it-систем.
  • #12 Ребята решали задачу комплексно, не только готовясь к повышенным нагрузкам, но и стремясь перейти на новую концепцию: разграничить ответственность за железо и код между собою и разработкой. С переходом на докер-контейнеры каждый проект превратился в понятный набор простых «коробок», стало легче понять каков конечный набор компонентов для каждого конкретного проекта. При этом системные администраторы минимизируют свои столкновения с кодом: возникающие внутри контейнеров программные ошибки и изменение тех или иных метрик системы лежит в зоне ответственности разработчиков. Разработчикам же не нужно думать о железе или о том, какая версия операционки окажется на бою: всё под руками.
  • #13 Теперь поговорим о том, что же такое докеризация и какие к этому были предпосылки Докер - это открытая платформа для доставки приложений, которая реализует концепцию контейнерной виртуализации И позволяет запустить ваше приложение в изолированных контейнерах, сэкономив ресурсы по сравнению с виртуальными машинами, работающими через гипервизор Одним из своих основных плюсов авторы докера называют устранение типовой проблемы «на моём компе все это работало правильно» именно об этом мы и поговорим чуть подробнее
  • #14 Что такое service discovery Задача звучит достаточно просто: при появлении в вашей сети новой ноды, которая готова Предоставлять некие услуги, другие ноды должны иметь возможность узнать об этом и начать ею пользоваться Рассматривался вариант с ZooKeeper, но поддерживать его не хотелось из-за нелюбви к Java, и он не предоставлял достаточно удобного Инструментария для проверки живости сервисов в каждом из контейнеров, а с консулом у команды системных администраторов уже был опыт при Построении архитектуры колл-центра, поэтому выбор был недолгим
  • #15 В процессе докеризации неоднократно вставал вопрос выбора той или иной технологии. Одним из таких вопросов был выбор оркестратора – программного продукта, который управляет созданием, убиением и конфигурацией контейнеров кубенетс были экспериенты в кц и ламоде и все было очень клево если запускаешь на aws как только начинаешь мэйнтэйнить локально со своей сетью и прочим - адище даже удалось достичь юзабеьного состояния но были легаси-системы  нужно было как-то совместить эту инфраструктуру со старой, но не было решения мезосфера давайте с ней можно было совместить старую инфру с новой был план как это сделать правильно все хорошо кроме одного но тогда зукипер мезосфере кластер везде демона и везде много явы КАК Я УЖЕ ГОВОРИЛ зукупер поддерживать не хштелось В сухом остатке – Nomad, вместо котрого сначал вообще были шелл-скрипты, и который на настоящий момент полностью устраивает
  • #17 ПОДАВЛЯЮЩЕЕ БОЛЬШИНСТВО СИСТЕМ РАБОТАЕТ ПО HTTP И ПЕРЕД КАЖДЫМ БАЛАНСЕР Для того чтобы динамически изменять upstream исходя из данных от Consul потребовалось использовать nginx+ upstream api Nginx+ умеет работать с Consul по подписке Эта схема используется для продакшен-среды, для QA применяется traefik. Он позволяет реализовать полностью рабочую схему, но На наш взгляд недостаточно стабилен для боевого применения
  • #18 Эта схема используется для продакшен-среды, для QA применяется traefik. Он позволяет реализовать полностью рабочую схему, но На наш взгляд недостаточно стабилен для боевого применения
  • #19 Теперь поговорим о том, что же такое докеризация и какие к этому были предпосылки Докер - это открытая платформа для доставки приложений, которая реализует концепцию контейнерной виртуализации И позволяет запустить ваше приложение в изолированных контейнерах, сэкономив ресурсы по сравнению с виртуальными машинами, работающими через гипервизор Одним из своих основных плюсов авторы докера называют устранение типовой проблемы «на моём компе все это работало правильно» именно об этом мы и поговорим чуть подробнее
  • #20 Одна из проблем, возникших при переходе на докер – логирование. Сервис order processing, разработкой которого я занимаюсь, пишет три основных типа логов: информацию о работе приложения Access-логи и, самое интересное, логи обменов По долгу службы мы взаимодействуем со многими внешними и внутренними системами, и для того чтобы оперативно И достоверно восстановить ход событий, нам нужно иметь под рукой полную информацию об обменах Например, мы послали на склад оповещение о том, что заказ, в общем-то, пора собирать, и склад ответил ошибкой. Ранее эта информация клалась в базу данных, что было очень удобно: мы ведь это ещё и выводим в веб-интерфейс, но Со временем база стала распухать и мы перешли на elk: elastic search + logstash + kibana Проблемой стало то, что данных мы передаем очень много, и в stdout записывать их не получилось, так как они обрезались по длине около 2к символов, на выходе fluent пишущий в syslog
  • #21 Пока мы не ушли далеко от темы балансеров, упомяну один интересный момент Есть случаи в которых приложение пятисотит, но позволить себе это проигнорировать мы просто не можем Самый яркий пример такого случая: post-запрос на создание заказа Возможны различные варианты, каждый из которых по-своему плох для бизнеса, ведь мы теряем деньги Заказ не был создан – мы потеряли клиента Заказ был создан, приложение ответило некорректно, пришел повторный запрос, мы получили дубликат заказа, это, честно говоря, ничем не лучшев
  • #22 В итоге было принято решение сохранять заказы (запросы на их создание) любой ценой, и с этой целью был сделан fallback на базе Nginx + openresty. Lua-скрипт складирует проблемные запросы, чтобы мы потом могли разобраться и при необходимости переотправить их
  • #23 Сервис обработки заказов работает с различными файлами, например генерирует для клиентов pdf-файлы Для оформления возврата товара, к нам загружают различные отчеты, сканы и так далее. Хранить всё это в файловой системе контейнеров мы не можем ввиду её мгновенной и невозвратной смертности, Каждый раз разворачиваются на разных нодах, мы не стали использовать докеровские маунты и реализовали в приложении поддержку s3 С настоящего момента мы можем лить файлы в облако, а можем (и так и делаем) использовать развернутый у себя Ceph – платформу для организации хранения и доступа к данным
  • #24 В системе много крон-задач, так как регулярно нужно ходить во внешние системы и что-то запрашивать, Разгребать очереди и так далее Изначально использовалась схема 1-крон – 1 контейнер и шедулинг на уровне Nomad К настоящему моменту от неё отказались в пользу одного контейнера со всеми кронами. Каждый крон записывает в базу информацию о локе, так что несколько параллельно работающих контейнеров с кронами не берут одни и те же задачи
  • #25 Рассказать о кейсе про base64