Часто в командах, где я работал, проверяли равномерность распределения уже после вставки. А сам ключ распределения/шардирования выбирали скорее интуитивно.
🔸 Будущее распределение можно посчитать, ничего не создавая и не перекладывая. Шард выбирается по остатку от деления значения ключа на число шардов, и этот остаток считается обычным
SELECT. Удобно это проверить в ClickHouse через cityHash64(). Представим что у нас есть табличка с продажами. Допустим, что у нас 5 шардов.
SELECT
cityHash64(order_id) % 5 AS target_shard,
count() AS orders
FROM orders
GROUP BY target_shard
ORDER BY target_shard;
Если ключ заказов создаётся на источнике равномерно, мы скорее всего увидим 5 примерно одинаковых строк, с разницей до 10% (моя субъективная оценка равномерности).
🔸 Допустим, типов заказа может быть 3. Тогда получим следующий запрос:
SELECT
cityHash64(order_type) % 5 AS target_shard,
count() AS orders
FROM orders
GROUP BY target_shard
ORDER BY target_shard;
И если вы думали, что в худшем случае 3 шарда получат данные, а 2 - нет, то ситуация может быть ещё веселее :) Остаток хэша может совпадать для нескольких значений, и в худшем случае все данные попадут на один шард.
Понимаю, что пример синтетический, и вряд ли опытные инженеры выберут такой ключ. Но, может быть, этот пост поможет тем, кто ещё набирается опыта. Принимайте решения на основе данных ;)
