есть Distributed таблица, то в плане нагрузки, если я буду ходить всегда в один и тот же хост, но в Distributed таблицу, это чем-то хуже, чем если ходить во все хосты? (понятно, что если этот конкретный хост сдохнет, то мой код сломается, но помимо этого)
Весь поток данных пойдет через эту ноду.
это-то понятно, но Distributed таблица равномерно распределит нагрузку между всеми нодами?
Зависит от ключа
Должно быть включено партиционирование по правильному ключу. Потому что одна партиция будет на одном шарде, и если, скажем, это city_id, то данных по одному городу будет в разы больше, чем по другому => имбаланс. Более того, для Distributed в конфиге должен быть сконфигурен кластер со всеми нодами, где у нас шардинг. Если Distributed смотрит в локальную таблицу, она даже не знает о других машинах, и абсолютно независима. Можете покурить вот это https://kb.altinity.com/altinity-kb-setup-and-maintenance/cluster-production-configuration-guide/cluster-configuration-process/
сейчас посмотрю. но шард у меня всего один
Нет. Distributed таблица сама делает очень много вычислений, она финализирует вычисления. Ваша эта нода будет сильно перегружена Если шард один, то все вычисления вообще будут только на этой ноде. Из за настройки prefer_localhost_replica
при SELECT ... FROM distributed GROUP BY ... ORDER BY ... на всех нодах будут запущены переписанные запросы где аггрегирующе функции будут заменены на`funcNameState` для предаггрегации и будет сделана сортировка а на ноде инициаторе дальше будет финальная аггрегация и финальная сортировка... WHERE предикаты будут проброшены на все ноды так что да, нагрузка равномерная. но если у вас запрос сложный и куча sub queries то нода инициатор будет больше нагружена по памяти и CPU и даже может в memory limit упереться
Спасибо большое! Но под нодами вы подразумеваете шарды, верно? Если у меня 1 шард и 3 реплики с одинаковыми данными, то все будет обрабатываться локально на 1 реплике, верно?
нет шард это группа нод (реплик), одна и более нода это процесс clickhouse-server если у вас 1 шард с одинаковыми репликами ... то при Engine=Distirbuted у вас есть нода инициатор запроса потом в соответсвии https://clickhouse.com/docs/en/operations/settings/settings/#settings-load_balancing рандомно выбирается реплика на которой в Underlying таблице делается предаггрегация... и финализируется на ноде инициаторе
Ясно, значит все таки есть смысл использовать Distributed — нагрузка будет +- равномерная на ноды, кроме доп нагрузке на ноду-инициатор
это очень спорное утверждение) очень сильно зависит от запроса
смотря как random отработает я бы тупо chproxy \ haproxy \ nginx поставил перед ... и выбирал сразу из ReplicatedMergeTree engine=Distributed нужен только если у вас несколько шардов (непересекающихся наоборов данных с одинаковой структурой) его сделать в любой момент можно он данные только временные хранит при вставке... а при select ничего не хранит
да, выше правильно сказали можно ноду инициатор перегрузить финальной аггрегацией... и сортировкой... по CPU \ RAM стреляет
если у вас один шард и prefer_localhost_replica=1 (по дефолту) то запросы будут выполнятся локально, остальные реплики будут курить. Distributed имеет смысл даже с одним шардом смысла ходить в один сервер всегда мало, но можно, дешевле все-таки балансировку сделать даже с DNS
Обсуждают сегодня