Продолжение статьи Настройка кластера Clickhouse Steb-by-Step про создание кластера. Ранее мы обсудили основы процесса шардирования и репликации clickhouse. В этой записи блога подробно поговорим об установке и настройке кластера.
Содержание
- 1 Создание и настройка кластера Clickhouse
- 2 Подготовка на всех нодах кластера
- 3 Установка Java на серверы Zookeeper
- 4 Установка Zookeeper
- 5 Проверки Zookeeper
- 6 Установка Clickhouse
- 7 Изменение конфигурации
- 8 Запуск clickhouse-server
- 9 Создание распределенной таблицы
- 10 Распределение и репликация данных
- 11 Заключение
Создание и настройка кластера Clickhouse
Давайте построим кластер Clickhouse: 3 (шарда) x 2 (реплики) = 6 узлов. Схема логической топологии выглядит следующим образом.
Для построения такого кластера будем использовать 6 серверов.
Мы будем использовать ReplicatedMergeTree & Distributed движки таблиц для настройки нашей таблицы.
Приведенная выше конфигурация изображает кластер из шести узлов Сlickhouse в связке с Zookeeper.
Для Zookeeper требуется минимум 3 сервера. 3 сервера — это оптимальная установка, которая работает даже в сильно загруженных системах при правильной настройке.
5 серверов с меньшей вероятностью полностью потеряют кворум, но также это приведет к увеличению времени сбора кворума.
Могут быть добавлены дополнительные серверы для Zookeeper, но всегда должно быть нечетное количество серверов.
Подготовка на всех нодах кластера
Отключить iptables
Как пользователь root проверьте статус
/sbin/chkconfig --list iptables
- Если 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. Нас особенно интересуют три части:
- remote_servers,
- zookeeper,
- 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
Приведенный выше набор данных был создан для того, чтобы показать, как работает сегментирование и распределение в кликхаусе. Я разработал набор данных и схему так, чтобы каждый идентификатор хранилища принадлежал определенному сегменту.
Распределение и репликация данных
Чтобы создать распределенную таблицу, нам нужно сделать две вещи:
- Настроить узлы Clickhouse, чтобы они знали обо всех доступных узлах в кластере (в файле config.xml есть конфигурация с именем remote_servers ) и связать наши серверы Clickhouse с экземпляром Zookeeper, который используется механизмом репликации (раздел zookeeper в файле config.xml).
- Создать новую реплицированную таблицу на всех серверах логического кластера, используя движок репликации.
- Создать новую распределенную таблицу на всех серверах логического кластера, используя распределенный движок.
Пункт первый мы выполнили ранее.
Создадим таблицу в базе данных по умолчанию, используя механизм 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.
Теперь у нас все готово для вставки данных, у нас есть два варианта:
- Мы можем вставить через распределенную таблицу.
- Вставить непосредственно в реплицированную таблицу.
Вставлять данные будем из подготовленного файла с образцом данных в распределенную таблицу.
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
не понятно в какой момент Zookeeper запустился и чем?
На каждой ноде Zookeeper создадим файл /var/lib/zookeeper/myid с номером этой ноды в кластере.
А дальше он сам себя запустит?
Спасибо за отзыв. Я дополнил статью более подробными инструкциями.
Спасибо