0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PB级分析型数据库ClickHouse的应用场景和特性等分享

数据分析与开发 来源:51CTO技术栈 作者:姜国强 2021-03-30 10:36 次阅读

在百花齐放的交互式分析领域,ClickHouse 绝对是后起之秀,它虽然年轻,却有非常大的发展空间。本文将分享 PB 级分析型数据库 ClickHouse 的应用场景、整体架构、众多核心特性等,帮助理解 ClickHouse 如何实现极致性能的存储引擎,希望与大家一起交流。

一、交互式分析之 ClickHouse

1. 交互式分析简介

交互式分析,也称 OLAP(Online Analytical Processing),它赋予用户对海量数据进行多维度、交互式的统计分析能力,以充分利用数据的价值进行量化运营、辅助决策等,帮助用户提高生产效率。

交互式分析主要应用于统计报表、即席查询(Ad Hoc)等领域,前者查询模式较固定,后者即兴进行探索分析。代表场景例如:移动互联网中 PV、UV、活跃度等典型实时报表;互联网内容领域中人群洞察、关联分析等即席查询。

交互式分析是数据分析的一种重要方式,与离线分析、流式分析、检索分析一起,共同组成完整的数据分析解决方案,在互联网、物联网快速发展的背景下,从不同维度满足用户对海量数据的全方位分析需求。 相比专注于事务处理的传统关系型数据库,交互式分析解决了 PB 级数据分析带来的性能、扩展性问题。 相比离线分析长达 T + 1 的时效性、流式分析较为固定的分析模式、检索分析受限的分析性能,交互式分析的分钟级时效性、灵活多维度的分析能力、超高性能的扫描分析性能,可以大幅度提高数据分析的效率,拓展数据分析的应用范围。

c74c0c40-8e33-11eb-8b86-12bb97331649.png

从数据访问特性角度来看,交互式分析场景具有如下典型特点:

大多数访问是读请求。

写入通常为追加写,较少更新、删除操作。

读写不关注事务、强一致等特性。

查询通常会访问大量的行,但仅部分列是必须的。

查询结果通常明显小于访问的原始数据,且具有可理解的统计意义。

2. 百花齐放下的 ClickHouse

近十年,交互式分析领域经历了百花齐放式的发展,大量解决方案爆发式涌现,尚未有产品达到类似 Oracle / MySQL 在关系型数据库领域中绝对领先的状态。 业界提出的开源或闭源的交互式解决方案,主要从大数据、NoSQL 两个不同的方向进行演进,以期望提供用户最好的交互式分析体验。下图所示是不同维度下的代表性解决方案,供大家参考了解:

c9952f68-8e33-11eb-8b86-12bb97331649.png

其中,ClickHouse 作为一款 PB 级的交互式分析数据库,最初是由号称 “ 俄罗斯 Google ” 的 Yandex 公司开发,主要作为世界第二大 Web 流量分析平台 Yandex.Metrica(类 Google Analytic、友盟统计)的核心存储,为 Web 站点、移动 App 实时在线的生成流量统计报表。 自 2016 年开源以来,ClickHouse 凭借其数倍于业界顶尖分析型数据库的极致性能,成为交互式分析领域的后起之秀,发展速度非常快,Github 上获得 12.4K Star,DB-Engines 排名近一年上升 26 位,并获得思科、Splunk、腾讯、阿里等顶级企业的采用[1]。下面是 ClickHouse 及其他开源 OLAP 产品的发展趋势统计:

cb2b3aa2-8e33-11eb-8b86-12bb97331649.png

性能是衡量 OLAP 数据库的关键指标,我们可以通过 ClickHouse 官方测试结果[2] 感受下 ClickHouse 的极致性能,其中绿色代表性能最佳,红色代表性能较差,红色越深代表性能越弱。 从测试结果看,ClickHouse 几乎在所有场景下性能都最佳,并且从所有查询整体看,ClickHouse 领先图灵奖得主 Michael Stonebraker 所创建的 Vertica 达 6 倍,领先 Greenplum 达到 18 倍。

cbc018f2-8e33-11eb-8b86-12bb97331649.png

更多测试结果可参考 OLAP 系统第三方评测[3] ,尽管该测试使用了无索引的表引擎(或称表类型),ClickHouse 仍然在单表模式下体现了强劲的领先优势。

二、ClickHouse 架构

1. 集群架构

ClickHouse 采用典型的分组式的分布式架构,具体集群架构如下图所示:

ccdd0ace-8e33-11eb-8b86-12bb97331649.png

Shard :集群内划分为多个分片或分组(Shard 0 … Shard N),通过 Shard 的线性扩展能力,支持海量数据的分布式存储计算。

Node :每个 Shard 内包含一定数量的节点(Node,即进程),同一 Shard 内的节点互为副本,保障数据可靠。ClickHouse 中副本数可按需建设,且逻辑上不同 Shard 内的副本数可不同。

ZooKeeper Service :集群所有节点对等,节点间通过 ZooKeeper 服务进行分布式协调。

2. 数据模型

ClickHouse 采用经典的表格存储模型,属于结构化数据存储系统。我们分别从面向用户的逻辑数据模型和面向底层存储的物理数据模型进行介绍。

(1)逻辑数据模型

从用户使用角度看,ClickHouse 的逻辑数据模型与关系型数据库有一定的相似:一个集群包含多个数据库,一个数据库包含多张表,表用于实际存储数据。 与传统关系型数据库不同的是,ClickHouse 是分布式系统,如何创建分布式表呢?ClickHouse 的设计是:先在每个 Shard 每个节点上创建本地表(即 Shard 的副本),本地表只在对应节点内可见;然后再创建分布式表,映射到前面创建的本地表。这样用户在访问分布式表时,ClickHouse 会自动根据集群架构信息,把请求转发给对应的本地表。创建分布式表的具体样例如下:

# 首先,创建本地表CREATE TABLE table_local ON CLUSTER cluster_test( OrderKey UInt32, # 列定义 OrderDate Date, Quantity UInt8, TotalPrice UInt32, ……)ENGINE = MergeTree() # 表引擎PARTITION BY toYYYYMM(OrderDate) # 分区方式ORDER BY (OrderDate, OrderKey); # 排序方式SETTINGS index_granularity = 8192; # 数据块大小 # 然后,创建分布式表CREATE TABLE table_distribute ON CLUSTER cluster_test AS table_localENGINE = Distributed(cluster_test, default, table_local, rand()) # 关系映射引擎 其中部分关键概念介绍如下,分区、数据块、排序等概念会在物理存储模型部分展开介绍:

MergeTree :ClickHouse 中使用非常多的表引擎,底层采用 LSM Tree 架构,写入生成的小文件会持续 Merge。

Distributed :ClickHouse 中的关系映射引擎,它把分布式表映射到指定集群、数据库下对应的本地表上。

更直观的,ClickHouse 中的逻辑数据模型如下:

cd9163d4-8e33-11eb-8b86-12bb97331649.png

(2)物理存储模型

接下来,我们来介绍每个分片副本内部的物理存储模型,具体如下:

数据分区:每个分片副本的内部,数据按照 PARTITION BY 列进行分区,分区以目录的方式管理,本文样例中表按照时间进行分区。

列式存储:每个数据分区内部,采用列式存储,每个列涉及两个文件,分别是存储数据的 .bin 文件和存储偏移等索引信息的 .mrk2 文件。

数据排序:每个数据分区内部,所有列的数据是按照 ORDER BY 列进行排序的。可以理解为:对于生成这个分区的原始记录行,先按 ORDER BY 列进行排序,然后再按列拆分存储。

数据分块:每个列的数据文件中,实际是分块存储的,方便数据压缩及查询裁剪,每个块中的记录数不超过 index_granularity,默认 8192。

主键索引:主键默认与 ORDER BY 列一致,或为 ORDER BY 列的前缀。由于整个分区内部是有序的,且切割为数据块存储,ClickHouse 抽取每个数据块第一行的主键,生成一份稀疏的排序索引,可在查询时结合过滤条件快速裁剪数据块。

ce7de4d4-8e33-11eb-8b86-12bb97331649.png

三、ClickHouse核心特性

ClickHouse 为什么会有如此高的性能,获得如此快速的发展速度?下面我们来从 ClickHouse 的核心特性角度来进一步介绍。

1. 列存储

ClickHouse 采用列存储,这对于分析型请求非常高效。一个典型且真实的情况是:如果我们需要分析的数据有 50 列,而每次分析仅读取其中的 5 列,那么通过列存储,我们仅需读取必要的列数据,相比于普通行存,可减少 10 倍左右的读取、解压、处理等开销,对性能会有质的影响。

这是分析场景下,列存储数据库相比行存储数据库的重要优势。这里引用 ClickHouse 官方一个生动形象的动画,方便大家理解:

行存储:从存储系统读取所有满足条件的行数据,然后在内存中过滤出需要的字段,速度较慢:

cfe15680-8e33-11eb-8b86-12bb97331649.gif

列存储:仅从存储系统中读取必要的列数据,无用列不读取,速度非常快:

2. 向量化执行

在支持列存的基础上,ClickHouse 实现了一套面向向量化处理 的计算引擎,大量的处理操作都是向量化执行的。 相比于传统火山模型中的逐行处理模式,向量化执行引擎采用批量处理模式,可以大幅减少函数调用开销,降低指令、数据的 Cache Miss,提升 CPU 利用效率。并且 ClickHouse 可利用 SIMD 指令进一步加速执行效率。这部分是 ClickHouse 优于大量同类 OLAP 产品的重要因素。 以商品订单数据为例,查询某个订单总价格的处理过程,由传统的按行遍历处理的过程,转换为按 Block 处理的过程,具体如下图:

da95136e-8e33-11eb-8b86-12bb97331649.png

3. 编码压缩

由于 ClickHouse 采用列存储,相同列的数据连续存储,且底层数据在存储时是经过排序的,这样数据的局部规律性非常强,有利于获得更高的数据压缩比。 此外,ClickHouse 除了支持 LZ4、ZSTD 等通用压缩算法外,还支持 Delta、DoubleDelta、Gorilla 等专用编码算法[4],用于进一步提高数据压缩比。 其中 DoubleDelta、Gorilla 是 Facebook 专为时间序数据而设计的编码算法,理论上在列存储环境下,可接近专用时序存储的压缩比,详细可参考 Gorilla 论文[5]。

dbeb16be-8e33-11eb-8b86-12bb97331649.png

在实际场景下,ClickHouse 通常可以达到 10 : 1 的压缩比,大幅降低存储成本。同时,超高的压缩比又可以降低存储读取开销、提升系统缓存能力,从而提高查询性能。

4. 多索引

列存用于裁剪不必要的字段读取,而索引则用于裁剪不必要的记录读取。ClickHouse 支持丰富的索引,从而在查询时尽可能的裁剪不必要的记录读取,提高查询性能。 ClickHouse 中最基础的索引是主键索引。前面我们在物理存储模型中介绍,ClickHouse 的底层数据按建表时指定的 ORDER BY 列进行排序,并按 index_granularity 参数切分成数据块,然后抽取每个数据块的第一行形成一份稀疏的排序索引。 用户在查询时,如果查询条件包含主键列,则可以基于稀疏索引进行快速的裁剪。这里通过下面的样例数据及对应的主键索引进行说明:

dd602656-8e33-11eb-8b86-12bb97331649.png

样例中的主键列为 CounterID、Date,这里按每 7 个值作为一个数据块,抽取生成了主键索引 Marks 部分。当用户查询 CounterID equal ‘h’ 的数据时,根据索引信息,只需要读取 Mark number 为 6 和 7 的两个数据块。 ClickHouse 支持更多其他的索引类型,不同索引用于不同场景下的查询裁剪,具体汇总如下,更详细的介绍参考 ClickHouse 官方文档[6]:

de228020-8e33-11eb-8b86-12bb97331649.png

5. 物化视图(Cube/Rollup)

OLAP 分析领域有两个典型的方向:一是 ROLAP,通过列存、索引等各类技术手段,提升查询时性能。 另一是 MOLAP,通过预计算提前生成聚合后的结果数据,降低查询读取的数据量,属于计算换性能方式。 前者更为灵活,但需要的技术栈相对复杂;后者实现相对简单,但要达到的极致性能,需要生成所有常见查询对应的物化视图,消耗大量计算、存储资源。物化视图的原理如下图所示,可以在不同维度上对原始数据进行预计算汇总:

df62f0a0-8e33-11eb-8b86-12bb97331649.png

ClickHouse 一定程度上做了两者的结合,在尽可能采用 ROLAP 方式提高性能的同时,支持一定的 MOLAP 能力,具体实现方式为 MergeTree系列表引擎[7] 和 MATERIALIZED VIEW[8]。 事实上,Yandex.Metrica 的存储系统也经历过使用纯粹 MOLAP 方案的发展过程,具体参考 ClickHouse的发展历史[9]。 用户在使用时,可优先按照 ROLAP 思路进行调优,例如主键选择、索引优化、编码压缩等。当希望性能更高时,可考虑结合 MOLAP 方式,针对高频查询模式,建立少量的物化视图,消耗可接受的计算、存储资源,进一步换取查询性能。

6. 其他特性

除了前面所述,ClickHouse 还有非常多其他特性,抽取列举如下,更多详细内容可参考 ClickHouse官方文档[10]。

SQL 方言:在常用场景下,兼容 ANSI SQL,并支持 JDBC、ODBC 等丰富接口。

权限管控:支持 Role-Based 权限控制,与关系型数据库使用体验类似。

多机多核并行计算:ClickHouse 会充分利用集群中的多节点、多线程进行并行计算,提高性能。

近似查询:支持近似查询算法、数据抽样等近似查询方案,加速查询性能。

Colocated Join:数据打散规则一致的多表进行 Join 时,支持本地化的 Colocated Join,提升查询性能。 ……

四、ClickHouse 的不足

前面介绍了大量 ClickHouse 的核心特性,方便读者了解 ClickHouse 高性能、快速发展的背后原因。当然,ClickHouse 作为后起之秀,远没有达到尽善尽美,还有不少需要待完善的方面,典型代表如下:

1. 分布式管控

分布式系统通常包含 3 个重要组成部分:存储引擎、计算引擎、分布式管控层。ClickHouse 有一个非常突出的高性能存储引擎,但在分布式管控层显得较为薄弱,使得运营、使用成本偏高。主要体现在: (1)分布式表 ClickHouse 对分布式表的抽象并不完整,在多数分布式系统中,用户仅感知集群和表,对分片和副本的管理透明,而在 ClickHouse 中,用户需要自己去管理分片、副本,例如前面介绍的建表过程:用户需要先创建本地表(分片的副本),然后再创建分布式表,并完成分布式表到本地表的映射。 (2)弹性伸缩 ClickHouse 集群自身虽然可以方便的水平增加节点,但并不支持自动的数据均衡。例如,当包含 6 个节点的线上生产集群因存储 或 计算压力大,需要进行扩容时,我们可以方便的扩容到 10 个节点,但是数据并不会自动均衡,需要用户给已有表增加分片 或者 重新建表,再把写入压力重新在整个集群内打散,而存储压力的均衡则依赖于历史数据过期。ClickHouse在弹性伸缩方面的不足,大幅增加了业务在进行水平伸缩时运营压力。 基于 ClickHouse 的当前架构,实现自动均衡相对复杂,导致相关问题的根因在于 ClickHouse 分组式的分布式架构:同一分片的主从副本绑定在一组节点上,更直接的说,分片间数据打散是按照节点进行的,自动均衡过程不能简单的搬迁分片到新节点,会导致路由信息错误。而创建新表并在集群中进行全量数据重新打散的方式,操作开销过高。

e11c2efc-8e33-11eb-8b86-12bb97331649.png

(3)故障恢复 与弹性伸缩类似,在节点故障的情况下,ClickHouse 并不会利用其它机器补齐缺失的副本数据。需要用户先补齐节点后,然后系统再自动在副本间进行数据同步。

2. 计算引擎

虽然 ClickHouse 在单表性能方面表现非常出色,但是在复杂场景仍有不足,缺乏成熟的 MPP 计算引擎 和 执行优化器,例如:多表关联查询、复杂嵌套子查询等场景下查询性能一般,需要人工优化;缺乏 UDF 等能力,在复杂需求下扩展能力较弱等。这也和 OLAP 系统第三方评测 的结果相符。这对于性能如此出众的存储引擎来说,非常可惜。

3. 实时写入

ClickHouse 采用类 LSM Tree 架构,并且建议用户通过批量方式进行写入,每个批次不少于 1000 行 或 每秒钟不超过一个批次,从而提高集群写入性能,实际测试情况下,32 vCPU & 128G 内存的情况下,单节点写性能可达 50 MB/s ~ 200 MB/s,对应 5w ~ 20w TPS。 但 ClickHouse 并不适合实时写入,原因在于 ClickHouse 并非典型的 LSM Tree 架构,它没有实现 Memory Table 结构,每批次写入直接落盘作为一棵 Tree(如果单批次过大,会拆分为多棵 Tree),每条记录实时写入会导致底层大量的小文件,影响查询性能。 这使得 ClickHouse 不适合有实时写入需求的业务,通常需要在业务和 ClickHouse 之间引入一层数据缓存层,实现批量写入。

五、结语

本文重点分享了 ClickHouse 的整体架构及众多核心特性,分析了 ClickHouse 如何实现极致性能的存储引擎,从而成为 OLAP 领域的后起之秀。 ClickHouse 仍然年轻,虽然在某些方面存在不足,但极致性能的存储引擎,使得 ClickHouse 成为一个非常优秀的存储底座。 后续我们会在不断拓展业务的同时,优先从分布式管控层和计算引擎层着手,持续优化 ClickHouse 的易用性、性能,打造业界领先的 OLAP 分析数据库。同时,我们会持续输出内核优化、最佳实践等经验,欢迎更多技术爱好者们一起探索、交流。

原文标题:交互式分析领域,为何 ClickHouse 能够杀出重围?

文章出处:【微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6509

    浏览量

    87557
  • 数据库
    +关注

    关注

    7

    文章

    3584

    浏览量

    63346

原文标题:交互式分析领域,为何 ClickHouse 能够杀出重围?

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    通过Modbus读写数据库中的数据

    本文是将数据库数据转为Modbus服务端/从站,实现数据库内的数据也可以走Modbus协议通过网口或串口读写的案例,下图是通过智能网关的参数软件(在附件中)配置的参数: 上图中的配置
    发表于 03-14 13:44

    NanoEdge AI的技术原理、应用场景及优势

    能耗并提高数据安全性。本文将对 NanoEdge AI 的技术原理、应用场景以及优势进行综述。 1、技术原理 NanoEdge AI 的核心技术包括边缘计算、神经网络压缩和低功耗硬件设计。边缘计算
    发表于 03-12 08:09

    AG32VF-MIPI应用场景

    的基础上,集成了MIPI接口协议,提供了丰富的功能和特性,能够满足不同应用场景的需求,为用户提供更加全面、便捷、高效的数据传输方案。 基本参数: MIPI up to 1.5Gbps LVDS up
    发表于 01-22 08:56

    redis的原理和使用场景

    、消息队列、实时分析、排行榜和计数器等场景。本文将详细介绍Redis的原理和使用场景。 一、Redis的原理 Redis的原理主要包括以下几个方面: 内存数据库:Redis是一种内存
    的头像 发表于 12-04 16:29 219次阅读

    SQLite、MySQL和PostgreSQL的差异与应用场景

    一个完整的IT系统一般少不了数据库系统的支撑,大量的数据需要保存到数据库中。不同的数据库在使用场景和性能上,有一定的差异。IT系统需要根据运
    的头像 发表于 11-24 15:44 331次阅读

    ClickHouse 联合创始人、前 Google 副总裁 Yury 到访杭州玖章算术公司,双方建立生态合作

    数据库,成立 2 年就发展成为基础软件领域的独角兽,玖章算术核心产品 NineData 则是中国数据库工具领域的佼佼者。通过本次沟通,ClickHouse 将继续增加其在生态能力上的投入,引入
    的头像 发表于 11-17 11:23 469次阅读
    <b class='flag-5'>ClickHouse</b> 联合创始人、前 Google 副总裁 Yury 到访杭州玖章算术公司,双方建立生态合作

    元件数据库

    软件可以识别设备的元件数据库就好了,我们公司的机器数据都是用物料编码建立的
    发表于 11-16 14:39

    UDP的特性与应用场景

    一、UDP的特性与应用场景 采用UDP有3个关键点: 网络带宽需求较小,而实时性要求高 大部分应用无需维持连接 需要低功耗 应用场景: 网页浏览:新浪微博就已经用了QUIC协议 流媒体:WebRTC
    的头像 发表于 11-13 15:34 378次阅读
    UDP的<b class='flag-5'>特性</b>与应<b class='flag-5'>用场景</b>

    如何在HarmonyOS对数据库进行备份,恢复与加密

    数据库备份与恢复 场景介绍 当应用在处理一项重要的操作,显然是不能被打断的。例如:写入多个表关联的事务。此时,每个表的写入都是单独的,但是表与表之间的事务关联性不能被分割。 如果操作的过程中
    发表于 11-07 08:57

    labview 和 wincc 的区别 使用场景

    labview 和 wincc 的区别 使用场景 都是上位机软件,都可以做监控软件 wincc的名气也比较大 对比的资料较少 写这些文章的人,从自己的从事的行业出发,带有自己的思维 使用的场景 肯定
    发表于 10-27 18:01

    SMT组装工艺流程的应用场景(多图)

    工艺流程的应用场景。 一、单面纯贴片工艺 应用场景: 仅在一面有需要焊接的贴片器件。 二、双面纯贴片工艺 应用场景: A/B面均为贴片元件。 三、单面混装工艺 应用场景: A面有
    发表于 10-17 18:10

    分析数据库如何创新

        在群雄逐鹿的 OLAP 数据库市场,开源引擎 ClickHouse 凭借其出色的性能成为公认的黑马。官方称其性能超过了市场上同类的列式数据库,每台服务器每秒可处理数亿到超过十亿行、体积达数十
    的头像 发表于 06-02 16:10 307次阅读
    <b class='flag-5'>分析</b>型<b class='flag-5'>数据库</b>如何创新

    如何使用原生ClickHouse函数和表引擎在两个数据库之间迁移数据

    将展示如何使用 Postgres 表引擎将分析查询的结果从 ClickHouse 推回 Postgres。当用户需要在终端用户应用程序中显示汇总数据,但又
    的头像 发表于 05-26 11:38 446次阅读
    如何使用原生<b class='flag-5'>ClickHouse</b>函数和表引擎在两个<b class='flag-5'>数据库</b>之间迁移<b class='flag-5'>数据</b>

    分析数据库如何创新?GOTC 2023议题揭秘

    在群雄逐鹿的 OLAP 数据库市场,开源引擎 ClickHouse 凭借其出色的性能成为公认的黑马。官方称其性能超过了市场上同类的列式数据库,每台服务器每秒可处理数亿到超过十亿行、体积达数十 GB
    的头像 发表于 05-19 09:03 278次阅读
    <b class='flag-5'>分析</b>型<b class='flag-5'>数据库</b>如何创新?GOTC 2023议题揭秘

    蓝牙多连接应用场景举例

    蓝牙多连接应用场景举例 一、蓝牙多连接的通信方式: 1-1、蓝牙MESH组网图: 1-2、蓝牙星组网图; 二、两种方案的优劣势: 2-1、 MESH方式网络中的节点数量多,能够实现单播、组播
    发表于 05-09 09:09