Солодкий Алексей · 7 апреля 2018
Безопасное взаимодействие
в распределённых системах
Slide 2
Slide 2 text
About
3k
серверов
600
серверов баз
данных
350k
запросов в
секунду
50
типов самописных
сервисов
2
Slide 3
Slide 3 text
• сервера падают;
• сервис может затупить.
Темы
3
Как выживать в мире, где…
• правильно мониторить сервисы;
• грамотно умирать.
А также как…
Slide 4
Slide 4 text
Падение сервиса
Slide 5
Slide 5 text
• проблемы с железом;
• сеть;
• код;
• неудачный деплой;
• русские хакеры.
Что может вывести
из строя ваш
сервис?
5
Slide 6
Slide 6 text
Failover схема
6
Slide 7
Slide 7 text
Failover схема
7
Slide 8
Slide 8 text
Failover схема
8
Slide 9
Slide 9 text
Failover распределение нагрузки
9
Slide 10
Slide 10 text
Failover распределение нагрузки
10
Slide 11
Slide 11 text
11
Failover распределение нагрузки
Slide 12
Slide 12 text
• Async:
• eventual consistency;
• можно потерять часть данных;
• быстрее на запись;
• более простые схемы.
• Sync:
• данные всегда согласованы;
• медленная запись;
• кворумы, split-brain и прочие
сложности.
sync vs async
репликация
12
Slide 13
Slide 13 text
• резервируйте;
• проводите учения!
• учитывайте падения при расчёте нагрузки;
• выбирайте синхронность репликации,
исходя из задач;
• не кладите все яйца в одну корзину.
Выводы
раздела
13
Slide 14
Slide 14 text
Тупка сервиса
Slide 15
Slide 15 text
• чрезмерная нагрузка;
• сеть;
• проблемы с железом.
Из-за чего сервис
может затупить?
15
Slide 16
Slide 16 text
16
Slide 17
Slide 17 text
17
Система из 10 воркеров может обработать 500 запросов в секунду (по 50 на воркер)
Slide 18
Slide 18 text
18
Slide 19
Slide 19 text
19
Система из 10 воркеров может обработать 10 запросов в секунду. (по 1 на воркер)
Slide 20
Slide 20 text
20
Circuit breaker принцип работы
Slide 21
Slide 21 text
21
Circuit breaker принцип работы
Slide 22
Slide 22 text
22
Circuit breaker принцип работы
Slide 23
Slide 23 text
23
Circuit breaker принцип работы
Slide 24
Slide 24 text
• PHP + storage:
• https://github.com/ackintosh/ganesha
• https://github.com/ejsmont-artur/php-
circuit-breaker
• В виде отдельного демона:
• Envoy
• Linkerd
Реализации
24
Slide 25
Slide 25 text
• не полагайтесь на сеть;
• все запросы по сети должны иметь таймаут;
• используете Circuit Breaker
https://docs.microsoft.com/en-us/azure/
architecture/patterns/circuit-breaker
Выводы
раздела
25
• собирайте все данные, какие можете;
• не забывайте об асинхронном
взаимодействии;
• встраивайте в самописные сервисы отдачу
статки;
• настройте автоматические триггеры.
Выводы
раздела
41
Slide 42
Slide 42 text
Memento mori
Slide 43
Slide 43 text
Как умирать People near by
Slide 44
Slide 44 text
Как умирать People near by
Slide 45
Slide 45 text
Как умирать People near by
Slide 46
Slide 46 text
Как умирать People near by
Slide 47
Slide 47 text
Как умирать People near by
Slide 48
Slide 48 text
Как умирать People near by
Slide 49
Slide 49 text
• будьте готовы к полному падению сервиса;
• не допускайте каскадного отказа;
• отключайте некритичный функционал в
случае падения сервиса.
Выводы
раздела
49