clickhouse_cluster/readme.md

169 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

### Описание процесса создания кластера серверов БД ClickHouse с помощью Ansible Playbook
Требования:
- Для обеспечения координации узлов использовать Clickhouse-Keeper вместо Zookeeper (https://clickhouse.com/docs/ru/operations/clickhouse-keeper/)
- После старта БД создать реплицированную БД (https://clickhouse.com/docs/ru/engines/database-engines/replicated/)
- Создать внутри реплицированной БД произвольную таблицу
- Записать произвольные 10 строк в созданную таблицу используя для подключения адрес узла server1 в реплицированном кластере из 3-х узлов.
- Остановить узел server1, останется кластер из 2-х узлов
- Подключиться к узлу server2 или узлу server3, убедиться с помощью SELECT что данные остались в сохранности
1. Подготовка тестового окружения
Для создания тестового окружения используется Vagrantfile, который разворачивает 3 виртуальных хоста Ubuntu и передаёт в виртуалки SSH ключ хоста
```bash
user@host:~/clickhouse_cluster$ vagrant up
```
Логин/пароль вм: vagrant/vagrant
2. Создание кластера
Для создания кластера БД используется Ansible Playbook.
На 3 созданные вм устанавливается ClickHouse и формируются конфигурационные файлы для создания кластера
```bash
user@host:~/clickhouse_cluster$ ansible-playbook -i hosts.ini clickhouse.yaml -K
```
3. Проверка кластера
- на каждом хосту кластера подключиться к серверу БД
```bash
user@host:~/clickhouse_cluster$ clickhouse-client
```
*при успешном подключении, приглашение должно измениться на:*
```
vagrant@server1:~$ clickhouse-client
ClickHouse client version 21.12.2.17 (official build).
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 21.12.2 revision 54452.
server1 :)
```
- на каждом хосте кластера необходимо создать реплицированную БД
```
CREATE DATABASE testbase ENGINE=Replicated('/clickhouse/{cluster}/tables/testbase', '{shard}', '{replica}');
```
- на server1 создать локальную таблицу в созданной БД
```
create table testbase.localusers (id Int16, Name String, Age Int16) Engine=ReplicatedMergeTree() Order by id;
```
*таблица должна распространиться на все узлы кластера*
```
server1 :) create table testbase.localusers (id Int16, Name String, Age Int16) Engine=ReplicatedMergeTree() Order by id;
CREATE TABLE testbase.localusers
(
`id` Int16,
`Name` String,
`Age` Int16
)
ENGINE = ReplicatedMergeTree
ORDER BY id
Query id: d2cb6afe-a93c-4f4c-ac10-ef63f1e80702
┌─host───────┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ 1|replica1 │ 0 │ │ 2 │ 2 │
└────────────┴────────┴───────┴─────────────────────┴──────────────────┘
┌─host───────┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ 1|replica3 │ 0 │ │ 1 │ 0 │
│ 1|replica2 │ 0 │ │ 0 │ 0 │
└────────────┴────────┴───────┴─────────────────────┴──────────────────┘
3 rows in set. Elapsed: 0.243 sec.
```
- на server1 создать Distributed таблицу в созданной БД
```
create table testbase.users (id Int16, Name String, Age Int16) Engine=Distributed('testcluster','testbase', 'localusers');
```
*таблица также должна распределиться на все хосты кластера*
- создать в таблице users 10 строк
```
insert into testbase.users values(1, 'Max', '25'), (2, 'Den', '35'), (3, 'Bob', '22'), (4, 'Gleb', '44'), (5, 'Nikolay', '27'), (6, 'Anna', '26'), (7, 'Ira', '32'), (8, 'Lena', '21'), (9, 'Evgeniy', '33'), (10, 'Pavel', '41');
```
- проверить созданные строки на server1
```
select * from testbase.users;
```
```
SELECT *
FROM testbase.users
Query id: 87f9c04f-e073-4695-8452-ac078341869b
┌─id─┬─Name────┬─Age─┐
│ 1 │ Max │ 25 │
│ 2 │ Den │ 35 │
│ 3 │ Bob │ 22 │
│ 4 │ Gleb │ 44 │
│ 5 │ Nikolay │ 27 │
│ 6 │ Anna │ 26 │
│ 7 │ Ira │ 32 │
│ 8 │ Lena │ 21 │
│ 9 │ Evgeniy │ 33 │
│ 10 │ Pavel │ 41 │
└────┴─────────┴─────┘
10 rows in set. Elapsed: 0.007 sec.
```
- выключить server1 и проверить наличии созданных на server1 строк на оставшихся узлах кластера
```
server2 :) select * from testbase.users;
SELECT *
FROM testbase.users
Query id: af197532-d5ad-4068-8faa-f3bd7f6d0294
┌─id─┬─Name────┬─Age─┐
│ 1 │ Max │ 25 │
│ 2 │ Den │ 35 │
│ 3 │ Bob │ 22 │
│ 4 │ Gleb │ 44 │
│ 5 │ Nikolay │ 27 │
│ 6 │ Anna │ 26 │
│ 7 │ Ira │ 32 │
│ 8 │ Lena │ 21 │
│ 9 │ Evgeniy │ 33 │
│ 10 │ Pavel │ 41 │
└────┴─────────┴─────┘
10 rows in set. Elapsed: 0.005 sec.
```
```
server3 :) select * from testbase.users;
SELECT *
FROM testbase.users
Query id: e1397271-d994-4428-b79b-1d06547b1335
┌─id─┬─Name────┬─Age─┐
│ 1 │ Max │ 25 │
│ 2 │ Den │ 35 │
│ 3 │ Bob │ 22 │
│ 4 │ Gleb │ 44 │
│ 5 │ Nikolay │ 27 │
│ 6 │ Anna │ 26 │
│ 7 │ Ira │ 32 │
│ 8 │ Lena │ 21 │
│ 9 │ Evgeniy │ 33 │
│ 10 │ Pavel │ 41 │
└────┴─────────┴─────┘
10 rows in set. Elapsed: 0.007 sec.
```