80
© Copyright 2014 Andrey Smirnov Разработка высоконагруженных и надежных систем Андрей Смирнов, 2014

Вебинар "Разработка высоконагруженных и надежных систем": Введение

Embed Size (px)

Citation preview

Page 1: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Разработка высоконагруженных и надежных систем

Андрей Смирнов, 2014

Page 2: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Введение

Вебинар №1

Page 3: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Обо мне

Page 4: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

О серии вебинаров

Page 5: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

План вебинаров1. Введение (этот вебинар)

2. Данные I. От основ хранения до РСУБД

3. Данные II. Шардинг, key-value и распределенные хранилища

4. Приложение

5. Архитектура веб-систем

6. Взаимодействие с клиентским приложением. Тестирование

7. Отказоустойчивость, мониторинг и выкатывание

Page 6: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Page 7: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Данные I + II

Page 8: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Данные I. От основ хранения до РСУБД

• Базовые принципы хранения данных. Хранение на диске и в памяти.

• ACID. Реляционные БД.

• Проектирование схемы реальной БД в различных моделях данных.

• Индексы, денормализация, использование разных типов хранилищ для разных данных.

• Партиционирование. Репликация.

• Полнотекстовый поиск. 20 января 201518:00

Page 9: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Данные II. Шардинг, key-value и распределенные хранилища• Масштабирование: шардинг в реляционных и key-

value хранилищах.

• Key-value хранилища.

• CAP-теорема.

• Распределенные хранилища. Консистентность.

• Кешированные данных: инвалидация кеша, тегирование кешей. 21 января 2015

18:00

Page 10: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Приложение

Page 11: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Приложение• Структура серверного и клиентского приложения, анализ узких и проблемных мест.

• Сетевой ввод-вывод: синхронный, асинхронный. Реактор, обслуживание большого числа соединений (C10K, C100K).

• Многозадачность: процессы, нити, кооперативная многозадачность, комбинации.

• Краткий обзор фреймворков и языков программирования: Ruby, Python, Go, Java, C#, Erlang, JavaScript.

• Безопасность. Типичные уязвимости. Пользователи и пароли. CSRF. 3 февраля 2015

18:00

Page 12: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Архитектура

Page 13: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Архитектура веб-систем• Архитектура системы: монолитная, сервис-ориентированная (SOA).

• Непосредственный вызов (RPC), очереди, персистентные очереди, очереди фоновых задач.

• Шины, широковещательные каналы.

• Примеры и разбор реальных архитектур веб-приложений.

5 февраля 2015 18:00

Page 14: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Клиент,Тестирование

Page 15: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Взаимодействие с клиентским приложением. Тестирование

• Синхронизация данных, работа в offline, информирование пользователя.

• Сетевое взаимодействие с сервером. Ошибки API. Клиент как веб-сервис. Алгоритмы повтора запроса.

• Нагрузочное и системное тестирование.

• Почему unit-тестирование бесполезно.

• Непрерывное тестирование, постоянное выкатывание. 10 февраля 2015

18:00

Page 16: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Эксплуатация

Page 17: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Отказоустойчивость, мониторинг и выкатывание

• Оценка нагрузки и планирование ресурсов.

• Резервное копирование, репликация. Master-Slave. Hot-Spare.

• Несколько дата-центров, схемы Active-Failover, Master-Slave, Active-Active.

• Обеспечение консистентности. Протоколы голосования.

• Выбор между “облаком” и железом.

• Выкатывание проекта, управление конфигурацией. Логирование. Мониторинг. 17 февраля 2015

18:00

Page 18: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Данные I + II

Приложение

Клиент,Тестирование

Архитектура

Эксплуатация

Page 19: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Бронируйте места!

• Сегодня каждый вебинар стоит 4 000 руб. (5 000 для юрлиц)

• Все 6 вебинаров: 16 000 руб. (скидка 33%) (21 000 руб. для юрлиц)

• Цена будет увеличиваться ближе к дате начала вебинаров!

Page 20: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Нагрузка

• Что такое высокая нагрузка?

• Что такое нагрузка?

Page 21: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Примеры

• Google: 70 000 req/s (поиск)

• Twitter: 700 tweet/s (новые твиты), 24 000 req/s (поиск)

• Facebook: 3000 msg/s

• Yandex: 2000 req/s (поиск)

Page 22: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Еще примеры

• Fastly (CDN): 500 000 req/s, 77 Gbit/s

• Akamai (CDN): 12 000 000 req/s (2010)

Page 23: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

И еще

• Google Public DNS: 1 504 629 req/s 47 450 000 000 000 (47 триллионов) запросов в год лог запросов (100 байт на запрос) занял бы 4315 Тб

Page 24: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Нагрузка

• Запросы, кол-во запросов в секунду

• Задержка, время обработки запроса

• Конкурентность, одновременные запросы

• Отказы

Page 25: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Производительность

• Нагрузка отнесенная к используемым ресурсам и времени выполнения

Page 26: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Надежность

• Доступность - процент время, когда система работоспособна с точки зрения пользователя

• Почему надежность важна?

• Надежность vs. ошибки

• Надежность с точки зрения пользователя

Page 27: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Примеры

• Amazon: выручка за 2013: $74.5 * 109, $2362/sec

Page 28: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Google Apps

• Доступность: кол-во ошибок > 5% в течение минуты

• 99.9% доступности в месяц (43 минуты downtime)

Page 29: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Доступность• 99% - 89 часов недоступности в год

• 99.9% - 9 часов

• 99.99% - 53 минуты

• 99.999% - 5 минут

• 99.9999% - 30 секунд

Page 30: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Page 31: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Amazon S3

• 99.999999999% долговечность

• 99.99% доступность

Page 32: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

ЭкономикаЗа

траты

1

100

10000

Нагрузка

10k 100k 1M 10M 100M

Проект А Проект Б

Page 33: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

ЭкономикаЗа

траты

0

15000

30000

45000

60000

Нагрузка

10k 100k 1M 10M 100M

Проект А Проект Б

Page 34: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Ресурсы• Процессор, память, диск, …

• Сеть

• Место

• Электропитание

• Деньги

Page 35: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Ограниченность

• Ресурсы одной машины ограничены

• Ресурсы одной стойки ограничены

• Ресурсы одного ДЦ ограничены

• Финансовый ресурс ограничен

Page 36: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Ресурсы одной машины

• PostgreSQL: 350 000 reads/s, 14 000 writes/s

• HTTP-сервер: 1000+ req/s (1 core)

Page 37: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Высокая нагрузка

• Нагрузка, подбирающаяся к пределу доступных ресурсов

Page 38: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Надежность компонентов• Надежность системы = MIN(надежность компонентов)

• Большое число компонентов - больше вероятность индивидуального сбоя

• Любой компонент всегда может дать сбой

• Архитектура, нацеленная на надежность, не всегда надежна на практике

Page 39: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Серебряная пуля

• Пример: RabbitMQ - будем использовать его, он масштабируется, у него High Availability

• А Вы умеете администрировать Erlang?

• А как масштабируется mnesia?

• Нет серебряной пули

Page 40: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Простота и надежность• Понятные (простые) решения “надежнее” сложных

• Проверенные решения: мы знаем сильные и слабые стороны

• Простота - проверка надежности проще

• Простота - понятнее действия в случае отказа

• Отказоустойчивые системы сложные

Page 41: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Page 42: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Page 43: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Page 44: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Отказы компонентов

• Какие отказы самые частые?

• Что делать в случае отказа?

• Дублирование

• Совместные отказы

Page 45: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Если у меня…

• 1 сервер, и он дает сбой 1 раз в год

• 365 таких серверов, то каждый день один из них дает сбой

Page 46: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Если у меня…

• Две копии компонента, каждый с надежностью 99%

• и они дают сбои независимо

• надежность 99.99%

Page 47: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Независимость сбоев• Общая инфраструктура (сеть, питание, охлаждение, …)

• Одинаковое “железо”

• Одинаковое ПО (одинаковые баги)

• Одинаковое время

• …

Page 48: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

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

• Отказоустойчивые решения сложные

• Сложность может быть причиной отказов

• Сложность должна быть понятной

Page 49: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Переключение Master-Slave

Page 50: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Масштабирование

Page 51: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Виды масштабирования

• Вертикальное масштабирование (увеличение производительности узла)

• Горизонтальное масштабирование (увеличение количества узлов)

Page 52: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Вертикальное масштабирование

• Доступные ресурсы одного сервера растут каждый год

• Стоимость топового сервера меньше сложности горизонтального масштабирования

• Ограничение производительности одного сервера

• Оптимизация кода

Page 53: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Горизонтальное масштабирование

• Если 1 сервис может выполнить 100 операций/секунду

• То N сервисов могут выполнить N*100 операций/секунду

• Бесконечное масштабирование!

Page 54: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Очередь. Worker

Page 55: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Очередь. Масштабирование?

Page 56: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Page 57: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Модель масштабирования и отказоустойчивости

• Пусть есть сервис, который умеет выполнять две операции:

• GET(key) ⇛ value

• PUT(key, value)

Page 58: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Две копии сервиса

Page 59: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Две копии сервиса• Масштабирование

• по чтению

• по записи (?)

• Консистентность:

• передача состояния, синхронизация

• синхронно/асинхронно

Page 60: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Отказ одного сервиса

Page 61: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Отказ одного сервиса

• Клиент замечает отказ сервиса

• Переключение на “живой”экземпляр

• Синхронизация при восстановлении

Page 62: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Отказ сети

Page 63: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Отказ сети• Отказ сети междуэкземплярами сервиса

• отказ свитча, соединяющего стойки

• Связность с клиентами не нарушена

• Неконсистентность по данным

• Что делать при восстановлении связи?

Page 64: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Работа из двух ДЦ

Page 65: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Работа из двух ДЦ

• Канал связи между ДЦ:

• задержки

• ненадежность

• ограниченная пропускная способность

Page 66: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Изменения

Page 67: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Изменения• Рефакторинг

• Изменение архитектуры

• Смена языка программирования

• Внедрение CI, автоматизация процессов

• Переход к другой базе данных

• Изменение структуры команд

• Изменение процесса эксплуатации

Page 68: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Распространение изменений

Page 69: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Принятие решений

• Один человек принимает решение и двигает вперед

• Коллектив принимает решение и исполняет его

• Решения навязывается “сверху” и применяется

Page 70: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Мотивация

• Какие проблемы есть сегодня? (Какие проблемы могут появиться завтра?)

• Стоимость изменения

• Какую пользу принесет изменение?

Page 71: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Измеряемый результат• Метрика, показывающая результат изменений

• Зависимость метрики от прочих факторов

• Ожидаемое изменение метрики

• Примеры:

• кол-во релизов в год

• кол-во багов

• доступность системы

Page 72: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Авторитет• Имеет влияние на коллектив

• Заслужил уважение (опыт, профессионализм)

• Способен донести мысль на уровне слушающих:

• разработчики

• менеджмент

Page 73: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Кривая изменений

текущее состояние

новое состояние

время

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

сопротивление

хаос

принятие,интеграция

Virginia Satir’s Change Curve

Page 74: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Проектирование проекта, подобного TwitterЛента твитов, following, @упоминания, поиск

Page 75: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

“twtr”: данные• Пользователь: account (login/password) + profile

(@username/full name)

• Твиты: 140 символов, автор, дата

• Follow: каждый пользователь followит произвольное количество других пользователей

• Лента: мои твиты + твиты тех, за кем я слежу, + упоминания

Page 76: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

“twtr”: запросы

• пользователь: получить профиль, регистрация, авторизация, удаление

• лента: отправить твит, получить мою ленту (N записей), получить мою ленту с k-ой записи, получить новые элементы (от j-ой записи)

• поиск: по произвольным словам

Page 77: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Какая будет схема базы данных? Какие запросы? Какие из них самые сложные? Какая архитектура? Какой язык программирования? Как тестировать? Как масштабировать? Как обеспечить отказоустойчивость? Какой будет мониторинг? …

Page 78: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Резюме

• Высокая нагрузка - это нагрузка, подбирающаяся к пределу доступных ресурсов

• Доступность - процент времени, когда система работает с точки зрения пользователя

• Проект, масштабирующийся экономически эффективно, выигрывает

Page 79: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Резюме

• Ответ на растущую нагрузку - масштабирование (вертикальное или горизонтальное)

• Отказоустойчивость через сложные или простые, но понятные решения

• Внедрение изменений: мотивация, метрика, авторитет, готовность к сопротивлению и хаосу

Page 80: Вебинар "Разработка высоконагруженных и надежных систем": Введение

© Copyright 2014 Andrey Smirnov

Спасибо!• Небольшой тест: http://goo.gl/bbWKaZ

• Жду ваших комментариев:

• @smira

[email protected]

• Skype: smirnov.andrey