Эта статья была впервые опубликована на:Уокер ИИ
Прочитав эту статью, вы получите соответствующие знания о 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] и обсудите с ходоками!