name: clickhouse service_id: 120 service_display_name: ClickHouse service_short_name: clickhouse service_man: '# Инструкция по управлению кластерами и пользователями ClickHouse

---

## Общая информация

ClickHouse — это колоночная система управления базами данных, предназначенная для обработки аналитических запросов в реальном времени. Платформа позволяет создавать, удалять, приостанавливать и возобновлять кластеры ClickHouse, а также управлять базами данных и пользователями.

Кластер создаётся через оператор Altinity (`https://github.com/Altinity/clickhouse-operator`) в ресурсной платформе типа `k8s`

Кластеры могут создаваться шардированными с произвольным количеством реплик. Для обеспечения отказоустойчивости и координации обязательно включение параметра `Создать ClickHouse-Keeper`.

Кластера создаются с обязательным бекапом. Для этого необходимо предварительно создать услугу `S3 Object Storage`.
---

## Доступные операции

* **create** — Создание кластера
* **delete** — Удаление кластера
* **suspend** — Приостановка работы кластера
* **resume** — Возобновление работы кластера
* **create_database** — Создание базы данных
* **delete_database** — Удаление базы данных
* **create_user** — Создание пользователя и настройка прав доступа к базе данных
* **delete_user** — Удаление пользователя

## Процесс создания и первого подключения

1. Выполнить операцию `create` - будет создан кластер
2. Выполнить операцию `create_database` - будет создана база данных
3. Выполнить операцию `create_user` - будет создан пользователь (выбрать доступ подключения к БД, созданной в п.2)

## Примеры подключения

### Подключение через HTTP-интерфейс

```bash
# Проверка доступности кластера
curl "http://<username>:<password>@<host>:8123/" -d "SELECT 1"

# Выполнение запроса
curl "http://<username>:<password>@<host>:8123/" -d "SHOW DATABASES"
```

## Простые кейсы
*Создать БД и обычной таблицы*
```clickhouse
CREATE TABLE database.table
(
id UInt64,
value String
)
ENGINE = MergeTree()
ORDER BY id;

INSERT INTO database.table SELECT number, toString(number) FROM numbers(10000000);

SELECT count() FROM database.table;
```
Базы и таблицы не реплицируются без специального ключа (`ON CLUSTER ''clickhousek8s''`)
В случае создания в стиле, описанным выше, необходимо будет выполнять действия на всех шардах/репликах


*Создание БД и шардированной таблицы*
```clickhouse
CREATE TABLE database.localUsers
(
id UInt64,
value String
)
ENGINE = MergeTree()
ORDER BY id;

CREATE TABLE database.shardedTable
AS localUsers
ENGINE = Distributed(''clickhousek8s'', ''database'', ''localUsers'', id);

INSERT INTO shardedTable SELECT number, toString(number) FROM numbers(10000000);

SELECT count() FROM shardedTable;
```
Важный момент - в данном примере таблицы придётся также выполнять на всех нодах ClickHouse

*Создание реплицируемой и шардированной таблицы*
```clickhouse
CREATE TABLE IF NOT EXISTS database.localUsers ON cluster ''clickhousek8s''
(
user_id UInt64,
name String,
email String
)
ENGINE = ReplicatedMergeTree(
''/clickhouse/tables/{shard}/localUsers'',
''{replica}''
)
ORDER BY user_id;

CREATE TABLE IF NOT EXISTS database.users ON cluster ''clickhousek8s''
AS database.localUsers
ENGINE = Distributed(''clickhousek8s'', ''database'', ''localUsers'', rand());

INSERT INTO database.users VALUES (1, ''Alice'', ''alice@example.com'');
INSERT INTO database.users VALUES (2, ''Bob'', ''bob@example.com'');
INSERT INTO database.users VALUES (3, ''Charlie'', ''charlie@example.com'');
INSERT INTO database.users VALUES (4, ''David'', ''david@example.com'');
INSERT INTO database.users VALUES (5, ''Gosha'', ''gosha@example.com'');
INSERT INTO database.users VALUES (6, ''Eve'', ''eve@example.com'');
INSERT INTO database.users VALUES (7, ''Frank'', ''frank@example.com'');
INSERT INTO database.users VALUES (8, ''Grace'', ''grace@example.com'');
INSERT INTO database.users VALUES (9, ''Hannah'', ''hannah@example.com'');
INSERT INTO database.users VALUES (10, ''Ivan'', ''ivan@example.com'');

SELECT * FROM database.localUsers;
SELECT * FROM database.users;

SELECT COUNT(*) AS total_users FROM database.users;
SELECT COUNT(*) AS total_users_local FROM database.localUsers;
```' lifecycle: suspend_on_destroy_default: true adopt_existing_on_create_default: false outputs: params: - code: state_params type: map - code: state_out type: map - code: state_params_flat type: map - code: state_out_flat type: map - code: vault_secrets type: map sensitive: true - code: vault_url type: string - code: vault_user_path type: string - code: vault_fields type: list operations: - name: create id: 181 kind: instance action: create man: Операция создания кластера ClickHouse

Для подключения к кластеру также необходимо создать базу данных через операцию `create_database` и создание пользователя через операцию `create_user` params: - id: 837 code: startupConfiguration data_type: map-fixed required: true sort: 10 - id: 838 code: clusterConfiguration data_type: map-fixed required: true sort: 20 is_modifiable: true - id: 839 code: accessConfiguration data_type: map-fixed required: true sort: 40 is_modifiable: true - id: 840 code: clickhouseKeeperConfiguration data_type: map-fixed required: true sort: 30 is_modifiable: true - id: 841 code: clickhouseConfiguration data_type: map-fixed required: true sort: 50 is_modifiable: true - id: 842 code: backupConfiguration data_type: map-fixed required: true sort: 70 is_modifiable: true - id: 843 code: autoscaleConfiguration data_type: map-fixed required: true sort: 80 is_modifiable: true - id: 851 code: clickhouseFilesConfiguration data_type: array-map-fixed required: false man: 'Формат:
- path: somethings3.xml
xmlConfig: ''<clickhouse>......</clickhouse>''' sort: 60 is_modifiable: true - name: create_database id: 186 kind: subresource action: create subresource: database man: База данных создаётся на всех репликах кластера ClickHouse params: - id: 600 code: dbName data_type: string required: true default: db01 regex: ^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$ descr: 'Пример: `db01`' sort: 10 - name: create_user id: 185 kind: subresource action: create subresource: user params: - id: 596 code: username data_type: string required: true default: myusername regex: ^(?![0-9_])[a-zA-Z_][a-zA-Z0-9_]{0,62}$ maxlength: 62 minlength: 2 descr: 'Пример: `myusername`' sort: 10 - id: 598 code: dbName data_type: array-map-fixed required: true default: '[{}]' sort: 30 - id: 599 code: accessHosts data_type: string required: true default: ::/0 descr: 'Пример: `::/0`' sort: 40 - name: delete id: 184 kind: instance action: delete man: Удаление возможно только после остановки сервиса через операцию `suspend`
После выполнения операции необходимо выждать определенное кол-во времени params: [] - name: delete_database id: 188 kind: subresource action: delete subresource: database man: Необратимое действие!!!
Трижды подумай, заблокируй телефон тимлида и не выполняй это действие params: - id: 602 code: dbName data_type: string required: true descr: ВСЕ ДАННЫЕ ВНУТРИ БД БУДУТ УДАЛЕНЫ - name: delete_user id: 187 kind: subresource action: delete subresource: user params: - id: 601 code: username required: true descr: Имя пользователя, созданное через операцию `create_user` - name: modify id: 189 kind: instance action: modify params: - id: 844 code: clusterConfiguration data_type: map-fixed required: true sort: 10 - id: 845 code: clickhouseKeeperConfiguration data_type: map-fixed required: true sort: 20 - id: 846 code: accessConfiguration data_type: map-fixed required: true sort: 30 - id: 847 code: clickhouseConfiguration data_type: map-fixed required: true sort: 40 - id: 848 code: backupConfiguration data_type: map-fixed required: true sort: 60 - id: 849 code: autoscaleConfiguration data_type: map-fixed required: true sort: 70 - id: 850 code: clickhouseFilesConfiguration data_type: array-map-fixed required: false man: 'Формат:
- path: somethings3.xml
xmlConfig: ''<clickhouse>......</clickhouse>''' sort: 50 - name: reconcile id: 276 kind: action action: reconcile params: [] - name: resume id: 183 kind: instance action: resume params: [] - name: suspend id: 182 kind: instance action: suspend man: Операция приводит к удалению всех подов
Persistent Volume остаются нетронутыми params: []