--- title: 0. Основы и запросы description: published: true date: 2025-05-15T20:02:37.600Z tags: clickhouse editor: markdown dateCreated: 2025-05-15T20:01:45.285Z --- ## Структура кластера ### Найдено на просторах инета: ##### Выбор решения: - Если **диск загружен на запись (INSERT)** → **шардирование (Distributed)**. - Если **диск загружен на чтение (SELECT)** → **репликация (Replicated)**. - Если **один сервер, но много дисков** → **JBOD или RAID 0/10**. #### Реализуем такую структуру тестового кластера: - сервер clickhouse-1 - сервер clickhouse-2 - сервер clickhouse-keeper Для того, чтобы это было надежно и работало быстро с записью в БД, необходимо сделать репликацию (Replicated) таблиц и распределенный (Distributed) доступ к таблицам. Если делать несколько шардов (shard) в настройках кластера, то это значит, что часть данных будет находится на одном сервере, другая часть на другом. При выходе из строя сервера мы потеряем всю базу. Поэтому настраиваем shard1 на обоих серверах, а также replica1 и replica2 для дублирования данных на серверах. ### Репликация поддерживается только для таблиц семейства MergeTree: https://clickhouse.com/docs/ru/engines/table-engines/mergetree-family/replication - ReplicatedMergeTree - ReplicatedSummingMergeTree - ReplicatedReplacingMergeTree - ReplicatedAggregatingMergeTree - ReplicatedCollapsingMergeTree - ReplicatedVersionedCollapsingMergeTree - ReplicatedGraphiteMergeTree ### Для одиночного сервера и кластера #### Получение списка всех баз данных на сервере ```sql SHOW DATABASES; ``` #### Просмотр всех таблиц в конкретной базе default ```sql SHOW TABLES FROM default; ``` #### Получить запрос на создание таблицы из существующей ```sql show create table default.event; ``` #### Создание базы данных ```sql CREATE DATABASE IF NOT EXISTS my_database ENGINE = Atomic; ``` Создает новую базу данных с именем `my_database`. Если такая база уже существует, ничего не произойдет благодаря условию `IF NOT EXISTS`. Параметр `ENGINE = Atomic` используется для новых версий ClickHouse и позволяет создавать транзакционно безопасные базы данных. В ранних версиях использовался простой синтаксис без указания движка. #### Создание таблицы ```sql CREATE TABLE my_table ( event_date Date, user_id UInt32, page_views Int32, revenue Float64 ) ENGINE = MergeTree() ORDER BY (event_date); ``` ##### Вставка данных ```sql INSERT INTO my_table VALUES ('2023-08-01', 1, 10, 100.5), ('2023-08-02', 2, 15, 150.75); ``` ##### Выборка данных ```sql SELECT * FROM my_table WHERE event_date >= '2023-08-01' AND event_date <= '2023-08-31'; ``` #### Показ структуры таблицы ```sql DESCRIBE TABLE my_database.my_table; ``` или подробнее: ```sql SELECT * FROM system.columns WHERE table='my_table' AND database='my_database'; ``` ### Узнать сколько занимают места базы ```sql SELECT database, formatReadableSize(sum(bytes_on_disk)) AS total_size FROM system.parts WHERE active GROUP BY database ORDER BY sum(bytes_on_disk) DESC; ``` #### Узнать сколько занимают места таблицы в базе default ```sql SELECT name AS table_name, formatReadableSize(total_bytes) AS size_readable, total_rows AS rows_count FROM system.tables WHERE database = 'default' ORDER BY total_bytes DESC; ``` system ```sql SELECT name AS table_name, formatReadableSize(total_bytes) AS size_readable, total_rows AS rows_count FROM system.tables WHERE database = 'system' ORDER BY total_bytes DESC; ``` #### Очистка базы event_replicated ```sql TRUNCATE TABLE default.event_replicated; ``` #### Очистка старых данных от определенной даты ```sql ALTER TABLE my_table DELETE WHERE event_date < '2023-08-01'; ``` #### Безопасное удаление таблицы ```sql DROP TABLE IF EXISTS my_database.my_table; ``` Безопасно удаляет указанную таблицу, если она существует. ### Для кластера #### Вывести список серверов в кластере ```sql SELECT hostName() FROM clusterAllReplicas('smvu2_cluster', 'system', 'one') ``` #### Получение списка Replicated таблиц ```sql SELECT database, name AS table, engine FROM system.tables WHERE engine LIKE 'Replicated%'; ``` #### Получение списка Distributed таблиц ```sql SELECT database, name AS table, engine FROM system.tables WHERE engine LIKE 'Distributed%'; ``` #### Проверить распределение данных базы event на серверах кластера ```sql SELECT hostName() AS host, count() AS count FROM clusterAllReplicas(smvu2_cluster, default.event) GROUP BY host; ``` #### Удалить таблицу в кластере ```sql DROP TABLE event_replicated ON CLUSTER smvu2_cluster SYNC; ```