Просмотрел замечательное выступление Гордона Роуэла (Gordon Rowel) на тему как Google строит большие системы. Вот ссылка. А ниже мой свободный перевод.
Правила построения надежных систем:
Масштабирование
Мы не внедряем "сервер"
Отказ в обслуживании
Плохо написанный код
Пишите хороший код и готовьте релизы
Балансировка нагрузки
У вас есть достаточно производительности?
Как вы отправляете клиентов к правильным кластерам?
Глобальные сбои
Мониторьте все
Тестируйте все
Учитесь на сбоях
Разнообразие - это хорошо. Но для людей.
Правила построения надежных систем:
- Внедряйте масштабируемую систему (которая может вырасти не в 2 раза, а в 10 или в 100 раз через год или на следующей неделе)
- Решение должно быть единым, унифицированным (т.к. каждая система, которая отличается, вносит свои особенности и приводит к более сложным ситуациям по восстановлению)
- Необходимо понимание всех уровней работы решения
- Необходимо мониторить ВСЕ
- Планируйте систему для работы в случае различных сбоев
- Периодически "ломайте" систему, но под контролем (вынимайте диски, отключайте питание и наблюдайте как работают системы, разделяйте их на части, замедляйте работу БД, ...)
Масштабирование
Мы не внедряем "сервер"
- сервера ломаются, питание пропадает
- клиенты или DNS необходимо перенастраивать
- все сервера находятся за балансировщиками
- сети ломаются, сервера ломаются, питание пропадает
- клиенты или DNS необходимо перенастраивать
- пытаемся отправить клиентов к ближайшему рабочему кластеру
- используем технологию anycast для единого управления клиентскими настройками
Отказ в обслуживании
Плохо написанный код
- на небольшом кол-ве клиентов
- это раздражает
- на огромном кол-ве клиентов
- может быть причиной серьёзнейших проблем в инфраструктуре
Пишите хороший код и готовьте релизы
- уделяйте внимание процессу выпуска релизов (Release Management)
- взаимодействуйте с владельцами сервисов
- готовьте планы откатов, предоставляйте время на тестирование стабильности
- знайте пределы систем при DoS атаках, тестируйте их
Балансировка нагрузки
У вас есть достаточно производительности?
- как много серверов (backends) вам нужно?
- что случится, если половина ваших серверов потеряет питание?
- А если уже половина выключена для восстановительных работ?
Как вы отправляете клиентов к правильным кластерам?
- Настройки на стороне клиента (пример: Kerberos, но клиент должен поддерживать такую возможность)
- DNS round-robin (простая глобальная балансировка)
- DNS виды (views) (или split-horizon в терминологии Microsoft, например) (лучший ответ для клиетского ip)
- Anycast (в IPv4 сетях реализуется с помощью протокола BGP)
- Рекомендация: DNS виды + Anycast
Глобальные сбои
Мониторьте все
- Если проверки доступности серверов в кластере не срабатывают (при работающих серверах), то будет не доступными часть серверов (или весь сервис)
Тестируйте все
- вы должны ожидать (и тестировать) отключения дата центров
- обратите внимание на каскадные отключения
Учитесь на сбоях
- Пишите "посмертные отчеты"
- Делайте фокус на фактах!
- Что пошло не так и что может быть улучшено?
- "Посмертный отчет" не про вину
Разнообразие - это хорошо. Но для людей.
- Будьте беспощадны к разнообразию платформ.
- Любое отличие от стандарта рано или поздно ведет к "Ууупс" ситуации
- Каждое обновление ОС, это время для изменений и чисток
- Избавляйтесь от ручных/кастомных решений!
Comments
Post a Comment