Настройка кластера Clickhouse Steb-by-Step — часть 2

Продолжение статьи Настройка кластера Clickhouse Steb-by-Step про создание кластера. Ранее мы обсудили основы процесса шардирования и репликации clickhouse. В этой записи блога подробно поговорим об установке и настройке кластера.

Создание и настройка кластера Clickhouse

Давайте построим кластер Clickhouse: 3 (шарда) x 2 (реплики) = ​​6 узлов. Схема логической топологии выглядит следующим образом.

Создание кластера Clickhouse
3 (Shard) x 2 (Replicas) = ​​6 узлов кластера Clickhouse

Для построения такого кластера будем использовать 6 серверов.

Мы будем использовать ReplicatedMergeTree & Distributed движки таблиц для настройки нашей таблицы.

Приведенная выше конфигурация изображает кластер из шести узлов Сlickhouse в связке с Zookeeper.

Для Zookeeper требуется минимум 3 сервера. 3 сервера — это оптимальная установка, которая работает даже в сильно загруженных системах при правильной настройке.

5 серверов с меньшей вероятностью полностью потеряют кворум, но также это приведет к увеличению времени сбора кворума.

Могут быть добавлены дополнительные серверы для Zookeeper, но всегда должно быть нечетное количество серверов.

Подготовка на всех нодах кластера

Отключить iptables

Как пользователь root проверьте статус

/sbin/chkconfig --list iptables
  1. Если iptables отключен, вывод команды будет следующим:
iptables 0:off 1:off 2:off 3:off 4:off 5:off 6:off

2. При необходимости запустите эту команду как root, чтобы отключить iptables:

/sbin/chkconfig iptables off

После применения изменений вам потребуется перезагрузить систему.

3. Для систем с firewalldпроверьте статус командой:

systemctl status firewalld

Если firewalld отключен, вывод команды будет:

* firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

При необходимости запустите эти команды от имени пользователя root, чтобы отключить firewalld:

systemctl stop firewalld.service
systemctl disable firewalld.service

Отключить Selinux

SELinux должен быть отключен для clickhouse. Чтобы временно отключить его, выполните следующую команду на каждом хосте в кластере:

setenforce 0

Настоятельно рекомендуется отключить SELinux навсегда, чтобы он не запускался при перезагрузке системы. Для этого внесите изменения в /etc/selinux/config:

sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

Включить синхронизацию времени

Установим пакет ntp, если не установлен.

yum install -y ntp

Добавим команду синхронизации в cron пользователя root

crontab -e
*/5 * * * * /usr/sbin/ntpdate -u clock.isc.org >/dev/null 2>&1

Отредактировать /etc/hosts

Добавим все имеющиеся хосты в /etc/hosts

Дополнительные пакеты

Установим дополнительно пакеты:

yum install -y curl wget

Перезагрузить серверы

И перезагрузим все серверы.

Установка Java на серверы Zookeeper

Необходимо нечетное количество хостов. Рекомендуется три. Можно больше, но будет больше время для получения кворума. Рекомендуется размещать этот сервис на отдельных серверах.

Выбираем 3 хоста: node1, node2, node3.

Удалим jdk (если установлено) и установим пакеты java-openjdk:

yum remove -y jdk
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel

Создадим файл /etc/profile.d/java_home.sh следующего содержания:

jdk_version=$(ls -al /usr/lib/jvm|grep "^d"|grep "java"|awk '{print$NF}')
export JAVA_HOME=/usr/lib/jvm/$jdk_version

Установка Zookeeper

Создадим системные группу и пользователя.

groupadd -r zookeeper
useradd -c "ZooKeeper" -s /sbin/nologin -g zookeeper -r zookeeper

Скачиваем пакет и распаковываем пакет.

cd /tmp
curl -O "http://dlcdn.apache.org/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz"
tar zxvf apache-zookeeper-3.7.1-bin.tar.gz -C /usr/local && ln -s /usr/local/apache-zookeeper-3.7.1-bin /usr/local/zookeeper
chown -R zookeeper:zookeeper /usr/local/apache-zookeeper-3.7.1-bin
chown zookeeper:zookeeper /usr/local/zookeeper

Создадим рабочие каталоги.

mkdir /var/lib/zookeeper
mkdir /var/log/zookeeper
chown zookeeper:zookeeper /var/lib/zookeeper
chown zookeeper:zookeeper /var/log/zookeeper

Создаем конфигурационный файл /usr/local/zookeeper/conf/zoo.cfg следующего содержания

# The number of milliseconds of each tick
tickTime=2000

# The number of ticks that the initial
# synchronization phase can take
initLimit=10

# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=1

# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/var/lib/zookeeper

# Directory to write the transaction log to the dataLogDir rather than the dataDir.
# This allows a dedicated log device to be used, and helps avoid competition between logging and snaphots.
dataLogDir=/var/lib/zookeeper

# the port at which the clients will connect
clientPort=2181

# the maximum number of client connections.
# increase this if you need to handle more clients
maxClientCnxns=10000

# The number of snapshots to retain in dataDir
autopurge.snapRetainCount=100
# Purge task interval in hours
# Set to "0" to disable auto purge feature
autopurge.purgeInterval=24
autopurge.snapRetainCount=3
#Service
server.0=node1:2888:3888
server.1=node2:2888:3888
server.2=node3:2888:3888

Создадим симлинк на конфигурационный файл.

chown zookeeper:zookeeper /usr/local/zookeeper/conf/zoo.cfg
mkdir /etc/zookeeper
chown zookeeper:zookeeper /etc/zookeeper
ln -s /usr/local/zookeeper/conf/zoo.cfg /etc/zookeeper/zoo.cfg
chown zookeeper:zookeeper /etc/zookeeper/zoo.cfg

На каждой ноде Zookeeper создадим файл /var/lib/zookeeper/myid с номером этой ноды в кластере Zookeeper (NUM_NODE от 0 до 2, в соответствии с файлом конфигурации).

echo NUM_NODE > /var/lib/zookeeper/myid
chown zookeeper:zookeeper /var/lib/zookeeper/myid
chown -R zookeeper:zookeeper /var/lib/zookeeper/
chown -R zookeeper:zookeeper /usr/local/zookeeper/

Проверки Zookeeper

 Запустить zookeeper сервер и проверить, все ли работает корректно на всех трех нодах.

# /usr/local/zookeeper/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

Подключиться к нему клиентом и посмотреть, что находится внутри.

# /usr/local/zookeeper/bin/zkCli.sh -server localhost:2181 get /zookeeper/config

Останавливаем Zookeeper и создаем сервис /lib/systemd/system/zookeeper.service.

# /usr/local/zookeeper/bin/zkServer.sh stop
[unit]
Description=zookeeper:3.6.2
After=network.target

[Service]
Type=forking
User=zookeeper
Group=zookeeper

WorkingDirectory=/usr/local/zookeeper

ExecStart=/usr/local/zookeeper/bin/zkServer.sh start
ExecStop=/usr/local/zookeeper/bin/zkServer.sh stop
ExecReload=/usr/local/zookeeper/bin/zkServer.sh restart

RestartSec=30
Restart=always

PrivateTmp=yes
PrivateDevices=yes

LimitCORE=infinity
LimitNOFILE=500000
[Install]
WantedBy=multi-user.target
Alias=zookeeper.service

Поменяем права на рабочую директорию и запускаем сервис. Логи смотрим в директории /usr/local/zookeeper/logs/

systemctl start zookeeper

Установка Clickhouse

Чтобы настроить кластер clickhouse, в качестве первого шага нам нужно установить clickhouse на всех узлах в кластере. Я собираюсь установить последние версии стабильных пакетов на всех узлах по инструкции https://clickhouse.com/docs/ru/getting-started/install/. Интересно, что документация для Clickhouse доступна только для последней версии.

Версия ОС сервера

NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"

Сначала нужно подключить официальный репозиторий и установить пакеты:

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://packages.clickhouse.com/rpm/clickhouse.repo
sudo yum install -y clickhouse-server clickhouse-client

Изменение конфигурации

Параметры кластера Clickhouse определяются файлом конфигурации config.xml. Нас особенно интересуют три части:

  1. remote_servers,
  2. zookeeper,
  3. macros.

Разделы remote_servers и zookeeper для всех узлов одинаковы, но части macros разные по содержанию. Каждый узел изменяет значения шарда и реплики в соответствии со своей ролью. Давайте рассмотрим config.xml, расположенный в директории /etc/clickhouse-server

config.xml

<?xml version="1.0"?>
<yandex>

    <logger>
        <level>trace</level>
        <log>/var/log/clickhouse-server/clickhouse-server.log</log>
        <errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>
        <size>1000M</size>
        <count>10</count>
    </logger>

    <http_port>8123</http_port>
    <tcp_port>9000</tcp_port>

    <listen_host>0.0.0.0</listen_host> 

    <interserver_http_port>9009</interserver_http_port>

    <max_connections>100</max_connections>
    <keep_alive_timeout>3</keep_alive_timeout>

    <max_concurrent_queries>50</max_concurrent_queries>

    <mark_cache_size>5368709120</mark_cache_size>

    <path>/var/lib/clickhouse/</path>
    <tmp_path>/var/lib/clickhouse/tmp/</tmp_path>
    <user_files_path>/var/lib/clickhouse/user_files/</user_files_path>
    <users_config>users.xml</users_config>
    <access_control_path>/var/lib/clickhouse/access/</access_control_path>
    <default_profile>default</default_profile>
    <default_database>default</default_database>

    <distributed_ddl>
        <path>/clickhouse/task_queue/ddl</path>
    </distributed_ddl>

    <remote_servers>
        <cluster_1>
            <shard>
                <internal_replication>true</internal_replication>
                <weight>1</weight>
                <replica>
                    <host>clickhouse-01</host>
                    <port>9000</port>
                </replica>
				<replica>
                    <host>clickhouse-04</host>
                    <port>9000</port>
                </replica>
            </shard>
	    <shard>
                <internal_replication>true</internal_replication>
                <weight>1</weight>
                <replica>
                    <host>clickhouse-02</host>
                    <port>9000</port>
                </replica>
				<replica>
                    <host>clickhouse-05</host>
                    <port>9000</port>
                </replica>
            </shard>
	    <shard>
                <internal_replication>true</internal_replication>
                <weight>1</weight>
                <replica>
                    <host>clickhouse-03</host>
                    <port>9000</port>
                </replica>
				<replica>
                    <host>clickhouse-06</host>
                    <port>9000</port>
                </replica>
            </shard>
        </cluster_1>
    </remote_servers>

    <zookeeper>
        <node>
                <host>node1</host>
                <port>2181</port>
        </node>
		<node>
                <host>node2</host>
                <port>2181</port>
        </node>
		<node>
                <host>node3</host>
                <port>2181</port>
        </node>
    </zookeeper>

    <macros>
        <replica>clickhouse-01</replica>
        <shard>01</shard>
        <layer>01</layer>
    </macros>

<dictionaries_config>*/*_dictionary.xml</dictionaries_config>
</yandex>

В приведенном выше файле xml обратите внимание на следующем

http_port — Порт для обращений к серверу по протоколу HTTP.

tcp_port — Порт для общения с клиентами по TCP протоколу.

interserver_http_port — Порт для обмена репликационными данными с серверами ClickHouse.

listen_host — На каких хостах слушать входящие подключения.

<listen_host>::1</listen_host> — сервер слушает ipv6 localhost. <listen_host>127.0.0.1</listen_host> — сервер слушает только запросы с localhost. <listen_host>0.0.0.0</listen_host> — сервер слушает все запросы с ipv4 адресов.

max_connections — Максимальное количество входящих соединений.

max_concurrent_queries — Максимальное количество одновременно обрабатываемых запросов.

users_config — Путь к файлу, который отвечает за конфигурацию пользователей, права, профили и квоты.

http_server_default_response — Контент, который возвращается при обращении к HTTP (s) серверу. По умолчанию сервер отдает «Ok.»

path — Путь к данным ClickHouse. Завершающий слеш обязателен. Не рекомендуется менять дефолтное расположение, чтобы не сбивать с толку других участников команды поддержки. Есть смысл подмонтировать диски напрямую в /var/lib/clickhouse.

Здесь были выделены только основные пункты конфигурации ClickHouse, все возможные опции вы можете найти здесь.

Разделы remote_servers и zookeeper

Содержат информацию о расположение удаленных серверов ClickHouse и серверов Zookeeper.

Приведенная выше конфигурация может быть различной компоновки в ​​соответствии с бизнес-требованиями, поэтому распределенная таблица знает, куда отправлять запросы.

Мы описали структуру нашего кластера, состоящего из трех шардов по две реплики в каждом шарде. Кластер — это скорее логическое распределение данных по серверам физического кластера. Логических кластеров может быть несколько с различной конфигурацией.

Внутри шарда можно определить любое количество реплик. Доступ к данным будет осуществляться на первой доступной реплике.

Если вы вносите изменения в разделе Zookeeper, потребуется перезагрузка.

Раздел macros

Раздел macros содержит подстановки параметров реплицируемых таблиц в кластере. Это переменные значения, которые изменяются от сервера (узла) к серверу (узлу) в кластере. Для каждого сервера он сообщает: «Кто я в кластере, и что у меня есть»

Запуск clickhouse-server

Теперь можно запускать сервис clickhouse-server

systemctl start clickhouse-server

Ошибки запуска сервиса можно смотреть в логе /var/log/clickhouse-server/clickhouse-server.err.log или /var/log/clickhouse-server/clickhouse-server.log

Проверим подключение к локальному и удаленному серверу

# clickhouse-client -q "select version()"
22.8.2.11
# # clickhouse-client -h clickhouse-02 -q "select version()"
22.8.2.11

Создание распределенной таблицы

Попробуем создать в нашем кластере распределенную таблицу. Образец набора данных.

warehouse_id|product_id|avl_qty
3|30007|45
3|41392|21
6|96324|85
5|33309|59
1|28871|37

Приведенный выше набор данных был создан для того, чтобы показать, как работает сегментирование и распределение в кликхаусе. Я разработал набор данных и схему так, чтобы каждый идентификатор хранилища принадлежал определенному сегменту.

Распределение и репликация данных

Чтобы создать распределенную таблицу, нам нужно сделать две вещи:

  1. Настроить узлы Clickhouse, чтобы они знали обо всех доступных узлах в кластере (в файле config.xml есть конфигурация с именем remote_servers ) и связать наши серверы Clickhouse с экземпляром Zookeeper, который используется механизмом репликации (раздел zookeeper в файле config.xml).
  2. Создать новую реплицированную таблицу на всех серверах логического кластера, используя  движок репликации.
  3. Создать новую распределенную таблицу на всех серверах логического кластера, используя  распределенный  движок.

Пункт первый мы выполнили ранее.

Создадим таблицу в базе данных по умолчанию, используя механизм ReplicatedMergeTree, содержащую данные:

CREATE TABLE warehouse_local_replicated ON CLUSTER 'cluster_1'
(
 warehouse_id Int64,
 product_id  Int64,
 avl_qty  Int64
)
Engine=ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/warehouse_local_replicated', '{replica}')
PARTITION BY warehouse_id
ORDER BY product_id;

В приведенном выше синтаксисе была использована конструкция «ON CLUSTER '<cluster-name>'», чтобы создать таблицу в указанном кластере (т. е.) на всех узлах кластера.

Конструкции {layer}, {shard}, {replica} используют подстановки параметров для реплицируемых таблиц из раздела macros для формирования отдельных путей хранения информации о таблицах в Zookeeper.

Пример вывода:

CREATE TABLE warehouse_local_replicated ON CLUSTER cluster_1
(
    `warehouse_id` Int64,
    `product_id` Int64,
    `avl_qty` Int64
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/warehouse_local_replicated', '{replica}')
PARTITION BY warehouse_id
ORDER BY product_id

┌─host──────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ clickhouse-06 │ 9000 │      0 │       │                   5 │                0 │
│ clickhouse-02 │ 9000 │      0 │       │                   4 │                0 │
│ clickhouse-03 │ 9000 │      0 │       │                   3 │                0 │
│ clickhouse-05 │ 9000 │      0 │       │                   2 │                0 │
│ clickhouse-04 │ 9000 │      0 │       │                   1 │                0 │
│ clickhouse-01 │ 9000 │      0 │       │                   0 │                0 │
└───────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘

6 rows in set. Elapsed: 0.971 sec. 

clickhouse-01 :) show tables;

SHOW TABLES

┌─name───────────────────────┐
│ warehouse_local_replicated │
└────────────────────────────┘

1 rows in set. Elapsed: 0.004 sec.

clickhouse-02 :) show tables;

SHOW TABLES

┌─name───────────────────────┐
│ warehouse_local_replicated │
└────────────────────────────┘
1 rows in set. Elapsed: 0.004 sec. 

Теперь создайте распределенную таблицу. Распределенная таблица на самом деле является представлением, поэтому она должна иметь то же определение схемы, что и шарды. После создания представления данные запрашиваются на каждом сегменте, а результаты агрегируются на узле, на котором запрос был первоначально вызван.

Определение распределения имеет следующие параметры:

  • cluster: название вашего кластера
  • database: база данных, которая будет использоваться механизмом Distributedtable.
  • table: реплицированная таблица.
  • sharding_key: ключ распределения.

Создадим распределенную таблицу.

clickhouse-02 :) CREATE TABLE warehouse_dist  ON CLUSTER 'cluster_1' (  warehouse_id Int64,  product_id  Int64,  avl_qty  Int64 ) ENGINE = Distributed(cluster_1, default,warehouse_local_replicated, (warehouse_id) );

CREATE TABLE warehouse_dist ON CLUSTER cluster_1
(
    `warehouse_id` Int64,
    `product_id` Int64,
    `avl_qty` Int64
)
ENGINE = Distributed(cluster_1, default, warehouse_local_replicated, warehouse_id)

┌─host──────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ clickhouse-06 │ 9000 │      0 │       │                   5 │                0 │
│ clickhouse-03 │ 9000 │      0 │       │                   4 │                0 │
│ clickhouse-02 │ 9000 │      0 │       │                   3 │                0 │
│ clickhouse-05 │ 9000 │      0 │       │                   2 │                0 │
│ clickhouse-04 │ 9000 │      0 │       │                   1 │                0 │
│ clickhouse-01 │ 9000 │      0 │       │                   0 │                0 │
└───────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
6 rows in set. Elapsed: 0.266 sec.

Теперь у нас все готово для вставки данных, у нас есть два варианта:

  1. Мы можем вставить через распределенную таблицу.
  2. Вставить непосредственно в реплицированную таблицу.

Вставлять данные будем из подготовленного файла с образцом данных в распределенную таблицу.

root@clickhouse-01:~# ls
warehouse_dataset.csv
root@clickhouse-01:~# clickhouse-client  --format_csv_delimiter="|" --query "INSERT INTO warehouse_dist FORMAT CSVWithNames" < warehouse_dataset.csv  

Вставлены данные с сервера clickhouse-01. Проверим наличие данных в распределенной таблице на сервере clickhouse-02

clickhouse-02 :) select * from warehouse_dist;

SELECT *
FROM warehouse_dist

┌─warehouse_id─┬─product_id─┬─avl_qty─┐
│            4 │      10115 │      92 │
│            4 │      16544 │      96 │
│            4 │      20987 │      24 │
│            4 │      40205 │      57 │
│            4 │      40473 │      12 │
│            4 │      44523 │      97 │
│            4 │      47798 │       7 │
│            4 │      52977 │      86 │
│            4 │      68324 │      31 │
│            4 │      79176 │      63 │
│            4 │      84318 │      31 │
│            4 │      86403 │      70 │
│            4 │      99231 │      38 │
└──────────────┴────────────┴─────────┘
┌─warehouse_id─┬─product_id─┬─avl_qty─┐
│            1 │       5862 │      61 │
│            1 │       7491 │      47 │
│            1 │       8667 │      18 │
│            1 │      19014 │      36 │
│            1 │      24434 │      23 │
│            1 │      28871 │      37 │
│            1 │      30007 │      63 │
│            1 │      31606 │      71 │
│            1 │      31718 │      90 │
│            1 │      33197 │      52 │
│            1 │      41761 │      97 │
│            1 │      42652 │      72 │
│            1 │      45720 │      67 │
│            1 │      50276 │      64 │
│            1 │      52264 │      19 │
│            1 │      53810 │      78 │
│            1 │      56265 │      93 │
│            1 │      59045 │      93 │
│            1 │      62200 │      73 │
│            1 │      68246 │      49 │
│            1 │      71215 │      11 │
│            1 │      92358 │       5 │
│            1 │      99644 │      70 │
└──────────────┴────────────┴─────────┘
┌─warehouse_id─┬─product_id─┬─avl_qty─┐
│            6 │      10009 │      92 │
│            6 │      11231 │      24 │
│            6 │      28967 │      39 │
│            6 │      38508 │      48 │
│            6 │      57201 │      31 │
│            6 │      60922 │      64 │
│            6 │      80803 │      61 │
│            6 │      82000 │      26 │
│            6 │      91258 │      86 │
│            6 │      91898 │      50 │
│            6 │      96324 │      85 │
└──────────────┴────────────┴─────────┘
┌─warehouse_id─┬─product_id─┬─avl_qty─┐
│            3 │       1584 │      14 │
│            3 │       6195 │      13 │
│            3 │      13217 │       3 │
│            3 │      18221 │      91 │
│            3 │      19125 │      72 │
│            3 │      20762 │      56 │
│            3 │      30007 │      45 │
│            3 │      30439 │      10 │
│            3 │      39349 │      45 │
│            3 │      41392 │      21 │
│            3 │      42663 │      59 │
│            3 │      42979 │      30 │
│            3 │      50767 │      35 │
│            3 │      56461 │     100 │
│            3 │      58630 │      71 │
│            3 │      74647 │      94 │
│            3 │      87169 │      74 │
└──────────────┴────────────┴─────────┘
┌─warehouse_id─┬─product_id─┬─avl_qty─┐
│            5 │      12183 │      50 │
│            5 │      19408 │      79 │
│            5 │      19459 │       2 │
│            5 │      22234 │      86 │
│            5 │      32849 │      12 │
│            5 │      33309 │      59 │
│            5 │      34581 │      96 │
│            5 │      43149 │      60 │
│            5 │      45009 │      86 │
│            5 │      46159 │      68 │
│            5 │      47629 │      34 │
│            5 │      53782 │      95 │
│            5 │      61013 │      68 │
│            5 │      69121 │      86 │
│            5 │      69341 │      67 │
│            5 │      73624 │      83 │
│            5 │      77165 │      93 │
│            5 │      79078 │      63 │
│            5 │      84342 │      50 │
│            5 │      89709 │      36 │
│            5 │      94128 │      32 │
└──────────────┴────────────┴─────────┘
┌─warehouse_id─┬─product_id─┬─avl_qty─┐
│            2 │       2170 │      74 │
│            2 │       3887 │      31 │
│            2 │      20643 │      28 │
│            2 │      23857 │      49 │
│            2 │      27212 │      96 │
│            2 │      27501 │     100 │
│            2 │      28934 │      60 │
│            2 │      38303 │      45 │
│            2 │      40254 │       2 │
│            2 │      42369 │      72 │
│            2 │      60404 │      21 │
│            2 │      61365 │      88 │
│            2 │      66235 │      17 │
│            2 │      69324 │      26 │
│            2 │      92583 │       2 │
└──────────────┴────────────┴─────────┘
100 rows in set. Elapsed: 0.085 sec. 

Проверив вставленные данные на сервере clickhouse-02 , мы можем подтвердить, что данные были сегментированы на основе нашего ключа сегментирования, указанного при создании таблицы.

Теперь, когда мы знаем, как читать данные с нескольких узлов, мы хотим убедиться, что наши данные также реплицируются, чтобы выдерживать сбои узлов.

Если мы выберем из локальной таблицы, у нас есть только набор warehouse_id 4 и 1. Эти данные хранятся на этом сервере и его реплике. Если мы проверяем с сервера clickhouse-05, мы должны получить то же самое, давайте проверим.

clickhouse-02 :) select * from warehouse_local_replicated;

SELECT *
FROM warehouse_local_replicated

┌─warehouse_id─┬─product_id─┬─avl_qty─┐
│            4 │      10115 │      92 │
│            4 │      16544 │      96 │
│            4 │      20987 │      24 │
│            4 │      40205 │      57 │
│            4 │      40473 │      12 │
│            4 │      44523 │      97 │
│            4 │      47798 │       7 │
│            4 │      52977 │      86 │
│            4 │      68324 │      31 │
│            4 │      79176 │      63 │
│            4 │      84318 │      31 │
│            4 │      86403 │      70 │
│            4 │      99231 │      38 │
└──────────────┴────────────┴─────────┘
┌─warehouse_id─┬─product_id─┬─avl_qty─┐
│            1 │       5862 │      61 │
│            1 │       7491 │      47 │
│            1 │       8667 │      18 │
│            1 │      19014 │      36 │
│            1 │      24434 │      23 │
│            1 │      28871 │      37 │
│            1 │      30007 │      63 │
│            1 │      31606 │      71 │
│            1 │      31718 │      90 │
│            1 │      33197 │      52 │
│            1 │      41761 │      97 │
│            1 │      42652 │      72 │
│            1 │      45720 │      67 │
│            1 │      50276 │      64 │
│            1 │      52264 │      19 │
│            1 │      53810 │      78 │
│            1 │      56265 │      93 │
│            1 │      59045 │      93 │
│            1 │      62200 │      73 │
│            1 │      68246 │      49 │
│            1 │      71215 │      11 │
│            1 │      92358 │       5 │
│            1 │      99644 │      70 │
└──────────────┴────────────┴─────────┘

36 rows in set. Elapsed: 0.004 sec.
clickhouse-05 :) select * from warehouse_local_replicated;

SELECT *
FROM warehouse_local_replicated

┌─warehouse_id─┬─product_id─┬─avl_qty─┐
│            4 │      10115 │      92 │
│            4 │      16544 │      96 │
│            4 │      20987 │      24 │
│            4 │      40205 │      57 │
│            4 │      40473 │      12 │
│            4 │      44523 │      97 │
│            4 │      47798 │       7 │
│            4 │      52977 │      86 │
│            4 │      68324 │      31 │
│            4 │      79176 │      63 │
│            4 │      84318 │      31 │
│            4 │      86403 │      70 │
│            4 │      99231 │      38 │
└──────────────┴────────────┴─────────┘
┌─warehouse_id─┬─product_id─┬─avl_qty─┐
│            1 │       5862 │      61 │
│            1 │       7491 │      47 │
│            1 │       8667 │      18 │
│            1 │      19014 │      36 │
│            1 │      24434 │      23 │
│            1 │      28871 │      37 │
│            1 │      30007 │      63 │
│            1 │      31606 │      71 │
│            1 │      31718 │      90 │
│            1 │      33197 │      52 │
│            1 │      41761 │      97 │
│            1 │      42652 │      72 │
│            1 │      45720 │      67 │
│            1 │      50276 │      64 │
│            1 │      52264 │      19 │
│            1 │      53810 │      78 │
│            1 │      56265 │      93 │
│            1 │      59045 │      93 │
│            1 │      62200 │      73 │
│            1 │      68246 │      49 │
│            1 │      71215 │      11 │
│            1 │      92358 │       5 │
│            1 │      99644 │      70 │
└──────────────┴────────────┴─────────┘
36 rows in set. Elapsed: 0.005 sec. 

Так же, как мы можем выполнить проверку для clickhouse-01, для которого мы настроили реплику  clickhouse-04 в разделе remote_servers.

clickhouse-01 :)  select * from warehouse_local_replicated;

SELECT *
FROM warehouse_local_replicated

┌─warehouse_id─┬─product_id─┬─avl_qty─┐
│            3 │       1584 │      14 │
│            3 │       6195 │      13 │
│            3 │      13217 │       3 │
│            3 │      18221 │      91 │
│            3 │      19125 │      72 │
│            3 │      20762 │      56 │
│            3 │      30007 │      45 │
│            3 │      30439 │      10 │
│            3 │      39349 │      45 │
│            3 │      41392 │      21 │
│            3 │      42663 │      59 │
│            3 │      42979 │      30 │
│            3 │      50767 │      35 │
│            3 │      56461 │     100 │
│            3 │      58630 │      71 │
│            3 │      74647 │      94 │
│            3 │      87169 │      74 │
└──────────────┴────────────┴─────────┘
┌─warehouse_id─┬─product_id─┬─avl_qty─┐
│            6 │      10009 │      92 │
│            6 │      11231 │      24 │
│            6 │      28967 │      39 │
│            6 │      38508 │      48 │
│            6 │      57201 │      31 │
│            6 │      60922 │      64 │
│            6 │      80803 │      61 │
│            6 │      82000 │      26 │
│            6 │      91258 │      86 │
│            6 │      91898 │      50 │
│            6 │      96324 │      85 │
└──────────────┴────────────┴─────────┘

28 rows in set. Elapsed: 0.004 sec. 

clickhouse-06 :) select * from warehouse_local_replicated;

SELECT *
FROM warehouse_local_replicated

┌─warehouse_id─┬─product_id─┬─avl_qty─┐
│            6 │      10009 │      92 │
│            6 │      11231 │      24 │
│            6 │      28967 │      39 │
│            6 │      38508 │      48 │
│            6 │      57201 │      31 │
│            6 │      60922 │      64 │
│            6 │      80803 │      61 │
│            6 │      82000 │      26 │
│            6 │      91258 │      86 │
│            6 │      91898 │      50 │
│            6 │      96324 │      85 │
└──────────────┴────────────┴─────────┘
┌─warehouse_id─┬─product_id─┬─avl_qty─┐
│            3 │       1584 │      14 │
│            3 │       6195 │      13 │
│            3 │      13217 │       3 │
│            3 │      18221 │      91 │
│            3 │      19125 │      72 │
│            3 │      20762 │      56 │
│            3 │      30007 │      45 │
│            3 │      30439 │      10 │
│            3 │      39349 │      45 │
│            3 │      41392 │      21 │
│            3 │      42663 │      59 │
│            3 │      42979 │      30 │
│            3 │      50767 │      35 │
│            3 │      56461 │     100 │
│            3 │      58630 │      71 │
│            3 │      74647 │      94 │
│            3 │      87169 │      74 │
└──────────────┴────────────┴─────────┘
28 rows in set. Elapsed: 0.005 sec. 

Заключение

Я надеюсь, что эта статья поможет лучше понять механизм сегментирования и распределения в ClickHouse. Предоставлено решение для устранения сбоя узла и гарантии того, что все реплики будут иметь 100% одинаковые данные.

Ссылка на источник: Clickhouse Cluster setup and Replication Configuration Part-2

3 комментария

  • не понятно в какой момент Zookeeper запустился и чем?

    На каждой ноде Zookeeper создадим файл /var/lib/zookeeper/myid с номером этой ноды в кластере.

    А дальше он сам себя запустит?

Добавить комментарий

Ваш адрес email не будет опубликован.