diff --git a/DevOps/Clickhouse/Cluster/0-Bases-and-query.md b/DevOps/Clickhouse/Cluster/0-Bases-and-query.md new file mode 100644 index 0000000..3abf422 --- /dev/null +++ b/DevOps/Clickhouse/Cluster/0-Bases-and-query.md @@ -0,0 +1,164 @@ +--- +title: Основы и запросы +description: +published: true +date: 2025-05-15T20:01:45.285Z +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; +``` \ No newline at end of file