Я багато читав доступних варіантів. Я також взяв у руки високопродуктивний MySQL 2nd edition, який я настійно рекомендую.
Це те, що мені вдалося скласти:
Скупчення
Кластеризація в загальному розумінні розподіляє навантаження на багатьох серверах, які зовнішнім додаткам здаються одним сервером.
Кластер NDB MySQL
Кластер MySQL NDB - це розподілений в пам’яті механізм зберігання даних із спільним використанням даних із синхронною реплікацією та автоматичним розподілом даних (вибачте, я позичаю буквально з книги «Висока продуктивність», але там це дуже гарно викладено). Це може бути високопродуктивним рішенням для деяких додатків, але веб-додаток, як правило, не працює з ним добре.
Основна проблема полягає в тому, що окрім дуже простих запитів (які стосуються лише однієї таблиці), кластеру, як правило, доведеться шукати дані на декількох вузлах, дозволяючи затримці затримки мережі та значно сповільнювати час завершення запитів. Оскільки програма розглядає кластер як один комп'ютер, вона не може сказати йому, з якого вузла отримати дані.
Крім того, потреба в пам’яті не діє для багатьох великих баз даних.
Постійна секвойя
Це ще одне рішення кластеризації для MySQL, яке діє як проміжне програмне забезпечення поверх сервера MySQL. Він пропонує синхронну реплікацію, балансування навантаження та відмову. Це також гарантує, що запити завжди отримують дані з останньої копії, автоматично вибираючи вузол, який містить свіжі дані.
Я прочитав кілька хороших речей , і в цілому це звучить досить багатообіцяюче.
Федерація
Федерація схожа на кластеризацію, тому я теж тузав її сюди. MySQL пропонує об'єднання через об'єднаний механізм зберігання. Подібно до рішення кластера NDB, він добре працює лише з простими запитами - але ще гірше кластер для складних (оскільки затримка мережі набагато вища).
Реплікація та балансування навантаження
MySQL має вбудовану здатність створювати копії бази даних на різних серверах. Це може бути використано для багатьох речей - розподілу навантаження між серверами, гарячих резервних копій, створення тестових серверів та відмови.
Основна установка реплікації передбачає обробку головним сервером здебільшого записів, а один або більше підлеглих обробляє лише читання. Більш досконалим варіантом є варіант конфігурації master-master , який дозволяє також масштабувати записи, маючи декілька серверів, що записують одночасно.
У кожної конфігурації є свої плюси і мінуси, але одна проблема, яку вони спільно мають, - це затримка реплікації - оскільки реплікація MySQL є асинхронною, не всі вузли мають найсвіжіші дані за весь час. Це вимагає, щоб програма знала про реплікацію та включала запити, що знають про реплікацію, щоб працювати належним чином. Для деяких додатків це може не становити проблеми, але якщо вам завжди потрібні найсвіжіші дані, речі дещо ускладнюються.
Реплікація вимагає деякого балансування навантаження, щоб розподілити навантаження між вузлами. Це може бути так просто, як деякі модифікації коду програми, або використання спеціальних програмних та апаратних рішень.
Заточування та розділення
Шардінг - загальновживаний підхід до масштабування рішень баз даних. Ви поділяєте дані на менші осколки та розподіляєте їх по різних вузлах сервера. Це вимагає від програми обізнаності про модифікацію сховища даних для ефективної роботи, оскільки вона повинна знати, де знайти потрібну інформацію.
Доступні фреймворки абстракції, які допоможуть вирішити питання з шардінгом даних, такі як Hibernate Shards , розширення Hibernate ORM (що, на жаль, є на Java. Я використовую PHP). HiveDB - ще одне таке рішення, яке також підтримує перебалансування осколків .
Інші
Сфінкс
Sphinx - це повнотекстовий пошуковий механізм, який може бути використаний набагато більше, ніж тестовий пошук. Для багатьох запитів це набагато швидше, ніж MySQL (особливо для групування та сортування), і може здійснювати паралельний запит до віддалених систем та агрегувати результати - що робить його дуже корисним у використанні з шардінгом.
Взагалі сфінкс слід використовувати з іншими рішеннями для масштабування, щоб отримати більше доступного обладнання та інфраструктури. Недоліком є те, що вам знову потрібен код програми, щоб знати про сфінкса, щоб використовувати його розумно.
Резюме
Рішення для масштабування різняться залежно від потреб програми, яка цього потребує. Як для нас, так і для більшості веб-додатків, я вважаю, що реплікація (ймовірно, мульти-майстер) - це шлях із балансуванням навантаження, що розподіляє навантаження. Шардірування конкретних проблемних областей (величезні таблиці) також необхідно для можливості масштабування по горизонталі.
Я також збираюся спробувати "Постійну секвойю" і подивитися, чи зможе вона насправді виконати те, що обіцяє, оскільки це призведе до найменшої кількості змін у коді програми.