wiki-js/DevOps/Clickhouse/Cluster/0-Bases-and-query.md

5.9 KiB
Raw Permalink Blame History

title description published date tags editor dateCreated
0. Основы и запросы true 2025-05-15T20:02:37.600Z clickhouse markdown 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

Для одиночного сервера и кластера

Получение списка всех баз данных на сервере

SHOW DATABASES;

Просмотр всех таблиц в конкретной базе default

SHOW TABLES FROM default;

Получить запрос на создание таблицы из существующей

show create table default.event;

Создание базы данных

CREATE DATABASE IF NOT EXISTS my_database ENGINE = Atomic;

Создает новую базу данных с именем my_database. Если такая база уже существует, ничего не произойдет благодаря условию IF NOT EXISTS. Параметр ENGINE = Atomic используется для новых версий ClickHouse и позволяет создавать транзакционно безопасные базы данных. В ранних версиях использовался простой синтаксис без указания движка.

Создание таблицы

CREATE TABLE my_table (
    event_date Date,
    user_id UInt32,
    page_views Int32,
    revenue Float64
)
ENGINE = MergeTree()
ORDER BY (event_date);
Вставка данных
INSERT INTO my_table VALUES ('2023-08-01', 1, 10, 100.5), ('2023-08-02', 2, 15, 150.75);
Выборка данных
SELECT * FROM my_table WHERE event_date >= '2023-08-01' AND event_date <= '2023-08-31';

Показ структуры таблицы

DESCRIBE TABLE my_database.my_table;

или подробнее:

SELECT * FROM system.columns WHERE table='my_table' AND database='my_database';

Узнать сколько занимают места базы

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

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

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

TRUNCATE TABLE default.event_replicated;

Очистка старых данных от определенной даты

ALTER TABLE my_table DELETE WHERE event_date < '2023-08-01';

Безопасное удаление таблицы

DROP TABLE IF EXISTS my_database.my_table;

Безопасно удаляет указанную таблицу, если она существует.

Для кластера

Вывести список серверов в кластере

SELECT hostName() FROM clusterAllReplicas('smvu2_cluster', 'system', 'one')

Получение списка Replicated таблиц

SELECT 
    database,
    name AS table,
    engine
FROM system.tables
WHERE engine LIKE 'Replicated%';

Получение списка Distributed таблиц

SELECT
    database,
    name AS table,
    engine
FROM system.tables
WHERE engine LIKE 'Distributed%';

Проверить распределение данных базы event на серверах кластера

SELECT 
    hostName() AS host,
    count() AS count
FROM clusterAllReplicas(smvu2_cluster, default.event)
GROUP BY host;

Удалить таблицу в кластере

DROP TABLE event_replicated ON CLUSTER smvu2_cluster SYNC;