Upload
ontico
View
642
Download
2
Embed Size (px)
Citation preview
Чему мы научились, разрабатывая микросервисы?
Мадисон Вадим, М-Тех 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 Исходные коды примера
Чек-лист Как конфигурировать?
Как мониторить и считать метрики?
Как сервисы будут находить друг друга?
Как сервис будет взаимодействовать с остальными частями проекта?
Как тестировать сервис и систему целиком?
Как обрабатывать сбои связанных сервисов?
Как переезжать на новую версию?
Как масштабировать под нагрузкой?