Ответ
Шардирование — это техника горизонтального масштабирования базы данных, при которой данные разделяются на независимые части (шарды). В Go-приложениях мы обычно работаем с уже шардированной СУБД.
Основные стратегии шардирования:
-
Хэш-шардирование (Hash Sharding)
- Как работает: Шард определяется на основе хэш-функции от ключа (
shard_id = hash(key) % N
). - Плюсы: Обеспечивает равномерное распределение данных.
- Минусы: Добавление нового шарда требует перераспределения (рехеширования) большого количества данных.
- Пример логики в Go:
func getShardID(key string, numShards int) int { hash := crc32.ChecksumIEEE([]byte(key)) return int(hash % uint32(numShards)) }
- Как работает: Шард определяется на основе хэш-функции от ключа (
-
Диапазонное шардирование (Range Sharding)
- Как работает: Данные делятся по диапазонам ключей (например, пользователи с именами A-M на одном шарде, N-Z на другом).
- Плюсы: Эффективно для запросов по диапазону.
- Минусы: Может привести к неравномерной нагрузке и появлению «горячих» шардов (hotspots).
-
Геошардирование (Geo-based Sharding)
- Как работает: Данные распределяются по географическому признаку (например, по стране или региону пользователя).
- Плюсы: Снижает задержку для пользователей, так как данные хранятся ближе к ним.
- Минусы: Сложность в реализации и управлении.
-
Директивное шардирование (Directory-based Sharding)
- Как работает: Используется таблица поиска (lookup table), которая явно указывает, на каком шарде хранятся данные для конкретного ключа.
- Плюсы: Максимальная гибкость в управлении размещением данных.
- Минусы: Таблица поиска сама может стать узким местом и точкой отказа.
В Go-приложениях взаимодействие с шардированными системами (например, Vitess, CockroachDB, Redis Cluster) обычно происходит через драйверы или клиенты, которые инкапсулируют логику маршрутизации запросов.