highload осень 2012 лекция 6
Post on 15-Jun-2015
83 Views
Preview:
TRANSCRIPT
Проектирование ПО для высоконагруженных систем
Лекция №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
Лекция 6
• Быстрое линейное чтение
• Медленный случайный доступ
• Конкуренция за диск уменьшает
производительность
• SATA – для логов
• SAS – для баз данных
• SSD – для кеширования
Особенности
Лекция 6
Redundant Array of Independent Disks
RAID 0 – Striping
RAID 1 – Mirroring
RAID 5 – Parity
RAID 6 – Double Parity
RAID 10 – Mirrored+Striped
Лекция 6
Hardware RAID
• Не создает нагрузку на систему
• В дорогих вариантах батарейка для записи
кеша
• Пропиетарный формат дисковSoftware RAID
• Немного медленнее дорогого аппаратного
• Открытость и совместимость со всем
Лекция 6
Особенности RAID
• «Вылетевший» диск увеличивает нагрузку на
остальные
• Синхронизация диска увеличивает нагрузку на
остальные
• Под повышенной нагрузкой может сломаться
второй в паре
• Скорость синхронизации можно регулировать
Лекция 6
Файловый системы
Ext4
• Mainline
• Быстрее работа с метадатанными и мелкими
файлами
XFS
• Для работы с большими массивами
• Много багов с производительностью
• Узкие места активно фиксятся
Лекция 6
Logical Volume Manager
• Дополнительный слой виртуализации
• Позволяет делать snapshot раздела на лету
• Snapshot создается в режиме copy-on-write
• Удобно использовать для бэкапа баз данных
• Под нагрузкой откладка снапшота тормозит
Лекция 6
Базы данных
PostgreSQL
• Полнофункциональная база данных
• Исправлены проблемы масштабируемости
• Плохо подходит для интенсивной онлайн-
нагрузки
MySQL
• Примитивная и быстрая
• Хорошо держит нагрузку
• Репликация
Лекция 6
Базы данных
MySQL: MyISAM
• Предельно простая
• Очень быстрое чтение
• Очень быстрая запись в конец
• Table-level lock
• Простой бинарный формат
• Отдельные файлы для формата, индекса,
данных
• Бьются данные на пропаже питания
• Потом долгий myisamchk
Лекция 6
Базы данных
MySQL: InnoDB
• Поддержка транзакций и прочих полезностей
• Сложные запросы лучше не использовать
• Row-level lock
• По-умолчанию все таблицы в одном файле
• Можно включить file-per-table
• Проблемы с hot-backup и переносом между
серверами
• В целом более медленная чем MyISAM
Лекция 6
MySQL Репликация
• Дублирование запросов над базой на ведомом
сервере
• Команды выполняются в один поток (медленно)
• Существует «отставание реплики»
• Реплика является горячим резервом
• С реплики можно снимать бекап
• С реплики можно читать данные (с задержкой от
мастера)
Лекция 6
MySQL Alter Table
• На нагруженной базе невозможен – очень долго
• Делаем ALTER TABLE на реплике
• Блокируем master на запись
• Ждем когда реплика «догонится»
• Переключаем нагрузку на реплику
• Делаем бывший master репликой
Лекция 6
Альтернатива Alter Table
• Храним все данные объекта в одном JSON-поле
• Индексы по полям делаем в виде отдельных
таблиц
• Индексы заполняем программно после данных
• Индексы могут быть сквозными при шардинге
• Хранятся на отдельных шардах
Лекция 6
Проблемы одной большой базы
• Слишком большое кол-во запросов в секунду
• Слишком большое кол-во соединений
• Данные не влезают в диск
• Workset не влезает в оперативную память
• Медленный поиск по большим индексам
• Блокировки на таблицах/строках
• Блокировки на синхронизации
Лекция 6
Шардинг (Partitioning)
• По функциям / По идентификаторам
• Создаем одинаковые таблицы на N серверах
• Разбиваем данные на N частей
• Части должны быть достаточно маленькими
• По определенному правилу ходим на нужны
сервер
• Появляются понятия «мувить» и «сплитать»
Лекция 6
Общие правила
• Не использовать JOIN
• Не использовать транзакции
• Не использовать кеш запросов
• Не использовать хранимые процедуры и
триггеры
• Денормализация
• Поиск только по индексу
• Шардинг по Primary Key
• Шардинг по функциям
Лекция 6
Шардинг и репликация
Рассмотрим на примере LiveJournal:
• Проект с открытым исходным кодом
• Много информации по устройству
• Один из первых крупных проектов на MySQL
Лекция 6
LiveJournal: One Server
Лекция 6
LiveJournal: One Server - Problems
Лекция 6
LiveJournal: Two Servers
Лекция 6
LiveJournal: Two Servers - Problems
Лекция 6
LiveJournal: Four Servers
Лекция 6
LiveJournal: Four Servers - Problems
Лекция 6
LiveJournal: Five Servers
Лекция 6
LiveJournal: Replication Implementation
Лекция 6
LiveJournal: More Servers
Лекция 6
LiveJournal: Where we at….
Лекция 6
LiveJournal: Problems with Architecture
Лекция 6
LiveJournal: Problems with Architecture
Лекция 6
LiveJournal: Spreading Writes
Лекция 6
LiveJournal: Introducing User Clusters
Лекция 6
LiveJournal: User Clusters
Лекция 6
LiveJournal: User Cluster Implementation
Лекция 6
LiveJournal: Where We At….
Лекция 6
LiveJournal: Caching
Лекция 6
LiveJournal: Where to cache ?
Лекция 6
LiveJournal: memcached
Лекция 6
LiveJournal: What to cache ?
Лекция 6
LiveJournal: Caching Disadvantages
Лекция 6
LiveJournal: Data Integrity
Лекция 6
LiveJournal: Persistent Connection Woes
Лекция 6
Литература
• http://www.danga.com/words/2005_oscon/oscon-2005.pdf
• http://www.addsimplicity.com/downloads/eBaySDForum2006-11-29.pdf
• http://qconlondon.com/dl/qcon-london-2008/slides/RandyShoup_eBaysArchitecturalPrinciples.pdf
• http://www.slideshare.net/tcng3716/ebay-architecture
• http://friendfeed.com/bret/dd79a583/how-friendfeed-uses-mysql-to-store-schema-less
Лекция 6
Домашнее задание №3
• Нагрузочное тестирование вашего веб-сервера
• Будем выполнять на следующей лабораторной
работе
Спасибо за вниманиеАлександр Быков
bykov@corp.mail.ru
top related