164 lines
5.9 KiB
Markdown
164 lines
5.9 KiB
Markdown
---
|
||
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;
|
||
``` |