Микросервисы: опыт использования в нагруженном...

81
Микросервисы: опыт использования в нагруженном проекте Вадим Мадисон М-Тех

Upload: ontico

Post on 06-Jan-2017

281 views

Category:

Engineering


7 download

TRANSCRIPT

Page 1: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Микросервисы: опыт использования в нагруженном проектеВадим Мадисон М-Тех

Page 2: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

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

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

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

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

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

Page 3: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Про что эта история?

Page 4: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

История про …• Рост проекта • Развитие • Переосмысление работы системы и отдельных компонентов

Page 5: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

История про …

Масштабирование

Page 6: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Пройденный путь

Page 7: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Начало времен• 2 сервера в docker-кластере • DB запускается на тех же машинах, в контейнерах • Выделенного хранилища как такового нет • Инфраструктура минимальна

Page 8: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Docker TeamCity

Page 9: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Середина пути• 80 серверов в docker-кластере • Хранилище на базе CEPH • DB запускается на отдельных серверах • Пересмотр взаимодействия между сервисами • Выделенный мониторинг

Page 10: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Наши дни• Несколько сотен серверов в docker-кластере • Сотни запущенных микросервисов • Выделение сервисов в отдельные зоны • Кластеризация шин обмена сообщениями между сервисами

Page 11: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Page 12: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Транспорт

Page 13: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Транспорт

protobuf → gRPC → JSON

Page 14: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Page 15: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

protobufПлюсы • Достаточно компактен • Есть быстрые реализации • Условно типизирован

Минусы • протокол становится

“проприетарным” • требуется поддерживать в актуальном состоянии утилиты для обращению к сервису

Page 16: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

protobufПлюсы • Достаточно компактен • Есть быстрые реализации • Условно типизирован

Минусы • протокол становится

“проприетарным” • требуется поддерживать в актуальном состоянии утилиты для обращения к сервису

Page 17: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Транспорт

protobuf → gRPC → JSON

Page 18: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Docker TeamCity

Page 19: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

gRPCПлюсы • HTTP/2 • Эффективность передачи • Работает из коробки • Поддержка основных серверных языков • Поддержка основных клиентских языков

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

Page 20: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

gRPCПлюсы • HTTP/2 • Эффективность передачи • Работает из коробки • Поддержка основных серверных языков • Поддержка основных клиентских языков

Минусы • Вещь в себе • Сложность реализации собственной логики • Доступ к логам через собственные обертки и парсеры • Усиливает зависимости между сервисами • Сложно версионируется

Page 21: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Транспорт

protobuf → gRPC → JSON

Page 22: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Docker TeamCity JSON

Page 23: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

JSONПлюсы • “Можно” HTTP/2 • Есть очень быстрые реализации • Поддержка повсеместно • Не требуется разрабатывать дополнительный инструментарий • Позволяется работать с

“частью данных”

Page 24: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

JSONПлюсы • “Можно” HTTP/2 • Есть очень быстрые реализации • Поддержка повсеместно • Не требуется разрабатывать дополнительный инструментарий • Позволяется работать с

“частью данных”

Минусы • Не компактен • Не типизирован

Page 25: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Версионирование протокола

Page 26: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Версионирование протокола

V1,V2,… → V1 + schema

Page 27: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Версионирование протокола

V1,V2,… → V1 + schema

/api/v1/content /api/v2/content → /api/v1/content + JSON Schema v1.X /api/v3/content

Page 28: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

{ "id": "507f1f77bcf86cd7994390", "projectId": "507f1f77bcf86cd7994390", "content": "broadcast", "name": "Жопоног - Газмяз", "date" : { "start": "2005-08-09T18:31:42-03:30", "end": "2005-08-09T18:31:42-03:30" }, "source": "http://.../playlist.m3u8", "extra": { "videoType": "хоккей", "description": "Чемпионат мира по гребной травле тараканов" }, "listeningStatus": "fail", "status": "enabled"}

Page 29: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

{ "id": "507f1f77bcf86cd7994390", "projectId": "507f1f77bcf86cd7994390", "content": "broadcast", "name": "Жопоног - Газмяз", "date" : { "start": "2005-08-09T18:31:42-03:30", "end": "2005-08-09T18:31:42-03:30" }, "source": "http://.../playlist.m3u8", "extra": { "videoType": "хоккей", "description": "Чемпионат мира по гребной травле тараканов ;)" }, "listeningStatus": "fail", "status": "enabled"}

{ "$schema": "…", "type": "object", "properties": { "id": { "type": "string" }, "content": { "type": "string" }, "date": { "type": "object", "properties": { "start": { "type": "string" }, "end": { "type": "string" } }, "required": ["start","end"] }, "source": { "type": "string" }, "status": { "type": "string" }, … }, "required": ["id", "content", "date", "status"]}

Page 30: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

{ "id": "507f1f77bcf86cd7994390", "content": "broadcast", "date" : { "start": "2005-08-09T18:31:42-03:30", "end": "2005-08-09T18:31:42-03:30" }, "status": "enabled"}

{ "$schema": "…", "type": "object", "properties": { "id": { "type": "string" }, "content": { "type": "string" }, "date": { "type": "object", "properties": { "start": { "type": "string" }, "end": { "type": "string" } }, "required": ["start","end"] }, "source": { "type": "string" }, "status": { "type": "string" }, … }, "required": ["id", "content", "date", "status"]}

Page 31: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Стабильность работы

Page 32: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Page 33: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Docker TeamCity JSON Grafana

Page 34: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Выводы• Основная проблема — частично работающий сервис • Мертвый сервис - хорошо! • Каждый сервис должен знать свой лимит (Rate limit)! • Защита - паттерн Circuit Breaker

Page 35: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Выводы• Основная проблема — частично работающий сервис • Мертвый сервис — хорошо! • Каждый сервис должен знать свой лимит (Rate limit)! • Защита - паттерн Circuit Breaker

Page 36: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Выводы• Основная проблема — частично работающий сервис • Мертвый сервис — хорошо! • Каждый сервис должен знать свой лимит (Rate limit)! • Защита - паттерн Circuit Breaker

Page 37: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Выводы• Основная проблема — частично работающий сервис • Мертвый сервис — хорошо! • Каждый сервис должен знать свой лимит (Rate limit)! • Защита — паттерн Circuit Breaker

Page 38: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Docker TeamCity JSON Grafana

Hystrix

Page 39: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Page 40: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Page 41: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Исполнение запроса

Page 42: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

1 2 3

4 5

Page 43: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Page 44: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Docker TeamCity JSON Grafana

HystrixAppdash

Page 45: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Page 46: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Docker TeamCity JSON Grafana

Hystrix

Page 47: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

общее время

Page 48: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

общее время

Обращение к БДвнутри сервиса

Page 49: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

TraceID: 19502dcb3e187d615eacf73a0ba1bfe0

Page 50: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Docker TeamCity JSON Grafana

HystrixOpentracing

Page 51: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Логирование

Page 52: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Docker TeamCity JSON Grafana

HystrixOpentracingElastic + Kibana

Page 53: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Логирование: сбор логов

Page 54: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Логирование• добавляем TraceID в логи • строим Dashboard фильтром по TraceID • динамический DEBUG MODE

Page 55: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Логирование• добавляем TraceID в логи • строим Dashboard фильтром по TraceID • динамический DEBUG MODE

Page 56: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Агрегирование ошибок

Page 57: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Docker TeamCity JSON Grafana

HystrixOpentracingElastic + Kibana

Sentry

Page 58: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Масштабирование

Page 59: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Docker TeamCity JSON Grafana

HystrixOpentracingElastic + Kibana

Sentry Nomad

Page 60: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Docker TeamCity JSON Grafana

HystrixOpentracingElastic + Kibana

Sentry Consul VaultNomad

Page 61: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Docker TeamCity JSON Grafana

HystrixOpentracingElastic + Kibana

Sentry Consul VaultKubernetes

Page 62: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Стандартизация: RAM-CPU-NET

Page 63: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Стандартизация: R3-C2-N1

Page 64: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Стандартизация: матрица размерностей

CPU RAM NET

C1 = 500 MHz R1 = 128 MB N1 = 10 Mb

C2 = 1000 MHz R2 = 256 MB N2 = 100 Mb

C3 = 3000 Mhz R3 = 512 MB N3 = 1 Gb

Page 65: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Стандартизация

•N1C3R1 → [10 Mb] [3000 MHz] [128 MB] •N1C2R3 → [10 Mb] [1500 MHz] [1 GB]

Page 66: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Стандартизация

•N1C3R1 → [10 Mb] [3000 MHz] [128 MB] •N1C2R3 → [10 Mb] [1000 MHz] [1 GB]

Page 67: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Подготовка: тип масштабируемости• Сервис полностью независим → тестируем предел для одного инстанса → тестируем 2 инстанса, чтобы проверить линейность

• Масштабируемость зависит от внешних ресурсов → при нагрузочном тестировании проводим

несколько раундов тестирования с увеличением количества инстансов

• Масштабируемость ограничена определенным лимитом → порог указывается в точке конфигурирования сервиса

Page 68: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Подготовка: тип масштабируемости• Сервис полностью независим → тестируем предел для одного инстанса → тестируем 2 инстанса, чтобы проверить линейность

• Масштабируемость зависит от внешних ресурсов → при нагрузочном тестировании проводим

несколько раундов тестирования с увеличением количества инстансов

• Масштабируемость ограничена определенным лимитом → порог указывается в точке конфигурирования сервиса

Page 69: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Подготовка: тип масштабируемости• Сервис полностью независим → тестируем предел для одного инстанса → тестируем 2 инстанса, чтобы проверить линейность

• Масштабируемость зависит от внешних ресурсов → при нагрузочном тестировании проводим

несколько раундов тестирования с увеличением количества инстансов

• Масштабируемость ограничена определенным лимитом → порог указывается в точке конфигурирования сервиса

Page 70: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Подготовка: нагрузочное тестирование

Page 71: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Page 72: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Page 73: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Page 74: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Docker JSON Grafana

HystrixOpentracingElastic + Kibana

Sentry Consul VaultKubernetes Gitlab CI

TeamCity

Page 75: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Рекомендации• Начинайте разработку сразу с использованием системы оркестрации • В каждый момент времени помните, что каждого инстанса сервиса должно быть не меньше 2-х • Шина сообщений, блокировки и очереди - наше все • Не нужно пытаться поднять/починить сервис - нужно отстрелить его и потом попробовать понять, что не так • Собирайте метрики и работайте с ними • Выдавайте алерты только там, где требуется реакция

Page 76: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Рекомендации• Начинайте разработку сразу с использованием системы оркестрации • В каждый момент времени помните, что каждого инстанса сервиса должно быть не меньше 2-х • Шина сообщений, блокировки и очереди - наше все • Не нужно пытаться поднять/починить сервис - нужно отстрелить его и потом попробовать понять, что не так • Собирайте метрики и работайте с ними • Выдавайте алерты только там, где требуется реакция

Page 77: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Рекомендации• Начинайте разработку сразу с использованием системы оркестрации • В каждый момент времени помните, что каждого инстанса сервиса должно быть не меньше 2-х • Шина сообщений, блокировки и очереди — наше все • Не нужно пытаться поднять/починить сервис - нужно отстрелить его и потом попробовать понять, что не так • Собирайте метрики и работайте с ними • Выдавайте алерты только там, где требуется реакция

Page 78: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Рекомендации• Начинайте разработку сразу с использованием системы оркестрации • В каждый момент времени помните, что каждого инстанса сервиса должно быть не меньше 2-х • Шина сообщений, блокировки и очереди — наше все • Не нужно пытаться поднять/починить сервис — нужно отстрелить его и потом попробовать понять, что не так • Собирайте метрики и работайте с ними • Выдавайте алерты только там, где требуется реакция

Page 79: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Рекомендации• Начинайте разработку сразу с использованием системы оркестрации • В каждый момент времени помните, что каждого инстанса сервиса должно быть не меньше 2-х • Шина сообщений, блокировки и очереди — наше все • Не нужно пытаться поднять/починить сервис — нужно отстрелить его и потом попробовать понять, что не так • Собирайте метрики и работайте с ними • Выдавайте алерты только там, где требуется реакция

Page 80: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

Рекомендации• Начинайте разработку сразу с использованием системы оркестрации • В каждый момент времени помните, что каждого инстанса сервиса должно быть не меньше 2-х • Шина сообщений, блокировки и очереди — наше все • Не нужно пытаться поднять/починить сервис — нужно отстрелить его и потом попробовать понять, что не так • Собирайте метрики и работайте с ними • Выдавайте алерты только там, где требуется реакция

Page 81: Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)

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

М-Тех

[email protected]

[email protected]