Руководство по построению распределенного кластера ClickHouse

база данных

Эта статья была впервые опубликована на:Уокер ИИ

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

1. Что такое ClickHouse?

ClickHouse — это база данных на основе хранилища столбцов с открытым исходным кодом от Яндекса (крупнейшей поисковой системы в России) для анализа данных в реальном времени, которая обрабатывает данные в 100–1000 раз быстрее, чем традиционные методы. ClickHouse превосходит по производительности сопоставимые столбцовые СУБД на современном рынке, обрабатывая от сотен миллионов до более миллиарда строк и десятки гигабайт данных в секунду на сервер в секунду.

Некоторые возможности ClickHouse

  • Быстрота: ClickHouse полностью использует все доступное оборудование для максимально быстрой обработки каждого запроса. Пиковая производительность обработки одного запроса превышает 2 ТБ в секунду (после распаковки только используемые столбцы). В распределенной конфигурации операции чтения автоматически распределяются между работоспособными репликами, чтобы избежать увеличения задержки.
  • Отказоустойчивость: ClickHouse поддерживает асинхронную репликацию с несколькими мастерами и может быть развернут в нескольких центрах обработки данных. Все узлы равны, что позволяет избежать единой точки отказа. Время простоя отдельного узла или всего центра обработки данных не влияет на доступность системы для чтения и записи.
  • Масштабируемость: ClickHouse хорошо масштабируется как по вертикали, так и по горизонтали. ClickHouse легко настроить для работы в кластере с сотнями или тысячами узлов, на одном сервере или даже на небольшой виртуальной машине. В настоящее время объем данных на одну установку узла превышает триллионы строк или сотни терабайт.
  • Простота использования: ClickHouse прост в использовании прямо из коробки. Это упрощает всю обработку данных: все структурированные данные загружаются в систему и сразу становятся доступными для построения отчетов. SQL позволяет выражать желаемые результаты без использования каких-либо пользовательских нестандартных API, которые можно найти в некоторых СУБД.
  • Полное использование оборудования: ClickHouse обрабатывает типовые аналитические запросы на два-три порядка быстрее, чем традиционные системы, ориентированные на строки, с той же доступной пропускной способностью ввода-вывода и мощностью ЦП. Столбчатый формат хранения позволяет помещать в оперативную память больше данных, что приводит к более быстрому времени отклика.
  • Улучшенная эффективность ЦП: векторизованное выполнение запросов включает связанные инструкции процессора SIMD и генерацию кода во время выполнения. Обработка данных в столбцах увеличивает частоту попаданий в кэш строк ЦП.
  • Оптимизированный доступ к диску: ClickHouse сводит к минимуму количество запросов диапазона, повышая эффективность использования вращающихся дисков, поскольку данные хранятся непрерывно. Минимальная передача данных: ClickHouse позволяет компаниям управлять своими данными без использования выделенной сети, предназначенной для высокопроизводительных вычислений.

2. Кластерная конструкция

2.1 Подготовка машины

Среда: Centos 6 или Centos 7 три машины (ZooKeeper также требует высокой доступности)

хозяин ip установить софт Примечание
bgdata.operate.ck-0001 172.20.1.39 ClickHouse-server ClickHouse-client jdk1.8 ZooKeeper
bgdata.operate.ck-0002 172.20.1.246 ClickHouse-server ClickHouse-client jdk1.8 ZooKeeper
bgdata.operate.ck-0003 172.20.1.173 jdk1.8 ZooKeeper Из-за ограниченных машинных ресурсов только машины с высокой доступностью ZooKeeper могут использоваться в качестве узла ck на практике.

Установите парсинг файла hosts (вот большая яма, ck пойдет в ZooKeeper для запроса при синхронизации данных таблицы, ZooKeeper хранит доменное имя hosts, а не IP, если не разобрать, таблица может быть синхронизирована, но данные таблицы не могут быть синхронизированы ), три операции ви/и т.д./хост

172.20.1.246    bgdata.operate.ck-0002
172.20.1.39     bgdata.operate.ck-0001
172.20.1.173    bgdata.operate.ck-0003

2.2 Создание кластера ZooKeeper, три операции

yum install -y java-1.8.0-openjdk-devel
mkdir /data
cd /data
wget https://downloads.apache.org/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2.tar.gz && tar -xf apache-zookeeper-3.6.2.tar.gz 
ln -s apache-zookeeper-3.6.2 zookeeper
cd zookeeper
# 新建配置文件
cp conf/zoo_sample.cfg conf/zoo.cfg
# 创建ZooKeeper 数据目录
mkdir data

Измените файл конфигурации conf/zoo.cfg так же, как три

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
clientPort=2181
server.1=172.20.1.39:2888:3888
server.2=172.20.1.246:2888:3888
server.3=172.20.1.173:2888:3888

Создайте myid в каталоге данных ZooKeeper, три разных, соответствующих номеру server.1 выше

echo 1 > /data/zookeeper/data/myid  # 其他机器分别是2 3

начни и проверь

./bin/zkServer.sh start
./bin/zkServer.sh status

2.3 Создайте кластер ClickHouse с одним шардом и одной копией

bgdata.operate.ck-0001 bgdata.operate.ck-0002 машинное выполнение

установить кликшланг

yum install yum-utils
rpm --import https://repo.yandex.ru/ClickHouse/ClickHouse-KEY.GPG
yum-config-manager --add-repo https://repo.yandex.ru/ClickHouse/rpm/stable/x86_64
yum install ClickHouse-server ClickHouse-client
mkdir /data/ClickHouse
chown -R ClickHouse.ClickHouse /data/ClickHouse/  #修改权限

Настроить, изменить vim /etc/ClickHouse-server/config.xml

Изменить listen_host

<!-- Listen specified host. use :: (wildcard IPv6 address), if you want to accept connections both with IPv4 and IPv6 from everywhere. -->
    <!-- <listen_host>::</listen_host> -->
    <!-- Same for hosts with disabled ipv6: -->
    <!-- <listen_host>0.0.0.0</listen_host> -->

    <!-- Default values - try listen localhost on ipv4 and ipv6: -->
    <!--
    <listen_host>::1</listen_host>
    <listen_host>127.0.0.1</listen_host>
    -->
    <listen_host>0.0.0.0</listen_host> <!-- 新增所有地址可以访问 -->
    <!-- Don't exit if ipv6 or ipv4 unavailable, but listen_host with this protocol specified -->
    <!-- <listen_try>0</listen_try> -->

    <!-- Allow listen on same address:port -->
    <!-- <listen_reuse_port>0</listen_reuse_port> -->

    <!-- <listen_backlog>64</listen_backlog> -->

Изменить путь хранения

<!-- Path to data directory, with trailing slash. -->
    <path>/data/ClickHouse/</path>  <!-- 修改存储路径 -->

    <!-- Path to temporary data for processing hard queries. -->
    <tmp_path>/data/ClickHouse/tmp/</tmp_path>  

Добавить конфигурацию кластера

<remote_servers>
    <bigdata> <!-- 集群名字,自定义 -->
        <shard> <!-- 定义一个分片 -->
            <!-- Optional. Shard weight when writing data. Default: 1. -->
            <weight>1</weight>
            <!-- Optional. Whether to write data to just one of the replicas. Default: false (write data to all replicas). -->
            <internal_replication>false</internal_replication>
            <replica> <!-- 这个分片的副本存在在哪些机器上 -->
                <host>172.20.1.39</host>
                <port>9000</port>
            </replica>
            <replica>
                <host>172.20.1.246</host>
                <port>9000</port>
            </replica>
        </shard>
      <!--  
        <shard>
            <weight>2</weight>
            <internal_replication>true</internal_replication>
            <replica>
                <host>172.20.1.39</host>
                <port>9000</port>
            </replica>
            <replica>
                <host>172.20.1.246</host>
                <port>9000</port>
            </replica>
        </shard>
        -->
    </bigdata>
</remote_servers>  

Добавить конфигурацию зоопарка

<!-- ZooKeeper is used to store metadata about replicas, when using Replicated tables.
Optional. If you don't use replicated tables, you could omit that.
 
See https://clickhouse.yandex/docs/en/table_engines/replication/
-->
 
<zookeeper incl="zookeeper-servers" optional="true" />
<zookeeper>
    <node index="1">
        <host>172.20.1.39</host>
        <port>2181</port>
    </node>
    <node index="2">
        <host>172.20.1.246</host>
        <port>2181</port>
    </node>
    <node index="3">
        <host>172.20.1.173</host>
        <port>2182</port>
    </node>
</zookeeper>   

Настройка переменных разделенных макросов

 <macros incl="macros" optional="true" />
    <!-- 配置分片macros变量,在用client创建表的时候回自动带入 -->
    <macros>
      <shard>1</shard>
      <replica>172.20.1.39</replica> <!-- 这里指定当前集群节点的名字或者IP -->
    </macros>

запускать

systemctl start ClickHouse-server.service
systemctl enable ClickHouse-server.service

обнаружить

[root@bgdata zookeeper]# ClickHouse-client -h 172.20.1.246 -m
ClickHouse client version 20.3.2.1 (official build).
Connecting to 172.20.1.246:9000 as user default.
Connected to ClickHouse server version 20.3.2 revision 54433.
bgdata.operate.ck-0002 :) select * from system.clusters ;

SELECT *
FROM system.clusters

┌─cluster─┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name────┬─host_address─┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ bigdata │         1 │            1 │           1 │ 172.20.1.39  │ 172.20.1.39  │ 9000 │        0 │ default │                  │            0 │                       0 │
│ bigdata │         1 │            1 │           2 │ 172.20.1.246 │ 172.20.1.246 │ 9000 │        1 │ default │                  │            0 │                       0 │
└─────────┴───────────┴──────────────┴─────────────┴──────────────┴──────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘

2 rows in set. Elapsed: 0.001 sec.

контрольная работа

Оба создают базы данных соответственно создают базу данных test1;

Создайте таблицу для создания данных

CREATE TABLE t1 ON CLUSTER bigdata
(
    `ts` DateTime,
    `uid` String,
    `biz` String
)
ENGINE = ReplicatedMergeTree('/ClickHouse/test1/tables/{shard}/t1', '{replica}')
PARTITION BY toYYYYMMDD(ts)
ORDER BY ts
SETTINGS index_granularity = 8192
######说明 {shard}自动获取对应配置文件的macros分片设置变量 replica一样  ENGINE = ReplicatedMergeTree,不能为之前的MergeTree
######'/ClickHouse/test1/tables/{shard}/t1' 是写入zk里面的地址,唯一,注意命名规范

INSERT INTO t1 VALUES ('2019-06-07 20:01:01', 'a', 'show');
INSERT INTO t1 VALUES ('2019-06-07 20:01:02', 'b', 'show');
INSERT INTO t1 VALUES ('2019-06-07 20:01:03', 'a', 'click');
INSERT INTO t1 VALUES ('2019-06-08 20:01:04', 'c', 'show');
INSERT INTO t1 VALUES ('2019-06-08 20:01:05', 'c', 'click');

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

3. Резюме

  • Набор реплик предназначен для таблицы, а не библиотеки или всего ck, поэтому вы можете использовать ReplicatedMergeTree для некоторых таблиц или не копировать напрямую, поэтому необходимо создать базу данных.
  • Это отличается от шардирования ES и распределения машин-реплик.Каждая машина CK может иметь только одну копию осколка, поэтому, если вы хотите построить 2 осколка и 2 копии, вам нужно 2 * 2 машины, иначе будет сообщено об ошибке.
  • При тестировании чтения и записи данных обнаруживается, что только что созданная таблица будет синхронизирована, но данные не синхронизируются.Проверив журнал CK и соответствующий хост в zk, обнаружено, что zk хранит имя хоста , а не ip, поэтому хост не может быть найден для записи, и хосты нужно изменить.
  • Протестируйте python ClickHouse_driver для подключения к кластеру и обнаружите, что требуется более высокая версия ClickHouse_driver, иначе параметр alt_hosts отсутствует
  • Добавление и удаление баз данных необходимо выполнять вручную, добавление и удаление таблиц необходимо добавлять в большие данные ON CLUSTER, добавление и удаление данных выполняется асинхронно в реальном времени.

пример кластера ck для соединения с python

from ClickHouse_driver import Client
client = Client("172.20.1.39",database="test1",alt_hosts="172.20.1.246") # 这里alt_hosts代表其他副本机器以,分割,shit源码看到的
print(client.execute("show tables"))

PS: Для получения дополнительной технической галантереи, пожалуйста, обратите внимание на [Публичный аккаунт | xingzhe_ai] и обсудите с ходоками!