Использование haproxy/iptables+etcd+confd для автоматического service...
TRANSCRIPT
![Page 1: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/1.jpg)
Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях Сергей Пузырёв
![Page 2: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/2.jpg)
Service-oriented architecture 1. Приложение состоит из множества слабо связанных
сервисов, которые общаются друг с другом с использованием четко определённого API.
2. Сервисы ничего не знают о клиентах, их задача – оказывать сервис.
3. Клиента не волнует, каким образом работает сервис. 4. Сервисы используют другие сервисы.
![Page 3: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/3.jpg)
Service-oriented architecture Что такое сервис? 1. У сервиса есть интерфейс – API. 2. Сервис имеет точку входа (endpoint) – обычно пара
IP:port. 3. Сервис может пользоваться другими сервисами. В этом
случае он должен быть правильно сконфигурирован.
![Page 4: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/4.jpg)
Service-oriented architecture Пример сервиса - memcached: 1. API: стандартный протокол memcached. 2. Endpoint: например, 10.0.0.7:11211. 3. Сервисы, которыми пользуется memcached, отсутствуют.
Client Memcached
![Page 5: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/5.jpg)
Service-oriented architecture Пример сервиса - mcrouter: (github.com/facebook/mcrouter) 1. API: стандартный протокол memcached. 2. Endpoint: например, 10.0.0.6:11211. 3. Mcrouter пользуется двумя сервис memcached. Endpoint
сервиса memcached забит в конфиг mcrouter.
Client Mcrouter
Memcached Memcached
![Page 6: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/6.jpg)
Service-oriented architecture Несложное PHP-приложение:
Php-fpm
Memcached
MySQL slave
Nginx
Php-fpm
MySQL master Memcached
Mcrouter
Static storage
16 отношений client<->service
![Page 7: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/7.jpg)
Service-oriented architecture Сложное приложение (мопед не мой):
![Page 8: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/8.jpg)
![Page 9: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/9.jpg)
Как связывать сервисы друг с другом? Дешево и сердито: хардкод endpoint’ов в конфиги. Плюсы: 1. Очень быстрый старт. 2. Просто, нужен только vim. 3. Ничего не ломается само. Минусы: 1. Не работает в большом проекте. 2. Требуется вручную поддерживать документацию. 3. Сложно вносить массовые изменения, подключать
новые инстансы сервисов, мигрировать сервисы.
![Page 10: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/10.jpg)
Как связывать сервисы друг с другом? Дешево и сердито: DNS + хардкод. Плюсы: 1. Лишь немного сложнее хардкода IP-адресов. 2. Почти так же просто, нужен только vim и DNS-сервер. 3. Проще вносить массовые изменения. Минусы: 1. По прежнему не работает в большом проекте. 2. Так же требуется вручную поддерживать документацию. 3. Сложно подключать новые инстансы сервисов. 4. Асинхронность внесения изменений, лаги. 5. Софт часто не перерезолвливает записи.
![Page 11: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/11.jpg)
Появляются сотни сервисов. Потом тысячи.
![Page 12: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/12.jpg)
Как связывать сервисы друг с другом? Системы управления конфигурацией (Puppet, SaltStack, etc.). Плюсы: 1. При правильной организации проще вносить
изменения. 2. Один инструмент для всего. Минусы: 1. Медленно! 2. При неправильной организации вносить изменения
становится очень сложно. 3. Неактуальная документация продолжает существовать.
![Page 13: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/13.jpg)
Как связывать сервисы друг с другом? Пусть роботы всё делают за нас! Системы service-discovering’а.
![Page 14: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/14.jpg)
Service-discovering Что это такое? Система обнаружения сервисов (СОС) – специальный сервис, в котором другие сервисы могут делать две вещи: 1. Регистрироваться (записывать свой endpoint). 2. Находить другие сервисы (читать предварительно
зарегистрированные endpoint’ы других сервисов).
Часто системы обнаружения сервисов предоставляют также сервис распределённых блокировок. Примеры: Zookeeper, etcd, consul, SkyDNS, etc.
![Page 15: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/15.jpg)
Service-discovering Etcd: что это такое и как с этим жить? github.com/coreos/etcd Etcd - высоконадёжное распределенное хранилище параметров конфигурации, задаваемых в форме key->value. Etcd также можно использовать как систему распределенных блокировок.
![Page 16: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/16.jpg)
Service-discovering Confd: что это такое и зачем оно нужно? www.confd.io Confd - легковесная система конфигурации, специально созданная для отслеживания данных в etcd, шаблонизирования конфигов и перезапуска приложений при изменении данных в etcd. NB: нередко вместо Confd можно использовать скрипт на bash, наподобие while true ; do smth ; done .
![Page 17: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/17.jpg)
Service-discovering
Etcd
Client
Confd
Announcer
Mcrouter
Announcer
Memcached
Announcer
Memcached
Confd
![Page 18: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/18.jpg)
Как связывать сервисы друг с другом? Системы service-discovering’а: Плюсы: 1. Очень быстрое внесение изменений. 2. Не требуется документировать, что где работает и как
должно быть сконфигурировано. Минусы: 1. Сложно. 2. Страшно – “а вдруг развалится?”. 3. Внешние сущности в виде confd и announcer’а. В идеале
нужно обучать сервисы общаться с etcd напрямую.
![Page 19: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/19.jpg)
Как связывать сервисы друг с другом? Что мы хотели? 1. Приложения не должны постоянно перезапускаться (до
свидания, confd). 2. Мы не хотели привязывать тонны legacy-кода наших
приложений к СОС. 3. Облегчить миграцию сервисов на новые endpoint’ы, не
требующую переконфигурации тысяч других сервисов (ради чего и затевалось).
4. Приложение не должно деградировать в условиях сломавшейся СОС, выключившегося датацентра, тормозящей сети и т.п. более, чем деградировало бы без СОС.
![Page 20: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/20.jpg)
Как связывать сервисы друг с другом?
![Page 21: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/21.jpg)
Как связывать сервисы друг с другом? Трудно связать сервисы друг с другом? Давайте инкапсулируем связь между сервисами в отдельный сервис!
![Page 22: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/22.jpg)
Etcd + iptables/HAproxy + confd Было так:
Etcd
Client
Confd
Announcer
Mcrouter
Announcer
Memcached
Announcer
Memcached
Confd
![Page 23: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/23.jpg)
Etcd + iptables/HAproxy + confd А стало так:
Etcd
Client
Confd
Announcer
Mcrouter
Announcer
Memcached
Announcer
Memcached
Confd
HAProxy
![Page 24: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/24.jpg)
Etcd + iptables/HAproxy + confd Почему так? 1. Некоторые приложения трудно перезапускать. 2. Постоянно писать шаблоны к разному софту утомляет. 3. Бесплатная статистика от HAproxy. 4. В простых кейсах получаем еще и бесплатную
балансировку.
Что плохо? 1. HAproxy не умеет в UDP.
![Page 25: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/25.jpg)
Etcd + iptables/HAproxy + confd А iptables DNAT умеет:
Confd Confd
Etcd
iptables DNAT
iptables DNAT
Client statsd Carbon (Graphite)
![Page 26: Использование haproxy/iptables+etcd+confd для автоматического service discovery в переменчивых сетях / Сергей Пузырёв](https://reader034.vdocuments.pub/reader034/viewer/2022042707/586f91301a28ab54768b7b53/html5/thumbnails/26.jpg)
Результат 1. Миграции сервисов становятся безболезненными. 2. Добавление новых инстансов сервисов в простых кейсах
(когда можно просто добавить инстанс в пул HAProxy) происходит очень легко.
3. Нельзя забыть что-то переконфигурировать. 4. Новых конфигов требуют только новые типы сервисов.