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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~