Пост написан по мотивам разбора Database Sharding Explained (architecturenotes.co). Шардирование — классическая тема, поэтому текст и диаграммы здесь мои собственные; за развёрнутым первоисточником и иллюстрациями — по ссылке.

Рано или поздно одна база данных упирается в потолок: данных больше, чем влезает на диск одного сервера; запись идёт быстрее, чем один узел успевает переваривать; коннекты и блокировки начинают мешать друг другу. Первое, что делают (и правильно) — добавляют индексы, реплики для чтения, кэш, вертикально наращивают железо. Но всё это не решает одну проблему: запись и объём всё ещё упираются в один узел. Вот тут появляется шардирование.

Что такое шардирование

Шардирование (sharding) — это горизонтальное разбиение одного логического набора данных на несколько независимых баз (шардов), каждая из которых живёт на своём узле и хранит свою часть данных.

Ключевое слово — «свою часть». Не копию, а именно кусок. Пользователи с 1 по 1 000 000 — на первом шарде, с 1 000 001 по 2 000 000 — на втором, и так далее. Каждый шард — полноценная БД, которая ничего не знает про остальные.

Одна база данных разбивается на несколько шардов по shard key: каждый шард хранит свою часть данных

Чем это НЕ является

Три вещи часто путают:

На практике шардирование и репликация работают вместе: данные бьются на шарды, а каждый шард ещё и реплицируется.

Каждый шард состоит из primary для записи и нескольких реплик для чтения и отказоустойчивости

Shard key — сердце всей затеи

Shard key (ключ шардирования) — это поле (или набор полей), по которому принимается решение, на каком шарде живёт запись. От выбора shard key зависит вообще всё: равномерность нагрузки, скорость запросов, боль будущего решардинга.

Хороший shard key:

Стратегии распределения

Range-based (по диапазону)

Данные делятся по диапазонам значений ключа: A–F на первый шард, G–M на второй и т.д.

Hash-based (по хешу)

К ключу применяют хеш-функцию, и остаток от деления определяет шард: hash(user_id) % N.

Range-based складывает новые записи в один «последний» шард и раскаляет его, hash-based размазывает нагрузку ровно по всем шардам

Directory-based (справочник)

Отдельный сервис-справочник хранит явную таблицу «ключ → шард».

Реальные проблемы (то, о чём молчат в туториалах)

Шардирование не бесплатно. За масштабируемость платят сложностью:

Как смягчают

Когда шардировать НЕ надо

Честно: шардирование — это то, что откладывают до последнего, потому что оно необратимо усложняет систему. Сначала стоит выжать всё из более дешёвых средств:

  1. Индексы и оптимизация запросов — часто «медленная БД» лечится одним индексом.
  2. Реплики для чтения — если упор в чтение, а не в запись.
  3. Кэш (Redis/Valkey) перед БД — снимает основную массу повторных чтений.
  4. Вертикальное масштабирование — больше CPU/RAM/NVMe; одна мощная нода тянет очень много.
  5. Партиционирование в пределах одной БД — если проблема в размере таблиц, а не всего инстанса.

Шардирование оправдано, когда запись или объём реально не помещаются в один узел и всё вышеперечисленное исчерпано. Если можете не шардировать — не шардируйте.

Итог

Шардирование решает ровно одну задачу — масштабирование записи и объёма за пределы одного сервера — и делает это ценой серьёзной сложности: выбор shard key, кросс-шардовые запросы, решардинг, распределённые транзакции. Правильный порядок действий: индексы → реплики → кэш → вертикаль → партиционирование → и только потом шарды. А когда дошло до шардов — 80% успеха закладывается на этапе выбора shard key, так что это решение стоит вашего самого внимательного часа.

Авторские права

Автор: Vasiliy Fakunin

Ссылка: https://notes.melancholic.tech/posts/database-sharding/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша