一、概述

ClickHouse是一种高功用、列式存储的分布式数据库办理体系。它专注于快速数据剖析和查询,而且在大规模数据集上表现出色。

在ClickHouse中,数据按列存储而不是按行存储。这种存储方法有许多长处,特别合适剖析工作负载。下面是一些与列数据存储相关的关键概念和特色:

  • 列存储:ClickHouse将每一列的数据连续存储在磁盘上,这种存储方法有助于高效地进行紧缩和编码。相比之下,传统的行存储数据库会将整行数据存储在一起。

  • 列紧缩:ClickHouse运用多种紧缩算法来减小列数据的存储空间。这些算法针对不同类型的数据(例如数字、字符串、日期等)进行了优化,能够明显削减存储本钱。

  • 列编码:ClickHouse还运用列编码来进步查询功用。列编码是一种将相似值存储在一起的技能,能够削减磁盘读取宽和紧缩的数据量。

  • 数据分区:ClickHouse支持数据分区,能够将数据划分为更小的部分,以便更高效地履行查询。数据分区能够根据时刻、日期、范围或自界说规则进行。

  • 兼并树(MergeTree)引擎:ClickHouse的默许存储引擎是MergeTree,它是基于列存储和数据分区的。MergeTree引擎支持高效的数据插入和查询,而且具有自动兼并和数据删去的功用。

总的来说,ClickHouse的列数据存储方法以及相关的紧缩和编码技能使其在大规模数据剖析场景下表现出色。它能够高效地处理海量数据,并供给快速的查询功用。

【大数据】通过 docker-compose 快速部署 ClickHouse 保姆级教程
这儿首要偏重运用docker快速布置环境,想了解更多,能够参阅我以下几篇文章:

  • 列式数据库办理体系——ClickHouse(version:22.7.1 环境布置)
  • 列式数据库办理体系——ClickHouse实战演练

官方文档:clickhouse.com/docs/zh

二、ClickHouse 列数据存储优缺陷

ClickHouse的列数据存储方法具有许多长处和一些缺陷。下面是对ClickHouse列数据存储的首要优缺陷的总结:

1)长处

  • 高紧缩率:列数据存储允许对每一列运用专门的紧缩算法,针对不同类型的数据进行优化,然后完成更高的紧缩率。这能够明显减小数据存储的需求,降低硬件本钱。

  • 高查询功用:列数据存储适用于剖析型工作负载,其中查询一般涉及少量列而涵盖很多行。因为每个查询只需求读取所需的列数据,而不是整行数据,所以列数据存储一般比行存储更快。

  • 数据紧缩对查询功用的提高:因为列数据存储的数据紧缩,它能够削减磁盘I/O操作和网络传输,进步查询功用。较小的数据量意味着更少的磁盘读取和更快的数据传输速度。

  • 数据分区和兼并:ClickHouse支持数据分区和兼并树引擎,这使得对大规模数据集的查询和剖析愈加高效。数据分区允许将数据划分为更小的部分,然后削减需求扫描的数据量。自动兼并和数据删去功用保证数据的连续性和功用。

2)缺陷

更新和删去操作相对复杂:因为列数据存储的特性,更新和删去操作可能相对复杂。这是因为更新和删去需求定位并修正多个列的数据,而不仅仅是单个行。

  • 不合适高并发的事务处理:ClickHouse的规划方针是快速数据剖析和查询,而不是高并发的事务处理。假如应用程序需求很多的并发事务操作和实时写入需求,ClickHouse可能不是最佳挑选。

  • 不合适频繁改变的形式:因为列存储的特性,假如数据形式常常发生变化,例如增加或删去列,可能需求进行较大的重建操作。因而,ClickHouse更合适安稳的数据形式和预先界说的查询需求。

总的来说,ClickHouse的列数据存储方法在大规模数据剖析场景下具有许多优势,包含高紧缩率、高查询功用和灵活的数据分区。然而,它可能不合适需求频繁更新和改变形式的应用程序,而且不是专为高并发的事务处理而规划。

三、ClickHouse 中 Zookeeper 的效果

在 ClickHouse 中,ZooKeeper 扮演着协调和办理分布式集群的人物。它作为一个分布式协调服务,为 ClickHouse 供给了以下功用和效果:

  • 装备办理:ZooKeeper 用于存储和办理 ClickHouse 集群的装备信息,包含集群拓扑、节点信息、数据分片和副本分配等。ClickHouse 节点经过与 ZooKeeper 进行交互,获取集群的装备信息,然后了解集群的拓扑结构和各个节点的人物。

  • Leader 选举:在 ClickHouse 集群中,每个分片都有一个 Leader 节点负责协调和处理读写请求。ZooKeeper 用于协助进行 Leader 的选举进程,保证在节点毛病或重启后能够快速选举出新的 Leader 节点来维持集群的可用性。

  • 监控和健康检查:ZooKeeper 能够用于监控 ClickHouse 集群的健康状况。ClickHouse 节点能够将自身的状况信息注册到 ZooKeeper 上,同时定期向 ZooKeeper 发送心跳信号。这样能够完成集群的实时监控和毛病检测,假如节点呈现毛病或不可用,能够及时做出相应的处理。

  • 分布式锁和协调:ZooKeeper 供给了分布式锁和协调的功用,能够用于在 ClickHouse 集群中完成一致性操作和并发操控。例如,当进行某些需求串行履行的操作时,能够运用 ZooKeeper 的分布式锁来保证只要一个节点能够履行该操作,然后避免抵触和数据不一致的问题。

总的来说,ZooKeeper 在 ClickHouse 中扮演着关键的人物,用于集群的装备办理、Leader 选举、监控和健康检查以及分布式锁和协调。它供给了分布式环境下的协同工作和一致性保证,帮助保证 ClickHouse 集群的安稳运行和可靠性。

四、前期准备

1)布置 docker

# 装置yum-config-manager装备工具
yum -y install yum-utils
# 主张运用阿里云yum源:(引荐)
#yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 装置docker-ce版别
yum install -y docker-ce
# 发动并开机发动
systemctl enable --now docker
docker --version

2)布置 docker-compose

curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version

五、创立网络

# 创立,留意不能运用hadoop_network,要不然发动hs2服务的时分会有问题!!!
docker network create hadoop-network
# 检查
docker network ls

六、装置 Zookeeper

这儿挑选docker快速布置的方法:【中间件】经过 docker-compose 快速布置 Zookeeper 保姆级教程

git clone https://gitee.com/hadoop-bigdata/docker-compose-zookeeper.git
cd docker-compose-zookeeper
# 布置
docker-compose -f docker-compose.yaml up -d
# 检查
docker-compose -f docker-compose.yaml ps

七、ClickHouse 编排布置

【大数据】通过 docker-compose 快速部署 ClickHouse 保姆级教程

1)下载 ClickHouse 装置包

这儿挑选运用yum装置方法,也能够挑选离线装置包布置,具体教程可参阅官方布置文档:clickhouse.com/docs/zh/get…

2)装备

  • config/config.xml

修正/etc/clickhouse-server/config.xml,是本地和远程可登陆,装备文件内容比较多,这儿就粘贴出来了。

<listen_host>0.0.0.0</listen_host>
<clickhouse>
<!-- 默许是没有的,直接新增就行 -->
<include_from>/etc/metrika.xml</include_from>
<!--- 将默许的装备删掉 -->
<remote_servers incl="clickhouse_remote_servers" />
<zookeeper incl="zookeeper" optional="true" />
<macros incl="macros" optional="true" />
<!-- 删掉默许装备 -->
<compression incl="clickhouse_compression" optional="true" />
</clickhouse>
  • config/users.xml

修正 /etc/clickhouse-server/users.xml,装备暗码,其它参数能够根据业务场景进行装备,在55行左右

<password>123456</password>
  • images/metrika.xml
<yandex>
    <!--ck集群节点-->
    <clickhouse_remote_servers>
        <!-- 集群称号 -->
        <ck_cluster_2023>
            <!--shard 1(分片1)-->
            <shard>
                <weight>1</weight>
                <!-- internal_replication这个参数是操控写入数据到分布式表时,分布式表会操控这个写入是否的写入到一切副本中,这儿设置false,就是只会写入到第一个replica,其它的经过zookeeper同步 -->
                <internal_replication>false</internal_replication>
                <replica>
                    <host>ck-node-1</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>123456</password>
                </replica>
                <!--replicat 1(副本 1)-->
                <replica>
                    <host>ck-node-2</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>123456</password>
                </replica>
            </shard>
            <!--shard 2(分片2)-->
            <shard>
                <weight>1</weight>
                <internal_replication>false</internal_replication>
                <replica>
                    <host>ck-node-3</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>123456</password>
                </replica>
                <!--replicat 2(副本 2)-->
                <replica>
                    <host>ck-node-4</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>123456</password>
                </replica>
            </shard>
        </ck_cluster_2023>
    </clickhouse_remote_servers>
    <!--zookeeper相关装备-->
    <zookeeper>
        <node index="1">
            <host>zookeeper-node1</host>
            <port>2181</port>
        </node>
        <node index="2">
            <host>zookeeper-node2</host>
            <port>2181</port>
        </node>
        <node index="3">
            <host>zookeeper-node3</host>
            <port>2181</port>
        </node>
    </zookeeper>
    <macros>
        <!-- 本节点副本称号,创立复制表时有用,每个节点不同,整个集群仅有,主张运用主机名+副本+分片),在当时节点上-->
        <shard>${macros_shard}</shard>
        <replica>${macros_replica}</replica>
    </macros>
    <!-- 监听网络 -->
    <networks>
        <ip>::/0</ip>
    </networks>
    <!--紧缩相关装备-->
    <clickhouse_compression>
        <case>
            <min_part_size>1073741824</min_part_size>
            <min_part_size_ratio>0.01</min_part_size_ratio>
            <method>lz4</method>
            <!--紧缩算法lz4紧缩比zstd快, 更占磁盘-->
        </case>
    </clickhouse_compression>
</yandex>

留意上面 macros 装备,上面装备的仅仅一个占位符,服务发动之前会自动替换。

3)发动脚本 bootstrap.sh

#!/bin/bash
# 修正 macros 装备,
# 格局:${hostname}-${macros}-${replica}
# 示例:local-168-182-110-01-1
last=`hostname| awk -F'-' '{print $NF}'`
if [ $last -eq 1 -o $last -eq 2 ];then
   macros_shard="01"
   macros_replica=`hostname`-${macros_shard}-$last
fi
if [ $last -eq 3 -o $last -eq 4 ];then
   macros_shard="02"
   let last=last-2
   macros_replica=`hostname`-${macros_shard}-$last
fi
# 替换
sed -i "s/\${macros_shard}/${macros_shard}/" /etc/metrika.xml
sed -i "s/\${macros_replica}/${macros_replica}/" /etc/metrika.xml
sudo /etc/init.d/clickhouse-server start
tail -f /var/log/clickhouse-server/clickhouse-server.log

4)构建镜像 Dockerfile

FROM registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/centos-jdk:7.7.1908
RUN yum install -y yum-utils
RUN yum-config-manager --add-repo https://packages.clickhouse.com/rpm/clickhouse.repo
RUN yum install -y clickhouse-server clickhouse-client
# copy config
COPY  metrika.xml /etc/
# copy bootstrap.sh
COPY bootstrap.sh /opt/apache/
RUN chmod +x /opt/apache/bootstrap.sh
# 授权
# 授权
RUN chown -R clickhouse:clickhouse /var/lib/clickhouse/  /etc/clickhouse-server/ /var/log/clickhouse-server
RUN chown -R clickhouse:clickhouse /opt/apache
WORKDIR /opt/apache

开端构建镜像

docker build -t registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/clickhouse:23.5.3.24 . --no-cache --progress=plain
# 为了便利小伙伴下载即可运用,我这儿将镜像文件推送到阿里云的镜像库房
docker push registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/clickhouse:23.5.3.24
### 参数解释
# -t:指定镜像称号
# . :当时目录Dockerfile
# -f:指定Dockerfile路径
#  --no-cache:不缓存

5)编排 docker-compose.yaml

version: '3'
services:
  ck-node-1:
    image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/clickhouse:23.5.3.24
    container_name: ck-node-1
    hostname: ck-node-1
    restart: always
    privileged: true
    env_file:
      - .env
    volumes:
      - ./config/config.xml:/etc/clickhouse-server/config.xml
      - ./config/users.xml:/etc/clickhouse-server/users.xml
    expose:
      - "${CilckHouse_PORT}"
    ports:
      - "${ClickHouse_HTTP_PORT}"
    command: ["sh","-c","/opt/apache/bootstrap.sh"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "netstat -tnlp|grep :${CilckHouse_PORT} || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 5
  ck-node-2:
    image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/clickhouse:23.5.3.24
    container_name: ck-node-2
    hostname: ck-node-2
    restart: always
    privileged: true
    env_file:
      - .env
    volumes:
      - ./config/config.xml:/etc/clickhouse-server/config.xml
      - ./config/users.xml:/etc/clickhouse-server/users.xml
    expose:
      - "${CilckHouse_PORT}"
    ports:
      - "${ClickHouse_HTTP_PORT}"
    command: ["sh","-c","/opt/apache/bootstrap.sh"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "netstat -tnlp|grep :${CilckHouse_PORT} || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 5
  ck-node-3:
    image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/clickhouse:23.5.3.24
    container_name: ck-node-3
    hostname: ck-node-3
    restart: always
    privileged: true
    env_file:
      - .env
    volumes:
      - ./config/config.xml:/etc/clickhouse-server/config.xml
      - ./config/users.xml:/etc/clickhouse-server/users.xml
    expose:
      - "${CilckHouse_PORT}"
    ports:
      - "${ClickHouse_HTTP_PORT}"
    command: ["sh","-c","/opt/apache/bootstrap.sh"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "netstat -tnlp|grep :${CilckHouse_PORT} || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 5
  ck-node-4:
    image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/clickhouse:23.5.3.24
    container_name: ck-node-4
    hostname: ck-node-4
    restart: always
    privileged: true
    env_file:
      - .env
    volumes:
      - ./config/config.xml:/etc/clickhouse-server/config.xml
      - ./config/users.xml:/etc/clickhouse-server/users.xml
    expose:
      - "${CilckHouse_PORT}"
    ports:
      - "${ClickHouse_HTTP_PORT}"
    command: ["sh","-c","/opt/apache/bootstrap.sh"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "netstat -tnlp|grep :${CilckHouse_PORT} || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 5
# 衔接外部网络
networks:
  hadoop-network:
    external: true

.env 文件内容

CilckHouse_PORT=9000
ClickHouse_HTTP_PORT=8123

6)开端布置

# --project-name指定项目称号,默许是当时目录称号
docker-compose -f docker-compose.yaml up -d
# 检查
docker-compose -f docker-compose.yaml ps
# 卸载
docker-compose -f docker-compose.yaml down

7)简略测验验证

# 登录容器
docker exec -it ck-node-1 bash
# 默许情况下,在批量形式中只能履行单个查询。为了从一个Script中履行多个查询,能够运用--multiquery参数。
clickhouse-client -u default --password 123456 --port 9000 -h localhost --multiquery
select * from system.clusters;

【大数据】通过 docker-compose 快速部署 ClickHouse 保姆级教程

8)web 拜访

http://ip:port/play 获取对外port

docker-compose -f docker-compose.yaml ps

【大数据】通过 docker-compose 快速部署 ClickHouse 保姆级教程
参数说明:

  • cluster: 集群的命名
  • shard_num: 分片的编号
  • shard_weight: 分片的权重
  • replica_num: 副本的编号
  • host_name: 机器的host称号
  • host_address: 机器的ip地址
  • port: clickhouse集群的端口
  • is_local: 是否为你当时查询本地
  • user: 创立用户

到此经过 docker-compose 快速布置 ClickHouse 保姆级教程就结束了,有任何疑问请关注我大众号:大数据与云原生技能分享,加群沟通或私信沟通~

【大数据】通过 docker-compose 快速部署 ClickHouse 保姆级教程