Highload осень 2012 лекция 6

45
Проектирование ПО для высоконагруженных систем Лекция №6 Александр Быков

Transcript of Highload осень 2012 лекция 6

Page 1: Highload осень 2012 лекция 6

Проектирование ПО для высоконагруженных систем

Лекция №6

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

Page 2: Highload осень 2012 лекция 6

Лекция 6

SATAЕмкость: 2 TbRPM: 7200Cache: 64 MbИнтерфейс: 3Gb/sЧтение/запись: 140MB/sSeek time R/W: 12/6 ms

Жесткие диски

SASЕмкость: 300 GbRPM: 15000Cache: 16 MbИнтерфейс: 6Gb/sЧтение/запись: 200MB/sSeek time R/W: 4 ms

DDR2Интерфейс: 6.4Gb/sЗадержка: 50 ns

Page 3: Highload осень 2012 лекция 6

Лекция 6

• Быстрое линейное чтение

• Медленный случайный доступ

• Конкуренция за диск уменьшает

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

• SATA – для логов

• SAS – для баз данных

• SSD – для кеширования

Особенности

Page 4: Highload осень 2012 лекция 6

Лекция 6

Redundant Array of Independent Disks

RAID 0 – Striping

RAID 1 – Mirroring

RAID 5 – Parity

RAID 6 – Double Parity

RAID 10 – Mirrored+Striped

Page 5: Highload осень 2012 лекция 6

Лекция 6

Hardware RAID

• Не создает нагрузку на систему

• В дорогих вариантах батарейка для записи

кеша

• Пропиетарный формат дисковSoftware RAID

• Немного медленнее дорогого аппаратного

• Открытость и совместимость со всем

Page 6: Highload осень 2012 лекция 6

Лекция 6

Особенности RAID

• «Вылетевший» диск увеличивает нагрузку на

остальные

• Синхронизация диска увеличивает нагрузку на

остальные

• Под повышенной нагрузкой может сломаться

второй в паре

• Скорость синхронизации можно регулировать

Page 7: Highload осень 2012 лекция 6

Лекция 6

Файловый системы

Ext4

• Mainline

• Быстрее работа с метадатанными и мелкими

файлами

XFS

• Для работы с большими массивами

• Много багов с производительностью

• Узкие места активно фиксятся

Page 8: Highload осень 2012 лекция 6

Лекция 6

Logical Volume Manager

• Дополнительный слой виртуализации

• Позволяет делать snapshot раздела на лету

• Snapshot создается в режиме copy-on-write

• Удобно использовать для бэкапа баз данных

• Под нагрузкой откладка снапшота тормозит

Page 9: Highload осень 2012 лекция 6

Лекция 6

Базы данных

PostgreSQL

• Полнофункциональная база данных

• Исправлены проблемы масштабируемости

• Плохо подходит для интенсивной онлайн-

нагрузки

MySQL

• Примитивная и быстрая

• Хорошо держит нагрузку

• Репликация

Page 10: Highload осень 2012 лекция 6

Лекция 6

Базы данных

MySQL: MyISAM

• Предельно простая

• Очень быстрое чтение

• Очень быстрая запись в конец

• Table-level lock

• Простой бинарный формат

• Отдельные файлы для формата, индекса,

данных

• Бьются данные на пропаже питания

• Потом долгий myisamchk

Page 11: Highload осень 2012 лекция 6

Лекция 6

Базы данных

MySQL: InnoDB

• Поддержка транзакций и прочих полезностей

• Сложные запросы лучше не использовать

• Row-level lock

• По-умолчанию все таблицы в одном файле

• Можно включить file-per-table

• Проблемы с hot-backup и переносом между

серверами

• В целом более медленная чем MyISAM

Page 12: Highload осень 2012 лекция 6

Лекция 6

MySQL Репликация

• Дублирование запросов над базой на ведомом

сервере

• Команды выполняются в один поток (медленно)

• Существует «отставание реплики»

• Реплика является горячим резервом

• С реплики можно снимать бекап

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

мастера)

Page 13: Highload осень 2012 лекция 6

Лекция 6

MySQL Alter Table

• На нагруженной базе невозможен – очень долго

• Делаем ALTER TABLE на реплике

• Блокируем master на запись

• Ждем когда реплика «догонится»

• Переключаем нагрузку на реплику

• Делаем бывший master репликой

Page 14: Highload осень 2012 лекция 6

Лекция 6

Альтернатива Alter Table

• Храним все данные объекта в одном JSON-поле

• Индексы по полям делаем в виде отдельных

таблиц

• Индексы заполняем программно после данных

• Индексы могут быть сквозными при шардинге

• Хранятся на отдельных шардах

Page 15: Highload осень 2012 лекция 6

Лекция 6

Проблемы одной большой базы

• Слишком большое кол-во запросов в секунду

• Слишком большое кол-во соединений

• Данные не влезают в диск

• Workset не влезает в оперативную память

• Медленный поиск по большим индексам

• Блокировки на таблицах/строках

• Блокировки на синхронизации

Page 16: Highload осень 2012 лекция 6

Лекция 6

Шардинг (Partitioning)

• По функциям / По идентификаторам

• Создаем одинаковые таблицы на N серверах

• Разбиваем данные на N частей

• Части должны быть достаточно маленькими

• По определенному правилу ходим на нужны

сервер

• Появляются понятия «мувить» и «сплитать»

Page 17: Highload осень 2012 лекция 6

Лекция 6

Общие правила

• Не использовать JOIN

• Не использовать транзакции

• Не использовать кеш запросов

• Не использовать хранимые процедуры и

триггеры

• Денормализация

• Поиск только по индексу

• Шардинг по Primary Key

• Шардинг по функциям

Page 18: Highload осень 2012 лекция 6

Лекция 6

Шардинг и репликация

Рассмотрим на примере LiveJournal:

• Проект с открытым исходным кодом

• Много информации по устройству

• Один из первых крупных проектов на MySQL

Page 19: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: One Server

Page 20: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: One Server - Problems

Page 21: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: Two Servers

Page 22: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: Two Servers - Problems

Page 23: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: Four Servers

Page 24: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: Four Servers - Problems

Page 25: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: Five Servers

Page 26: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: Replication Implementation

Page 27: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: More Servers

Page 28: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: Where we at….

Page 29: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: Problems with Architecture

Page 30: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: Problems with Architecture

Page 31: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: Spreading Writes

Page 32: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: Introducing User Clusters

Page 33: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: User Clusters

Page 34: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: User Cluster Implementation

Page 35: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: Where We At….

Page 36: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: Caching

Page 37: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: Where to cache ?

Page 38: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: memcached

Page 39: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: What to cache ?

Page 40: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: Caching Disadvantages

Page 41: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: Data Integrity

Page 42: Highload осень 2012 лекция 6

Лекция 6

LiveJournal: Persistent Connection Woes

Page 44: Highload осень 2012 лекция 6

Лекция 6

Домашнее задание №3

• Нагрузочное тестирование вашего веб-сервера

• Будем выполнять на следующей лабораторной

работе

Page 45: Highload осень 2012 лекция 6

Спасибо за вниманиеАлександр Быков

[email protected]