背景
OLAP(联机分析处理) 是一种用于在大规模数据集上进行复杂分析的数据处理方法。与OLTP(联机事务处理)系统专注于支持日常业务交易和操作不同,OLAP系统旨在提供对多维数据的快速、灵活的查询和分析能力。
OLAP场景有以下关键的特征:
主要读请求 : 数据库主要用于读取操作,而写入操作相对较少。
大批量更新 : 更新操作通常以相当大的批次进行,而非单行更新,并且可能是禁止或较少进行的。
不可修改的数据 : 一旦数据添加到数据库,就不能修改。
大量列的宽表 : 数据表包含大量列,可能是宽表结构。
查询少,但复杂 : 查询数量相对较少,但每个查询可能涉及提取大量行的一小部分列,且查询可能是复杂的。
允许一定的延迟 : 对于简单查询,可以接受一定的延迟,约50毫秒。
小型数据 : 列中的数据相对较小,包括数字和短字符串。
高吞吐量 : 需要处理单个查询时的高吞吐量,每秒可达数十亿行。
非必须事务 : 对事务的要求不高,即可容忍一些数据不一致性。
低数据一致性要求 : 数据一致性的要求相对较低。
每个查询有一个大表 : 通常每个查询涉及一个大表,而其他表规模较小。
结果适合RAM: 查询结果通常经过过滤或聚合,适合于单个服务器的RAM中。
ClickHouse是什么
ClickHouse 是一个用于 ++联机分析(++ ++OLAP++++)++ 的 ++列式++ 数据库管理系统(DBMS)。
要用于大规模数据分析的领域,特别是在需要处理海量数据并执行复杂查询的场景中表现出色。以下是一些主要的应用领域:
- 在线广告分析: ClickHouse可以用于分析在线广告的效果,处理大量的点击数据和用户行为,以优化广告投放策略。
- 日志分析: 处理大量的日志数据是ClickHouse的一项强项。它可以用于分析服务器日志、应用程序日志等,帮助识别潜在问题、监控系统性能等。
- 电商数据分析: 针对电子商务平台的大量交易和用户行为数据进行分析,包括销售趋势、用户行为模式等。
- 大数据仪表盘: ClickHouse可以支持创建实时或准实时的大数据仪表盘,用于监控业务指标、数据可视化等。
- 科学研究: 在科学研究领域,特别是需要分析大规模实验数据的情境下,ClickHouse可以用于加速数据处理和分析过程。
- 物联网(IoT)数据分析: 处理大量的物联网设备生成的数据,用于监测、预测和优化物联网系统。
ClickHouse的优缺点
以下是ClickHouse
的一些优点:
|------------------|----------------------------------------------------------------------------|
| 优点 | 描述 |
| 高性能 | ClickHouse专注于高性能的OLAP查询,特别适用于大规模数据集的复杂分析。其列式存储引擎和优化的查询执行计划使其在数据扫描和聚合方面表现卓越 |
| 列式存储引擎 | ClickHouse采用列式存储引擎,将表按列而不是按行存储。这种存储结构使得在分析查询中只读取所需的列,从而提高了查询性能 |
| 分布式架构 | ClickHouse是一个分布式系统,可以水平扩展以处理更大的数据集。它支持分布式查询,可以在多个节点上并行执行查询,实现高可用性和负载均衡 |
| 适用于时序数据 | ClickHouse对时序数据有专门的支持和优化,包括时间窗口、采样、填充等功能。这使其成为处理时间序列数据的理想选择 |
| 灵活的数据分布和复制策略 | ClickHouse允许用户定义数据分布和复制策略,以适应不同的业务需求。这种灵活性使得在大规模分布式环境中进行高可用性配置和负载均衡变得更为容易 |
| 支持多种数据格式 | ClickHouse支持多种数据格式的导入和导出,包括CSV、JSON、Parquet等。这使其更适应不同的数据来源和数据处理场景 |
| 低延迟查询 | ClickHouse在处理大规模数据时能够实现低延迟的查询,这使得它适用于需要快速响应分析查询的应用场景 |
| 开源和免费 | ClickHouse是开源的,可免费使用,这降低了部署和使用成本 |
尽管ClickHouse
在大规模数据分析和OLAP
场景中表现出色,但仍然有一些潜在的限制和不足,这取决于具体的使用场景和需求。以下是一些ClickHouse
可能存在的不足之处:
|------------------|-----------------------------------------------------------------------------------|
| 缺点 | 描述 |
| 事务支持有限 | ClickHouse的事务支持相对有限,主要关注于读取和分析性能。对于要求强事务一致性的OLTP场景,可能不是首选 |
| 写入操作相对较慢 | 尽管ClickHouse在大规模数据的读取和查询方面表现优越,但对于频繁的单行写入(INSERT、UPDATE、DELETE)操作,性能可能相对较慢 |
| 不适合频繁更新的场景 | ClickHouse的设计更适用于大规模的批量插入和查询,而不是频繁的更新。频繁的更新可能导致性能下降,因为ClickHouse的列式存储引擎更适用于不可变的数据 |
| 复杂连接操作性能相对较慢 | 在复杂的多表连接操作中,ClickHouse可能表现相对较慢。它的优势主要在于单表和简单连接查询 |
| 不支持全文搜索 | ClickHouse不支持全文搜索,因此在需要进行全文搜索的场景下,可能需要其他专门的全文搜索引擎的配合 |
| 存储过程和触发器不支持 | ClickHouse不支持存储过程和触发器,这意味着无法在数据库中实现存储过程式的业务逻辑 |
| 部分SQL标准的不支持 | ClickHouse实现了大部分SQL标准,但仍然可能存在一些特定SQL功能的不支持或支持有限 |
| 维护和管理的复杂性 | ClickHouse的配置和管理可能相对复杂,特别是在分布式集群环境中。需要仔细考虑配置、性能调优、数据备份等方面的问题 |
表引擎
ClickHouse的表引擎 定义了++数据表的物理存储结构++ 和++访问方法++,ClickHouse支持多种表引擎,其中一些常见的引擎包括MergeTree系列、Log系列、外部引擎、其它引擎等。
|------------------|---------------------|-------------------------------|---------------------------------|
| 引擎系列 | 引擎 | 用途 | 特点 |
| MergeTree 系列 | MergeTree | 大规模数据分析,时序数据 | 列式存储,适用于分析查询,支持分区和索引 |
| | ReplicatedMergeTree | 高可用性,数据冗余 | 支持数据复制,提高高可用性,支持分区和索引 |
| | Distributed | 跨多个节点的分布式查询 | 支持在多个节点之间执行分布式查询 |
| Log 系列 | Log | 记录变更日志 | 用于记录变更日志,通常与其他引擎结合使用 |
| 外部引擎 | Kafka | 集成 ClickHouse 和 Apache Kafka | 通过 Kafka 主题读取和写入数据 |
| | MySQL | 在 ClickHouse 中访问 MySQL 数据库的数据 | 用于在 ClickHouse 中访问 MySQL 数据库的数据 |
| | ODBC | 通过 ODBC 接口连接到其他数据源 | 通过 ODBC 接口连接到其他数据源 |
| 其它引擎 | TinyLog | 记录变更日志,轻量级实现 | 轻量级的 Log 引擎实现,适用于数据量较小的情况 |
| | TinyMergeTree | 大规模数据分析,轻量级实现 | 轻量级的 MergeTree 引擎实现,适用于数据量较小的情况 |
运行机制
以下是 ClickHouse 更为运行机制的详细描述:
- 表的创建与结构定义:用户通过 SQL 语句在 ClickHouse 中创建表,并定义表的结构,包括列的数据类型、分区方式、索引等。每个表都与一个特定的表引擎关联,决定了数据的存储方式和处理特性。
- 列式存储:ClickHouse 使用列式存储引擎,将相同列的数据存储在一起。这样的存储方式带来了高压缩比和更高的查询性能,尤其适用于大规模数据分析。
- 数据分区:表可以根据指定的字段进行分区,常见的是按照时间进行分区。分区有助于提高查询性能,允许系统更快速地定位和处理特定时间范围内的数据。
- 数据插入与合并:当用户插入新的数据时,数据首先会进入 MergeTree 引擎的"暂存区"(MergeTree 小分区),然后根据配置的合并策略,定期进行数据合并操作。合并操作有助于优化数据存储和提高查询性能。
- 索引的使用:ClickHouse 支持主键索引和辅助索引,提高了查询速度。主键索引用于快速定位唯一行,而辅助索引用于其他查询条件。
- 异步写入:ClickHouse 支持异步写入,插入操作是非常快速的。写入的数据首先进入 MergeTree 引擎的不同分区,然后可以通过周期性的合并操作进行整理。
- 分布式计算:如果运行在分布式集群中,ClickHouse 可以在多个节点上并行执行查询。Distributed 引擎用于在多个 ClickHouse 节点之间执行分布式查询,将查询分发到集群中的多个节点,并将结果合并返回。
- 数据副本和高可用性:ReplicatedMergeTree 引擎支持数据在多个副本之间的复制,提高数据的冗余和高可用性。在集群中的节点之间可以实现故障转移,保障数据的可靠性。
- 查询处理和优化:当执行查询时,ClickHouse 使用内置的优化器和执行引擎,根据查询的结构和表的分布情况进行优化,以提高查询性能。
- 异步更新和删除:ClickHouse 支持异步更新和删除操作。通过 ReplicatedMergeTree 引擎的版本控制机制,可以实现在表中执行条件更新和删除。
- 数据压缩:列式存储以及支持多种压缩算法,帮助减小存储占用,提高 I/O 效率。
编译和运行ClickHouse
bash
ARG OS_VER=22.04
ARG OS_IMAGE=ubuntu
FROM ${OS_IMAGE}:${OS_VER}
RUN apt-get update && apt-get install -y \
git cmake wget curl ccache nasm yasm ninja-build lsb-release wget software-properties-common gnupg
WORKDIR /root
# Clang
ARG CLANG_VER=17
ARG CLANG_REPO=https://apt.llvm.org
RUN wget ${CLANG_REPO}/llvm.sh \
&& sed -i 's/add-apt-repository "${REPO_NAME}"/add-apt-repository -y "${REPO_NAME}"/g' llvm.sh \
&& chmod +x llvm.sh \
&& ./llvm.sh ${CLANG_VER}
ENV CC=clang-${CLANG_VER}
ENV CXX=clang++-${CLANG_VER}
# Clickhouse
ARG CLICKHOUSE_VER=v24.8.2.3-lts
ARG CLICKHOUSE_REPO=https://github.com/ClickHouse/ClickHouse.git
RUN git clone ${CLICKHOUSE_REPO} \
&& cd ClickHouse \
&& git checkout -b ${CLICKHOUSE_VER} ${CLICKHOUSE_VER} \
&& git submodule update --init \
&& mkdir build \
&& cmake -S . -B build \
&& cmake --build build --target clickhouse
bash
#!/bin/bash
docker build --build-arg https_proxy --build-arg http_proxy --build-arg no_proxy -f Dockerfile -t clickhouse_build .
docker create --name temp-clickhouse-build clickhouse_build
docker cp temp-clickhouse-build:/root/ClickHouse/build/programs/clickhouse ./
docker rm temp-clickhouse-build
config.xml
XML
<!-- This file was generated automatically.
Do not edit it: it is likely to be discarded and generated again before it's read next time.
Files used to generate this file:
config.xml -->
<!-- Config that is used when server is run without config file. -->
<clickhouse>
<logger>
<level>trace</level>
<log>./clickhouse-server.log</log>
</logger>
<http_port>8123</http_port>
<tcp_port>9000</tcp_port>
<mysql_port>9004</mysql_port>
<listen_host>0.0.0.0</listen_host>
<path>/tmp/clickhouse</path>
<mlock_executable>true</mlock_executable>
<users>
<me>
<password>changeme</password>
<profile>default</profile>
<quota>default</quota>
<access_management>1</access_management>
<named_collection_control>1</named_collection_control>
</me>
</users>
<profiles>
<default/>
</profiles>
<quotas>
<default/>
</quotas>
</clickhouse>
运行Click House:
bash
BASE_DIR=$(pwd) && taskset -c 84-89,196-201 ./clickhouse server -C ${BASE_DIR}/config.xml --daemon