Я много читал о доступных опциях. Я также получил в руки High Performance MySQL 2nd edition, которую я настоятельно рекомендую.
Вот что мне удалось собрать воедино:
Кластеризация
Кластеризация в общем смысле - это распределение нагрузки по многим серверам, которые представляются внешнему приложению как один сервер.
MySQL NDB Cluster
MySQL NDB Cluster - это распределенный механизм хранения в памяти, не имеющий общего доступа, с синхронной репликацией и автоматическим разделением данных (извините, я заимствовал буквально из книги «Высокая производительность», но они очень хорошо ее описали). Это может быть высокопроизводительное решение для некоторых приложений, но веб-приложения обычно не работают на нем.
Основная проблема заключается в том, что помимо очень простых запросов (которые касаются только одной таблицы), кластеру, как правило, придется искать данные на нескольких узлах, позволяя задержке в сети закрадываться и значительно замедлять время выполнения запросов. Поскольку приложение обрабатывает кластер как один компьютер, оно не может сказать ему, с какого узла получать данные.
Кроме того, требование в оперативной памяти не работает для многих больших баз данных.
Континуент Секвойя
Это еще одно кластерное решение для MySQL, которое действует как промежуточное ПО поверх сервера MySQL. Он предлагает синхронную репликацию, балансировку нагрузки и аварийное переключение. Это также гарантирует, что запросы всегда получают данные из последней копии, автоматически выбирая узел, который имеет свежие данные.
Я прочитал хорошие вещи , и в целом это звучит довольно многообещающе.
Федерация
Федерация похожа на кластеризацию, поэтому я тоже ее подтолкнул. MySQL предлагает объединение через объединенный механизм хранения. Подобно кластерному решению NDB, оно хорошо работает только с простыми запросами, но еще хуже, чем кластер для сложных запросов (поскольку задержка в сети намного выше).
Репликация и балансировка нагрузки
MySQL имеет встроенную способность создавать репликации базы данных на разных серверах. Это может быть использовано для многих целей - распределение нагрузки между серверами, горячее резервное копирование, создание тестовых серверов и отработка отказа.
Базовая настройка репликации включает в себя один главный сервер, обрабатывающий в основном записи, и один или несколько подчиненных, обрабатывающих только чтение. Более продвинутый вариант - это конфигурация master-master , которая также позволяет масштабировать записи, имея несколько серверов, выполняющих запись одновременно.
Каждая конфигурация имеет свои плюсы и минусы, но одной проблемой, с которой они все сталкиваются, является задержка репликации - поскольку репликация MySQL асинхронна, не все узлы имеют самые свежие данные за все время. Это требует, чтобы приложение было осведомлено о репликации и включало запросы, поддерживающие репликацию, чтобы работать как положено. Для некоторых приложений это может не быть проблемой, но если вам всегда нужны самые свежие данные, все усложняется.
Репликация требует некоторой балансировки нагрузки для разделения нагрузки между узлами. Это может быть так просто, как некоторые изменения в коде приложения, или использование специальных программных и аппаратных решений.
Sharding и partioning
Sharding - это широко используемый подход к масштабированию решений для баз данных. Вы разделяете данные на более мелкие фрагменты и распределяете их по разным узлам сервера. Это требует, чтобы приложение знало о модификации хранилища данных для эффективной работы, поскольку оно должно знать, где найти нужную информацию.
Существуют структуры абстракции, которые помогают справиться с разбиением данных, такие как Осколки гибернации , расширение Hibernate ORM (которое, к сожалению, находится на Java. Я использую PHP). HiveDB - еще одно такое решение, которое также поддерживает ребалансировку осколков.
Другие
Sphinx
Sphinx - это механизм полнотекстового поиска, который можно использовать не только для тестового поиска. Для многих запросов это намного быстрее, чем MySQL (особенно для группировки и сортировки), и может выполнять параллельные запросы к удаленным системам и объединять результаты, что делает его очень полезным при использовании с шардингом.
Обычно sphinx следует использовать с другими решениями для масштабирования, чтобы получить больше доступного оборудования и инфраструктуры. Недостатком является то, что вам снова нужен код приложения, чтобы быть в курсе сфинкса, чтобы использовать его с умом.
Краткое описание
Решения по масштабированию различаются в зависимости от потребностей приложения, в котором оно нуждается. Я считаю, что для нас и для большинства веб-приложений репликация (возможно, с несколькими хозяевами) - это способ распределения нагрузки с балансировщиком нагрузки. Разделение определенных проблемных областей (огромных таблиц) также необходимо для возможности горизонтального масштабирования.
Я также собираюсь дать шанс Continuent Sequoia и посмотреть, сможет ли он действительно выполнить то, что обещает, поскольку он будет включать наименьшее количество изменений в коде приложения.