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

Post on 10-Feb-2017

638 Views

Category:

Engineering

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

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

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

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

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

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

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

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

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

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

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

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

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

17 (1/20)→340→1120

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

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

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

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

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

привлекают?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Мониторинг

736

Как решать?

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

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

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

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

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

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

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

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

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

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

Наш стек

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Circuit Breaker!

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

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

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

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

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

Circuit Breaker![Hystrix, Netflix]

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

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

Raspberry Pi 3 - 6шт

Фото: pocketcluster.wordpress.com

Хранение

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

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

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

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

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

• Shared data volume

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

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

• Shared data volume

• Flocker

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

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

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

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

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

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

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

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

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

• skydns — DNS

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

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

Оркестрация• 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)

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}}}

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!

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}}

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;}

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

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

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

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

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

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

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

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

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

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

М-Тех

vmadison@rutube.ru

top related