关于ClickHouse列式存储的那些事(二)| 青训营

94 阅读3分钟

ClickHouse采用列式存储,每一列数据独立存储在一起,通过压缩提高读取效率。

表由多个数据部分组成,每个数据部分对应一个块,每个块进一步分为一系列分块,每个分块对应一列。这种设计减小随机访问开销。

Copy

Table
   |- Data Part 1  
       |- Block 1
           |- Column Chunks
       |- Block 2  
           |- Column Chunks
   |- Data Part 2

索引设计

每个表创建主键索引和辅助索引:

  • 主键索引根据主键列值范围分布数据和块
  • 辅助索引通过B树和哈希查找主键范围快速定位块

此外还支持超文本索引、功能索引等不同类型的索引加速查询。

典型使用场景

  • 网站日志分析: ClickHouse擅长排序,聚合和 joins查询,适用于网页浏览日志统计。

sql

Copy

SELECT 
    count(),
    sum(response_length)
FROM apache_logs
GROUP BY counter_id
  • 实时指标监控:通过推送或者从MQ中同步拉取监控指标,支持毫秒级查询响应。

sql

Copy

CREATE TABLE metrics ON CLUSTER sharded_cluster
  • 运营数据分析:ClickHouse支持PB级存量数据查询,适用于积累 massivedata的定期报表。

sql

Copy

SELECT 
  SUM(amount)
FROM orders 
GROUP BY date, region
  • IoT数据湖:多列型数据写入高吞吐,支持随时查询和展开分析使用情景。

sql

Copy

INSERT INTO iot_data 
  VALUES 
  ('sensor1', toDateTime(now()), 20)

总体来说,ClickHouse通过其优异的列存储和索引设计,为大数据实时查询和分析提供了高性能的解决方案。目前广泛应用在以上典型场景中。 ClickHouse支持实时数据的写入和查询。

关于实时写入,ClickHouse主要通过以下方式实现:

  • 支持高吞吐的基于原子提交的插入操作。单次插入可以处理数百万行数据。
  • 使用高性能消息队列如Kafka作为数据源,支持以流式实时方式将数据同步到ClickHouse中。
  • 提供Mergetree引擎实时合并小文件。写操作被顺序写入文件,读操作直接访问合并后的大文件获得更高性能。
  • 支持原始日志实时消费和解析到ClickHouse,实现零数据丢失的低延迟整合。

关于实时查询,ClickHouse通过以下优势实现毫秒级响应:

  • 数据按列式存储布局,导读压缩后的列数据直接扫描查询。
  • 提供多个并行索引加速数据定位,如功能模糊索引、微调索引等。
  • 支持动态分区表,批量小文件合并后实时扩容计算资源。
  • ClickHouse引擎本身提供高并发能力,支持百万甚至亿级QPS查询负载。
  • 通过HTTP接口支持近实时的数据可视化DASHBOARD。

总结来说,结合高吞吐写入和低延迟实时查询两个优势,ClickHouse完全满足大数据实时处理和即席查询的需求场景。目前很多公司都在生产环境成功应用它用于实时数据中心。