68
Чему мы научились, разрабатывая микросервисы? Мадисон Вадим, М-Тех 2016

Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

  • Upload
    ontico

  • View
    642

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Чему мы научились, разрабатывая микросервисы?

Мадисон Вадим, М-Тех 2016

Page 2: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

• Услуги системной интеграции, начиная от разработки технологических решений и заканчивая доставкой видео-сигнала до конечного пользователя

• Интернет-видеоплатформа для каналов МатчТВ и НТВ-ПЛЮС

• 300 000 одновременных пользователей

• > 1 000 000 уникальных посетителей в сутки

• Отдаем контента до 300 Тб/час

Page 3: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

— Достучаться до небес (фильм)

«Пойми, на небесах только и говорят, что о море. Как оно бесконечно прекрасно…»

Page 4: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Кто не знает, что такое микросервис?

Page 5: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Проблемы микросервисов

Page 6: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Проблемы• Pipeline: для каждого свой проект в git, CI, …

• Сложность системы: распределенные коммуникации, дополнительное API, больше точек отказа и логики их обработки

• Контроль целостности данных, сложность распределенных транзакций

Page 7: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

17 (1/20)→340→1120

Page 8: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Проблемы• Оверхед: сетевой, сериализация/десериализация

• Обнаружение сервисов

• Постоянный контроль независимости сервисов

• Инструментарий!

Page 9: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Page 10: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

А чем они тогда

привлекают?

Page 11: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

В чем бонусы?• Независимая разработка

Page 12: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

В чем бонусы?• Независимая разработка

• Отсутствие завязки на технологии

Page 13: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

В чем бонусы?• Независимая разработка

• Отсутствие завязки на технологии

• Скорость тестирования (независимость при тестировании)

Page 14: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

В чем бонусы?• Независимая разработка

• Отсутствие завязки на технологии

• Скорость тестирования (независимость при тестировании)

• Легкость масштабирования (если она вообще есть)

Page 15: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

В чем бонусы?• Независимая разработка

• Отсутствие завязки на технологии

• Скорость тестирования (независимость при тестировании)

• Легкость масштабирования (если она вообще есть)

• Минимизация ущерба при отказе сервиса (при корректной реализации остальных)

Page 16: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Насколько микро- должен быть -сервис?

Page 17: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Насколько микро- должен быть микросервис?

• По длительности разработки

Page 18: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Насколько микро- должен быть микросервис?

• По длительности разработки

• По количеству строк кода

Page 19: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Насколько микро- должен быть микросервис?

• По длительности разработки

• По количеству строк кода

• По количеству разработчиков за N спринтов

Page 20: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Сервис должен быть независимым!

Page 21: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Как проверить независимость?

Page 22: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Как проверить независимость?1. Опишите бизнес-задачу сервиса одним простым предложением

Page 23: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Как проверить независимость?1. Опишите бизнес-задачу сервиса одним простым предложением

2. Какое количество потребителей у сервиса?

Page 24: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Как проверить независимость?1. Опишите бизнес-задачу сервиса одним простым предложением

2. Какое количество потребителей у сервиса?

3. Приводит ли деплой одного сервиса к деплою других сервисов?

Page 25: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Требования к микросервису• Скрывает внутренние детали реализации

• Деплоится независимо

• Падая, не роняет все остальное

• Легко мониторится

• Реализует бизнес-модель

• Полностью децентрализован

Page 26: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Как готовить?

Page 27: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Конфигурация

Page 28: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

КонфигурацияЧто пробовали?

• файлы конфигурации при деплое разливать по всем целевым машинам

Page 29: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

КонфигурацияЧто пробовали?

• файлы конфигурации при деплое разливать по всем целевым машинам

• файлы конфигурации класть в контейнер

Page 30: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

КонфигурацияЧто пробовали?

• файлы конфигурации при деплое разливать по всем целевым машинам

• файлы конфигурации класть в контейнер

• выставлять переменные окружения

• при сборке контейнера (ENV DB=…)

• при запуске контейнера

Page 31: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Конфигурация• Общее K/V хранилище

• Сервис должен быть заточен под смену конфигурации

• Микс вариаций с приоритетами:

<СЕРВИС>/ (/conf/ms/recorder/)

<СЕРВИС>/<ВЕРСИЯ>/ (/conf/ms/recorder/0.12)

<СЕРВИС>/<СРЕДА>/

<СЕРВИС>/<ВЕРСИЯ>/<СРЕДА>/

<СЕРВИС>/<ВЕРСИЯ>/<НОДА>/

Page 32: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Конфигурация1. git2consul

• не используем отдельные проекты/бранчи в git для основных параметров

• загружаем конфигурацию при деплое

• стартовый путь: /conf/ms/<ИМЯ СЕРВИСА>/<BUILD NO>/

2. Vault все секретное храним в отдельных проектах

Page 33: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Мониторинг

Page 34: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Page 35: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Page 36: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)
Page 37: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

736

Page 38: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Как решать?

Page 39: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Как решать?• Помнить, что микросервисы — они как PHP, только микросервисы

Page 40: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Как решать?• Помнить, что микросервисы — они как PHP, только микросервисы

• Вместо полноценного мониторинга — строим dashboard

Page 41: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Как решать?• Помнить, что микросервисы — они как PHP, только микросервисы

• Вместо полноценного мониторинга — строим dashboard

• Алерты по статистическим и пороговым значениям вместо бинарных

Page 42: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Как решать?• Помнить, что микросервисы — они как PHP, только микросервисы

• Вместо полноценного мониторинга — строим dashboard

• Алерты по статистическим и пороговым значениям вместо бинарных

• На одном dashboard сводить графики хост-машин и статистики по docker-демону

Page 43: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Наш стек

Page 44: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

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

2. Система мониторинга должна быть более надежной и масштабируемой, чем то, что она контролирует

3. Система должна быть оптимизирована для распределенных, недолговечных, облачных, контейнеризованных микросервисов

4. Собирайте метрики часто … очень часто … Стремитесь к интервалам < 10 сек

Общие рекомендации

Page 45: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Тестирование

Page 46: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

В чем сложность?1. Корректность взаимодействия с другими сервисами

Page 47: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

В чем сложность?1. Корректность взаимодействия с другими сервисами

2. Сервис назначения доступен, но:

• Отвечает очень медленно

• Отвечает эпизодически

• Отвечает некорректно

Page 48: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

В чем сложность?1. Корректность взаимодействия с другими сервисами

2. Сервис назначения доступен, но:

• Отвечает очень медленно

• Отвечает эпизодически

• Отвечает некорректно

Circuit Breaker!

Page 49: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

В чем сложность?1. Корректность взаимодействия с другими сервисами

2. Сервис назначения доступен, но:

• Отвечает очень медленно

• Отвечает эпизодически

• Отвечает некорректно

Circuit Breaker![Hystrix, Netflix]

Page 50: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Этапы тестирования

Page 51: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Тестовыйкластер

Raspberry Pi 3 - 6шт

Фото: pocketcluster.wordpress.com

Page 52: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Хранение

Page 53: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Что пробовали?• Проброс файловой системы в контейнер

Page 54: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Что пробовали?• Проброс файловой системы в контейнер

• «Собирающие контейнеры»

Page 55: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Что пробовали?• Проброс файловой системы в контейнер

• «Собирающие контейнеры»

• Shared data volume

Page 56: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Что пробовали?• Проброс файловой системы в контейнер

• «Собирающие контейнеры»

• Shared data volume

• Flocker

Page 57: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Для файлового хранения

Распределенная файловая система: CEPH (http://ceph.com/)

Page 58: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Для БД• Выделенные сервера

• Особая конфигурация машин

• Расширенная сеть

Page 59: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Обнаружение сервисов

Page 60: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Реестр сервисов• consul — key/value хранилище, DNS, Health-Check, работа с несколькими ДЦ из коробки

• etcd — key/value хранилище

• skydock — Health-Check, регистрация docker-контейнеров

• skydns — DNS

• Apache Zookeeper — вариация key/value хранилища, сервис блокировок, вариация на тему DNS

• !redis — запись только в мастер, нет механизма достижения консенсуса при определении актуального состояния данных после выхода из строя отдельных узлов хранилища

Page 61: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Оркестрация• docker swarm [1.2.2] — доставка, регистрация, масштабирование (consul)

• nomad [0.3.2] — доставка, регистрация, масштабирование (consul)

• kubernetes [1.2.4] — доставка, регистрация, масштабирование, LB (etcd)

• mesos [0.28.1] (marathon [1.1.1]) — доставка, регистрация, масштабирование, LB (zookeeper, HAProxy)

Page 62: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Consul Template{{range services}}{{ if in .Tags "demo" }}{{if .Tags | join "," | regexMatch "urlprefix-"}}upstream {{.Name}} { least_conn; {{range service .Name}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=30 weight=1;{{end}}}{{end}}{{end}}{{end}} server { listen 80 default_server; location /health { add_header Content-Type text/plain; return 200 'OK'; } {{range services}}{{ if in .Tags "demo" }}{{if .Tags | join "," | regexMatch "urlprefix-"}} {{range .Tags}}{{ if . | contains "urlprefix-" }}location {{. | replaceAll "urlprefix-" ""}} { {{end}}{{end}} proxy_pass http://{{.Name}}/; # / в конце означает обрезку проксируемого пути proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } {{end}}{{end}}{{end}}}

Page 63: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Consul Template{{range services}} {{ if in .Tags "demo" }} {{if .Tags | join "," | regexMatch “urlprefix-“}} #urlprefix-/playlist upstream {{.Name}} { least_conn; {{range service .Name}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=30 weight=1;{{end}} } {{end}} {{end}} {{end}}

в списке только прошедшие

health-check!

Page 64: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Consul Template{{range services}} {{ if in .Tags "demo" }} {{if .Tags | join "," | regexMatch "urlprefix-"}} {{range .Tags}}{{ if . | contains "urlprefix-" }} # Tag: urlprefix-/playlist location {{. | replaceAll "urlprefix-" ""}} { {{end}}{{end}} proxy_pass http://{{.Name}}/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }{{end}}{{end}}{{end}}

Page 65: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Consul Templateupstream playlistapi { least_conn; server 10.1.1.2:5100 max_fails=3 fail_timeout=30 weight=1;}...

location /playlist { proxy_pass http://playlistapi/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr;}

Page 66: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

http://bit.ly/1TE1KdM Исходные коды примера

Page 67: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Чек-лист Как конфигурировать?

Как мониторить и считать метрики?

Как сервисы будут находить друг друга?

Как сервис будет взаимодействовать с остальными частями проекта?

Как тестировать сервис и систему целиком?

Как обрабатывать сбои связанных сервисов?

Как переезжать на новую версию?

Как масштабировать под нагрузкой?

Page 68: Чему мы научились, разрабатывая микросервисы / Вадим Мадисон (RuTube)

Спасибо!Вадим Мадисон

М-Тех

[email protected]