From 09c98dbbde97a4c6f71a29e9266cb40e6370a0c1 Mon Sep 17 00:00:00 2001 From: da2001 Date: Tue, 5 Mar 2024 12:27:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20=C2=AB?= =?UTF-8?q?/=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Vagrantfile | 22 +++++++ listenhost.xml | 3 + macros.xml.j2 | 7 ++ readme.md | 169 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 201 insertions(+) create mode 100644 Vagrantfile create mode 100644 listenhost.xml create mode 100644 macros.xml.j2 create mode 100644 readme.md diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000..c2e1ed5 --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,22 @@ +Vagrant.configure("2") do |config| + (1..3).each do |i| + config.vm.define "server#{i}" do |bd| + bd.vm.box = "ubuntu/focal64" + bd.vm.network "public_network", ip: "192.168.13.20#{i}", bridge: "wlp2s0" + bd.vm.hostname = "server#{i}" + + bd.vm.provision "shell" do |s| + ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip + s.inline = <<-SHELL + echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys + SHELL + end + + bd.vm.provider "virtualbox" do |v| + v.name = "server#{i}" + v.memory = 1024 + v.cpus = 1 + end + end + end +end \ No newline at end of file diff --git a/listenhost.xml b/listenhost.xml new file mode 100644 index 0000000..e4f4b22 --- /dev/null +++ b/listenhost.xml @@ -0,0 +1,3 @@ + + 0.0.0.0 + \ No newline at end of file diff --git a/macros.xml.j2 b/macros.xml.j2 new file mode 100644 index 0000000..b80e379 --- /dev/null +++ b/macros.xml.j2 @@ -0,0 +1,7 @@ + + + {{ cluster_name }} + replica{{ server_id }} + 1 + + \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..56e6960 --- /dev/null +++ b/readme.md @@ -0,0 +1,169 @@ +### Описание процесса создания кластера серверов БД 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. +``` \ No newline at end of file