HighLoad весна 2014 лекция 7
-
Upload
technopark -
Category
Education
-
view
445 -
download
2
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
Сервера с двойной (повышенной) нагрузкой в
балансировке
Дополнительные дублирующие операции с базой в
коде
Если начнет тормозить – отключаем дополнительную
нагрузку
Используем выигранное время чтобы придумать
решение
Синтетической нагрузкой тестировать бесполезно
Копией реальной нагрузки не всегда возможно
Заодно проверяем новые версии на регрессии по
скорости