Какие знаешь алгоритмы шардирования

«Какие знаешь алгоритмы шардирования» — вопрос из категории Базы данных, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Шардирование — это горизонтальное разделение данных между несколькими серверами. Основные алгоритмы:

  1. 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
    }
  1. Hash-based — хеш ключа (например, user_id) определяет шард.
    func getShard(key string, totalShards int) int {
        h := fnv.New32a()
        h.Write([]byte(key))
        return int(h.Sum32()) % totalShards
    }
  1. Consistent Hashing — минимизирует перераспределение данных при добавлении/удалении шардов (используется в DynamoDB, Cassandra).

  2. Directory-based — внешняя lookup-таблица хранит соответствие ключ → шард.

Проблемы: неравномерное распределение (skew), сложность решардинга.