Ответ
Шардирование — это техника горизонтального масштабирования базы данных, при которой данные разделяются на несколько частей (шардов). Существует несколько основных подходов:
-
Шардирование по ключу (Key-based / Hashed Sharding)
- Принцип: Ключ записи хешируется, и по значению хеша определяется шард.
shard_id = hash(key) % N
, где N — количество шардов. - Плюсы: Обеспечивает равномерное распределение данных.
- Минусы: При добавлении нового шарда (
N+1
) требуется перехешировать и переместить огромное количество данных. Затрудняет выполнение запросов по диапазону ключей.// Пример простой хеш-функции func getShardID(key string, numShards int) int { hash := crc32.ChecksumIEEE([]byte(key)) return int(hash % uint32(numShards)) }
- Принцип: Ключ записи хешируется, и по значению хеша определяется шард.
-
Шардирование по диапазону (Range-based Sharding)
- Принцип: Данные распределяются по шардам на основе диапазона значений ключа (например, клиенты с фамилиями А-М на шарде 1, Н-Я на шарде 2).
- Плюсы: Просто реализовать, идеально для запросов по диапазонам.
- Минусы: Может привести к неравномерной нагрузке («горячие» шарды), если данные распределены нелинейно.
-
Консистентное хеширование (Consistent Hashing)
- Принцип: Улучшенная версия хеш-шардирования. Ключи и серверы размещаются на воображаемом «кольце». Ключ сохраняется на первом сервере, который встречается при движении по часовой стрелке.
- Плюсы: При добавлении или удалении шарда затрагивается минимальное количество ключей. Идеально для динамического масштабирования.
- Библиотека для Go:
github.com/buraksezer/consistent
.
-
Шардирование на уровне базы данных (Database-level Sharding)
- Принцип: Многие современные СУБД поддерживают автоматическое или полуавтоматическое шардирование «из коробки».
- Примеры: MongoDB, CockroachDB, Vitess (для MySQL), Citus (для PostgreSQL).
- Плюсы: Логика шардирования скрыта от приложения, управляется самой СУБД.
-
Шардирование через прокси (Proxy-based Sharding)
- Принцип: Приложение взаимодействует с прокси-сервисом, который знает о расположении шардов и направляет запросы на нужный экземпляр БД.
- Плюсы: Логика шардирования вынесена из кода приложения, что упрощает его.