HighLoad весна 2014 лекция 7

Post on 22-May-2015

445 views 2 download

Transcript of HighLoad весна 2014 лекция 7

Проектирование высоконагруженны

х систем

Лекция №7

Быков Александр

2

Построение архитектуры

HighLoad. Лекция №7

Разбиение системы на компоненты

Разбиение в точках масштабирования

Автономность компонент

Изоляция компонент

Минимизация зависимостей

3

Frontend & Backend

HighLoad. Лекция №7

Разделяем сервера на 2 группы:

Frontend сервера – общаются с клиентом

Backend сервера – делают сложную часть работы

Закрываем backend во внутренней сети

Регулируем на frontend нагрузку на backend

4

Разбивка страниц на группы

HighLoad. Лекция №7

Страницы (блоки):

Простые и сложные

Важные и неважные

Посещаемые и нет

Разбиваем на группы:

Простые и посещаемые

Сложные но важные

Прочее полезное

Делаем так чтобы

проблемы с запросами

одной группы не вызвали

проблем в другой

5

Функциональные группы серверов

HighLoad. Лекция №7

Группы по функциям, важности, стабильности,

шардам

Самые используемые функции должны работать

всегда

Проблема не должна выходить за пределы группы

Тяжелые, нестабильные страницы не должны класть

соседей

Сложные функции стараемся выделить в отдельные

сервисы

6

Сложность и надежность

HighLoad. Лекция №7

Большое кол-во компонентов

Высокая вероятность поломки одного из них

Необходимо резервирование

Необходимо работать при отсутствии части

компонент

Сложные системы все равно ломаются

7

Выбор компонент

HighLoad. Лекция №7

Самодельное ПО это дорого

Самодельное ПО ломается

Коробочное ПО тоже ломается

Когда оно ломается вам никто не поможет

Если нет исходных кодов ваши дела плохи

Выводы:

Используем Open Source как основу

При необходимости правим баги и дорабатываем под

себя

8

Выбор технологий и ЯП

HighLoad. Лекция №7

Технологии которые знает ваша команда

Широкое использование крупными проектами –

хороший знак

Скриптовые языки – большая скорость разработки

Сразу пишем на C если знаем нагрузку и перла не

хватит

Соблюдаем баланс «удобство» vs

«производительность»

Используем минимум разных технологий

Годные технологии: Perl, Python, C, C++, Java, MySQL,

PostgreSQL, memcached, nginx, apache, tarantool,

hadoop

9

Оптимизация узких мест

HighLoad. Лекция №7

Поставить новый сервер взамен старого 5-летней

давности

Заменить тупой алгоритм «в лоб» на оптимальный

Переписать код на C, подключить через Perl::XS

Переписать в отдельный демон написанный на C

Распараллелить алгоритм на несколько серверов

10

Graceful degradation

HighLoad. Лекция №7

Автоматическое отключение неважных блоков

Игнорирование неважных ошибок

Пользователь должен получить то зачем пришел

Кандидаты: реклама, промо-блоки, комментарии,

лайки

11

Обработка ошибок при обработке запроса

HighLoad. Лекция №7

Попробовать сделать запрос еще раз

Сходить в другой сервер

Сходить в сервер с упрощенной версией

Показать старое значение из кэша

Показать заглушку

Показать пустой блок

Показать ошибку в середине страницы (PHP)

Показать “Internal Server Error”

12

HighLoad. Лекция №7

13

HighLoad. Лекция №7

14

HighLoad. Лекция №7

15

Отложенная обработка запроса

HighLoad. Лекция №7

Работу которую сложно или невозможно делать

онлайн.

Выполнения тяжелых операций в период малой

нагрузки

Общение с нестабильными партнерами

Операции не связанные с действиями пользователя

Примеры:

Обсчет статистики за предыдущий день

Ротация логов на фронтендах (gzip и нагрузка на

сеть/диск)

Отправка писем по SMTP-протоколу

Банковские транзакции

16

Отложенная обработка запроса

HighLoad. Лекция №7

Крупные сервисы считают статистику только так

Чем больше серверов, чем сложнее система тем

сложнее делать онлайн-обработку чего-либо где

требуется надежная фиксация результата

Высокая производительность и консистентность

Минусы: большая задержка результата (часы, сутки)

17

Запись и обработка логов

HighLoad. Лекция №7

На фронтенде:

Занимают место и могут не умещаться за день

Теряются / становятся недоступны вместе с сервером

Тяжело копировать раз в сутки

На отдельном сервере:

Передаем по TCP/UDP или маленькими файлами

Можно считать онлайн-статистики

18

Мониторинг

HighLoad. Лекция №7

Проверяем отдельно доступность компонент

Проверяем живость серверов и аппаратных ресурсов

на них

Проверяем работоспособность сервисов в целом

Проверяем критические ошибки в логах

Рисуем графики нагрузки/заполненности компонент

Смотрим на графики активности пользователей

Экран мониторинга со списком важных проблем

Дежурная смена и SMS оповещения

19

Выкатка новых версий

HighLoad. Лекция №7

• Длинные итерации для сложных продуктов

• Неделю пишем, неделю тестируем и выкатываем

• Выкатываем последовательно: тестовый сервер,

офис, пререлизный сервер, 1 фронтенд, все

фронтенды, 1% пользователей, 100% пользователей.

• Сначала выкатываем, потом плавно включаем новый

функционал на долю пользователей следя за

нагрузкой

20

Слежение за производительностью

HighLoad. Лекция №7

Сервера с двойной (повышенной) нагрузкой в

балансировке

Дополнительные дублирующие операции с базой в

коде

Если начнет тормозить – отключаем дополнительную

нагрузку

Используем выигранное время чтобы придумать

решение

Синтетической нагрузкой тестировать бесполезно

Копией реальной нагрузки не всегда возможно

Заодно проверяем новые версии на регрессии по

скорости

СПАСИБО ЗА ВНИМАНИЕ

Быков Александр

bykov@corp.mail.ru