Sharding — це спосіб розділити велику базу даних на декілька менших частин (shards), які зберігаються на різних серверах.
Основна ідея полягає в тому, щоб розподілити дані та навантаження між декількома серверами, замість того щоб зберігати все на одному.
Яку проблему він вирішує?
Уявімо, що ми розробляємо соціальну мережу, якою користуються мільйони людей. У базі даних зберігаються профілі користувачів, їхні дописи та інша інформація. З часом кількість користувачів зростає настільки, що один сервер більше не справляється з навантаженням.
Ми можемо купити потужніший сервер, але рано чи пізно досягнемо межі його можливостей.
Замість того щоб зберігати всіх користувачів на одному сервері, ми можемо розподілити їх між декількома:
- Shard 1 — користувачі з
user_idвід 1 до 1 000 000. - Shard 2 — користувачі з
user_idвід 1 000 001 до 2 000 000. - Shard 3 — користувачі з
user_idвід 2 000 001 до 3 000 000.
Тепер, коли потрібно отримати інформацію про користувача з user_id = 1500000, система визначає, що він знаходиться на другому сервері, та звертається безпосередньо до нього.
Таким чином, ми можемо горизонтально масштабувати базу даних, додаючи нові сервери в міру зростання навантаження.
Як визначити, на якому сервері зберігати дані?
Для цього використовується Shard Key — поле, за яким система визначає, до якого шарду належить запис.
Існує декілька популярних підходів:
- Range-based Sharding — розподіл за діапазонами значень, наприклад
user_idвід 1 до 1 000 000. - Hash-based Sharding — розподіл на основі хешу певного поля, наприклад
user_id. - Geographic Sharding — розподіл за географічним розташуванням, наприклад користувачі з Європи та США на різних серверах.
Чим Sharding відрізняється від Partitioning?
Обидва підходи передбачають розділення даних на менші частини.
Але є важлива відмінність:
- Partitioning — розділяє одну таблицю на частини в межах одного сервера бази даних.
- Sharding — розподіляє дані між декількома незалежними серверами баз даних.
Чи є недоліки у Sharding?
Так. Хоча Sharding дозволяє масштабувати систему, він значно ускладнює її архітектуру.
Наприклад:
- Потрібно визначати, на якому шарді знаходяться потрібні дані.
- Запити, які потребують інформації з декількох шардів, стають складнішими.
- Транзакції між різними шардами складніше реалізувати.
- Нерівномірний розподіл даних може призвести до перевантаження окремих серверів.