clickhouse 基础

 


clickhouse 介绍

ClickHouse 是一个高性能、面向列的 SQL 数据库管理系统 (DBMS),用于在线分析处理 (OLAP)。

clickhouse 特点

列式存储:
    数据以列而非行的方式存储,优化了压缩效率和查询性能,特别适合分析型查询。

实时查询:
    支持高效的实时数据插入和查询,适合需要快速数据处理和分析的场景。

高性能:
    支持大规模数据集的快速查询,采用了多线程和并行处理技术。

水平扩展:
    可以通过增加更多节点来扩展集群,支持分布式部署。

数据压缩:
    内置多种压缩算法,减少存储空间使用,并提高 I/O 性能。

支持 SQL:
    提供丰富的 SQL 查询功能,兼容性强,易于使用和迁移。

灵活的数据模型:
    支持多种数据类型和复杂的数据结构,如数组、嵌套类型等。

高可用性:
    支持复制和分区,使得数据在节点故障时仍然可用。

clickhouse 组件构成

Column Storage Engine	列式存储引擎,处理数据压缩与存储格式(如 MergeTree 系列)。
Distributed Table Engine	分布式表引擎,协调跨分片的查询与数据写入。
MergeTree 引擎家族	核心表引擎(如 ReplicatedMergeTree),支持数据分区、合并、TTL 等特性。
Replication & Sharding	副本机制(基于 ZooKeeper/Keeper)和分片机制实现高可用与扩展性。
ClickHouse Keeper	轻量级协调服务(替代 ZooKeeper),用于元数据同步与分布式锁管理。
ClickHouse Client: 命令行交互工具。
ClickHouse Server: 主服务进程,处理查询与数据存储。

clickhouse 常用术语

Shard(分片)	数据的水平拆分单元,不同分片存储不同数据子集。
Replica(副本)	分片的冗余拷贝,用于高可用和负载均衡。
ZooKeeper/Keeper	协调服务,管理分布式元数据(如副本同步、DDL 操作)。
MergeTree	核心表引擎,支持数据分区、合并、索引和 TTL(生存时间)。
Partition(分区)	数据按时间或其他字段切分的逻辑单元,加速查询和删除。
Primary Key(主键)	数据排序键(非唯一),影响查询性能和存储结构。

clickhouse 端口

2181:ZooKeeper默认服务端口。
8123:HTTP默认端口。
8443:HTTP SSL/TLS默认端口。
9000:原生协议端口(也称为ClickHouse TCP协议)。用于ClickHouse应用程序和进程,如clickhouse-server、clickhouse-client和原生ClickHouse工具。用于分布式查询的服务器间通信。
9004:MySQL模拟端口。
9005:PostgreSQL模拟端口(如果为ClickHouse启用了SSL,则也用于安全通信)。
9009:用于低级数据访问的服务器间通信端口。用于数据交换、复制和服务器间通信。
9010:用于服务器间通信的SSL/TLS端口。
9011:原生协议PROXYv1协议端口。
9019:JDBC桥接端口。
9100:gRPC端口。
9181:推荐的ClickHouse Keeper端口。
9234:推荐的ClickHouse Keeper Raft端口(如果启用了<secure>1</secure>,则也用于安全通信)。
9363:Prometheus默认指标端口。
9281:推荐的Secure SSL ClickHouse Keeper端口。
9440:原生协议SSL/TLS端口。
42000:Graphite默认端口。

storage_policies

policy_name(字符串) - 存储策略的名称。

volume_name(字符串) - 在存储策略中定义的卷的名称。

volume_priority(UInt64) - 卷在配置中的顺序号,数据按照这个优先级填充卷,即插入和合并的数据会写入优先级较低的卷(同时考虑其他规则:TTL、max_data_part_size、move_factor)。

disks(Array(String))- 在存储策略中定义的磁盘名称。

volume_type(Enum8) - 卷的类型。可能有一个以下的值:
    JBOD
    SINGLE_DISK
    UNKNOWN

max_data_part_size(UInt64) - 可以存储在卷磁盘上的数据部分的最大大小(0表示没有限制)。

move_factor(Float64) - 空闲磁盘空间的比率。当该比率超过配置参数的值时,ClickHouse会按序将数据移动到下一个卷。

prefer_not_to_merge(UInt8) - prefer_not_to_merge设置的值。此值通常应为false。启用此设置表示出现错误。

perform_ttl_move_on_insert(UInt8) - perform_ttl_move_on_insert设置的值。该设置用于禁用数据部分插入时的TTL移动。默认情况下,如果我们插入一个已经过期按TTL移动规则的数据部分,它会立即移动到移动规则中声明的卷/磁盘。如果目标卷/磁盘速度较慢(例如S3),这可能会显著减慢插入速度。

load_balancing(Enum8) - 磁盘平衡的策略。可能有一个以下的值:
    ROUND_ROBIN(轮询)
    LEAST_USED(最少使用)

本地表和分布式表关系

本地表(Local Table)

定义: 实际存储数据的物理表,绑定到具体节点的存储引擎(如 ReplicatedMergeTree)。

特点:
    每个分片的副本节点独立维护本地表。
    数据写入本地表后,通过副本机制(如 ZooKeeper/Keeper)同步到其他副本。

分布式表(Distributed Table)

定义: 逻辑表,不存储实际数据,用于跨分片查询和写入路由。

特点:
    通过 Distributed 引擎定义,指向多个本地表。
    写入分布式表时,数据按分片键(如 id)路由到对应分片。
    查询分布式表时,自动聚合所有分片的结果。

两者直接的关系


对比项	              本地表	                                 分布式表
数据存储	         物理存储	                               逻辑视图
写入方式	直接写入本地表或通过分布式表路由写入	     写入分布式表自动路由到本地表
查询范围	        仅当前节点数据	                         跨所有分片数据聚合
DDL 操作	        需在每台节点执行	                 通过 ON CLUSTER 自动同步到集群

工作流程

写入数据:
    通过分布式表写入时,根据分片键(如 id)自动路由到对应分片的本地表。
    本地表通过副本机制(如 ReplicatedMergeTree)同步数据到其他副本。

查询数据:
    查询分布式表时,向所有分片发送查询请求,合并结果后返回。
    直接查询本地表仅返回当前节点的数据。

设计原则

数据本地性优先:
    分布式表是逻辑抽象,实际性能依赖本地表的设计(如分区、索引)。

分片键选择:
    分片键(如 id)需均匀分布数据,避免热点。

副本一致性:
    使用 ReplicatedMergeTree 引擎时,依赖 ZooKeeper/Keeper 保障副本一致性。

避免分布式 JOIN:
    ClickHouse 的分布式 JOIN 性能较差,建议预先聚合数据。

参考文档

https://clickhouse.com/docs

posted @   小吉猫  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示

目录导航