Upload
andrey-smirnov
View
254
Download
5
Embed Size (px)
Citation preview
© Copyright 2014 Andrey Smirnov
Разработка высоконагруженных и надежных систем
Андрей Смирнов, 2014
© Copyright 2014 Andrey Smirnov
Введение
Вебинар №1
© Copyright 2014 Andrey Smirnov
Обо мне
© Copyright 2014 Andrey Smirnov
О серии вебинаров
© Copyright 2014 Andrey Smirnov
План вебинаров1. Введение (этот вебинар)
2. Данные I. От основ хранения до РСУБД
3. Данные II. Шардинг, key-value и распределенные хранилища
4. Приложение
5. Архитектура веб-систем
6. Взаимодействие с клиентским приложением. Тестирование
7. Отказоустойчивость, мониторинг и выкатывание
© Copyright 2014 Andrey Smirnov
© Copyright 2014 Andrey Smirnov
Данные I + II
© Copyright 2014 Andrey Smirnov
Данные I. От основ хранения до РСУБД
• Базовые принципы хранения данных. Хранение на диске и в памяти.
• ACID. Реляционные БД.
• Проектирование схемы реальной БД в различных моделях данных.
• Индексы, денормализация, использование разных типов хранилищ для разных данных.
• Партиционирование. Репликация.
• Полнотекстовый поиск. 20 января 201518:00
© Copyright 2014 Andrey Smirnov
Данные II. Шардинг, key-value и распределенные хранилища• Масштабирование: шардинг в реляционных и key-
value хранилищах.
• Key-value хранилища.
• CAP-теорема.
• Распределенные хранилища. Консистентность.
• Кешированные данных: инвалидация кеша, тегирование кешей. 21 января 2015
18:00
© Copyright 2014 Andrey Smirnov
Приложение
© Copyright 2014 Andrey Smirnov
Приложение• Структура серверного и клиентского приложения, анализ узких и проблемных мест.
• Сетевой ввод-вывод: синхронный, асинхронный. Реактор, обслуживание большого числа соединений (C10K, C100K).
• Многозадачность: процессы, нити, кооперативная многозадачность, комбинации.
• Краткий обзор фреймворков и языков программирования: Ruby, Python, Go, Java, C#, Erlang, JavaScript.
• Безопасность. Типичные уязвимости. Пользователи и пароли. CSRF. 3 февраля 2015
18:00
© Copyright 2014 Andrey Smirnov
Архитектура
© Copyright 2014 Andrey Smirnov
Архитектура веб-систем• Архитектура системы: монолитная, сервис-ориентированная (SOA).
• Непосредственный вызов (RPC), очереди, персистентные очереди, очереди фоновых задач.
• Шины, широковещательные каналы.
• Примеры и разбор реальных архитектур веб-приложений.
5 февраля 2015 18:00
© Copyright 2014 Andrey Smirnov
Клиент,Тестирование
© Copyright 2014 Andrey Smirnov
Взаимодействие с клиентским приложением. Тестирование
• Синхронизация данных, работа в offline, информирование пользователя.
• Сетевое взаимодействие с сервером. Ошибки API. Клиент как веб-сервис. Алгоритмы повтора запроса.
• Нагрузочное и системное тестирование.
• Почему unit-тестирование бесполезно.
• Непрерывное тестирование, постоянное выкатывание. 10 февраля 2015
18:00
© Copyright 2014 Andrey Smirnov
Эксплуатация
© Copyright 2014 Andrey Smirnov
Отказоустойчивость, мониторинг и выкатывание
• Оценка нагрузки и планирование ресурсов.
• Резервное копирование, репликация. Master-Slave. Hot-Spare.
• Несколько дата-центров, схемы Active-Failover, Master-Slave, Active-Active.
• Обеспечение консистентности. Протоколы голосования.
• Выбор между “облаком” и железом.
• Выкатывание проекта, управление конфигурацией. Логирование. Мониторинг. 17 февраля 2015
18:00
© Copyright 2014 Andrey Smirnov
Данные I + II
Приложение
Клиент,Тестирование
Архитектура
Эксплуатация
© Copyright 2014 Andrey Smirnov
Бронируйте места!
• Сегодня каждый вебинар стоит 4 000 руб. (5 000 для юрлиц)
• Все 6 вебинаров: 16 000 руб. (скидка 33%) (21 000 руб. для юрлиц)
• Цена будет увеличиваться ближе к дате начала вебинаров!
© Copyright 2014 Andrey Smirnov
Нагрузка
• Что такое высокая нагрузка?
• Что такое нагрузка?
© 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 (поиск)
© Copyright 2014 Andrey Smirnov
Еще примеры
• Fastly (CDN): 500 000 req/s, 77 Gbit/s
• Akamai (CDN): 12 000 000 req/s (2010)
© Copyright 2014 Andrey Smirnov
И еще
• Google Public DNS: 1 504 629 req/s 47 450 000 000 000 (47 триллионов) запросов в год лог запросов (100 байт на запрос) занял бы 4315 Тб
© Copyright 2014 Andrey Smirnov
Нагрузка
• Запросы, кол-во запросов в секунду
• Задержка, время обработки запроса
• Конкурентность, одновременные запросы
• Отказы
© Copyright 2014 Andrey Smirnov
Производительность
• Нагрузка отнесенная к используемым ресурсам и времени выполнения
© Copyright 2014 Andrey Smirnov
Надежность
• Доступность - процент время, когда система работоспособна с точки зрения пользователя
• Почему надежность важна?
• Надежность vs. ошибки
• Надежность с точки зрения пользователя
© Copyright 2014 Andrey Smirnov
Примеры
• Amazon: выручка за 2013: $74.5 * 109, $2362/sec
© Copyright 2014 Andrey Smirnov
Google Apps
• Доступность: кол-во ошибок > 5% в течение минуты
• 99.9% доступности в месяц (43 минуты downtime)
© Copyright 2014 Andrey Smirnov
Доступность• 99% - 89 часов недоступности в год
• 99.9% - 9 часов
• 99.99% - 53 минуты
• 99.999% - 5 минут
• 99.9999% - 30 секунд
© Copyright 2014 Andrey Smirnov
© Copyright 2014 Andrey Smirnov
Amazon S3
• 99.999999999% долговечность
• 99.99% доступность
© Copyright 2014 Andrey Smirnov
ЭкономикаЗа
траты
1
100
10000
Нагрузка
10k 100k 1M 10M 100M
Проект А Проект Б
© Copyright 2014 Andrey Smirnov
ЭкономикаЗа
траты
0
15000
30000
45000
60000
Нагрузка
10k 100k 1M 10M 100M
Проект А Проект Б
© Copyright 2014 Andrey Smirnov
Ресурсы• Процессор, память, диск, …
• Сеть
• Место
• Электропитание
• Деньги
© Copyright 2014 Andrey Smirnov
Ограниченность
• Ресурсы одной машины ограничены
• Ресурсы одной стойки ограничены
• Ресурсы одного ДЦ ограничены
• Финансовый ресурс ограничен
© Copyright 2014 Andrey Smirnov
Ресурсы одной машины
• PostgreSQL: 350 000 reads/s, 14 000 writes/s
• HTTP-сервер: 1000+ req/s (1 core)
© Copyright 2014 Andrey Smirnov
Высокая нагрузка
• Нагрузка, подбирающаяся к пределу доступных ресурсов
© Copyright 2014 Andrey Smirnov
Надежность компонентов• Надежность системы = MIN(надежность компонентов)
• Большое число компонентов - больше вероятность индивидуального сбоя
• Любой компонент всегда может дать сбой
• Архитектура, нацеленная на надежность, не всегда надежна на практике
© Copyright 2014 Andrey Smirnov
Серебряная пуля
• Пример: RabbitMQ - будем использовать его, он масштабируется, у него High Availability
• А Вы умеете администрировать Erlang?
• А как масштабируется mnesia?
• Нет серебряной пули
© Copyright 2014 Andrey Smirnov
Простота и надежность• Понятные (простые) решения “надежнее” сложных
• Проверенные решения: мы знаем сильные и слабые стороны
• Простота - проверка надежности проще
• Простота - понятнее действия в случае отказа
• Отказоустойчивые системы сложные
© Copyright 2014 Andrey Smirnov
© Copyright 2014 Andrey Smirnov
© Copyright 2014 Andrey Smirnov
© Copyright 2014 Andrey Smirnov
Отказы компонентов
• Какие отказы самые частые?
• Что делать в случае отказа?
• Дублирование
• Совместные отказы
© Copyright 2014 Andrey Smirnov
Если у меня…
• 1 сервер, и он дает сбой 1 раз в год
• 365 таких серверов, то каждый день один из них дает сбой
© Copyright 2014 Andrey Smirnov
Если у меня…
• Две копии компонента, каждый с надежностью 99%
• и они дают сбои независимо
• надежность 99.99%
© Copyright 2014 Andrey Smirnov
Независимость сбоев• Общая инфраструктура (сеть, питание, охлаждение, …)
• Одинаковое “железо”
• Одинаковое ПО (одинаковые баги)
• Одинаковое время
• …
© Copyright 2014 Andrey Smirnov
Сложность и надежность
• Отказоустойчивые решения сложные
• Сложность может быть причиной отказов
• Сложность должна быть понятной
© Copyright 2014 Andrey Smirnov
Переключение Master-Slave
© Copyright 2014 Andrey Smirnov
Масштабирование
© Copyright 2014 Andrey Smirnov
Виды масштабирования
• Вертикальное масштабирование (увеличение производительности узла)
• Горизонтальное масштабирование (увеличение количества узлов)
© Copyright 2014 Andrey Smirnov
Вертикальное масштабирование
• Доступные ресурсы одного сервера растут каждый год
• Стоимость топового сервера меньше сложности горизонтального масштабирования
• Ограничение производительности одного сервера
• Оптимизация кода
© Copyright 2014 Andrey Smirnov
Горизонтальное масштабирование
• Если 1 сервис может выполнить 100 операций/секунду
• То N сервисов могут выполнить N*100 операций/секунду
• Бесконечное масштабирование!
© Copyright 2014 Andrey Smirnov
Очередь. Worker
© Copyright 2014 Andrey Smirnov
Очередь. Масштабирование?
© Copyright 2014 Andrey Smirnov
© Copyright 2014 Andrey Smirnov
Модель масштабирования и отказоустойчивости
• Пусть есть сервис, который умеет выполнять две операции:
• GET(key) ⇛ value
• PUT(key, value)
© Copyright 2014 Andrey Smirnov
Две копии сервиса
© Copyright 2014 Andrey Smirnov
Две копии сервиса• Масштабирование
• по чтению
• по записи (?)
• Консистентность:
• передача состояния, синхронизация
• синхронно/асинхронно
© Copyright 2014 Andrey Smirnov
Отказ одного сервиса
© Copyright 2014 Andrey Smirnov
Отказ одного сервиса
• Клиент замечает отказ сервиса
• Переключение на “живой”экземпляр
• Синхронизация при восстановлении
© Copyright 2014 Andrey Smirnov
Отказ сети
© Copyright 2014 Andrey Smirnov
Отказ сети• Отказ сети междуэкземплярами сервиса
• отказ свитча, соединяющего стойки
• Связность с клиентами не нарушена
• Неконсистентность по данным
• Что делать при восстановлении связи?
© Copyright 2014 Andrey Smirnov
Работа из двух ДЦ
© Copyright 2014 Andrey Smirnov
Работа из двух ДЦ
• Канал связи между ДЦ:
• задержки
• ненадежность
• ограниченная пропускная способность
© Copyright 2014 Andrey Smirnov
Изменения
© Copyright 2014 Andrey Smirnov
Изменения• Рефакторинг
• Изменение архитектуры
• Смена языка программирования
• Внедрение CI, автоматизация процессов
• Переход к другой базе данных
• Изменение структуры команд
• Изменение процесса эксплуатации
© Copyright 2014 Andrey Smirnov
Распространение изменений
© Copyright 2014 Andrey Smirnov
Принятие решений
• Один человек принимает решение и двигает вперед
• Коллектив принимает решение и исполняет его
• Решения навязывается “сверху” и применяется
© Copyright 2014 Andrey Smirnov
Мотивация
• Какие проблемы есть сегодня? (Какие проблемы могут появиться завтра?)
• Стоимость изменения
• Какую пользу принесет изменение?
© Copyright 2014 Andrey Smirnov
Измеряемый результат• Метрика, показывающая результат изменений
• Зависимость метрики от прочих факторов
• Ожидаемое изменение метрики
• Примеры:
• кол-во релизов в год
• кол-во багов
• доступность системы
© Copyright 2014 Andrey Smirnov
Авторитет• Имеет влияние на коллектив
• Заслужил уважение (опыт, профессионализм)
• Способен донести мысль на уровне слушающих:
• разработчики
• менеджмент
© Copyright 2014 Andrey Smirnov
Кривая изменений
текущее состояние
новое состояние
время
производительность
сопротивление
хаос
принятие,интеграция
Virginia Satir’s Change Curve
© Copyright 2014 Andrey Smirnov
Проектирование проекта, подобного TwitterЛента твитов, following, @упоминания, поиск
© Copyright 2014 Andrey Smirnov
“twtr”: данные• Пользователь: account (login/password) + profile
(@username/full name)
• Твиты: 140 символов, автор, дата
• Follow: каждый пользователь followит произвольное количество других пользователей
• Лента: мои твиты + твиты тех, за кем я слежу, + упоминания
© Copyright 2014 Andrey Smirnov
“twtr”: запросы
• пользователь: получить профиль, регистрация, авторизация, удаление
• лента: отправить твит, получить мою ленту (N записей), получить мою ленту с k-ой записи, получить новые элементы (от j-ой записи)
• поиск: по произвольным словам
© Copyright 2014 Andrey Smirnov
Какая будет схема базы данных? Какие запросы? Какие из них самые сложные? Какая архитектура? Какой язык программирования? Как тестировать? Как масштабировать? Как обеспечить отказоустойчивость? Какой будет мониторинг? …
© Copyright 2014 Andrey Smirnov
Резюме
• Высокая нагрузка - это нагрузка, подбирающаяся к пределу доступных ресурсов
• Доступность - процент времени, когда система работает с точки зрения пользователя
• Проект, масштабирующийся экономически эффективно, выигрывает
© Copyright 2014 Andrey Smirnov
Резюме
• Ответ на растущую нагрузку - масштабирование (вертикальное или горизонтальное)
• Отказоустойчивость через сложные или простые, но понятные решения
• Внедрение изменений: мотивация, метрика, авторитет, готовность к сопротивлению и хаосу
© Copyright 2014 Andrey Smirnov
Спасибо!• Небольшой тест: http://goo.gl/bbWKaZ
• Жду ваших комментариев:
• @smira
• Skype: smirnov.andrey