Ответ
Шардирование — это горизонтальное разделение данных между несколькими серверами. Основные алгоритмы:
- Range-based — данные делятся по диапазонам (например, A-M на шард1, N-Z на шард2).
// Пример: выбор шарда по первой букве имени
func getShard(name string) int {
firstChar := strings.ToUpper(name[0:1])
if firstChar >= "A" && firstChar <= "M" {
return 0
}
return 1
}
- Hash-based — хеш ключа (например,
user_id) определяет шард.
func getShard(key string, totalShards int) int {
h := fnv.New32a()
h.Write([]byte(key))
return int(h.Sum32()) % totalShards
}
-
Consistent Hashing — минимизирует перераспределение данных при добавлении/удалении шардов (используется в DynamoDB, Cassandra).
-
Directory-based — внешняя lookup-таблица хранит соответствие ключ → шард.
Проблемы: неравномерное распределение (skew), сложность решардинга.