clickhouse 原理详解

2024-08-26 18:28
文章标签 详解 原理 clickhouse

本文主要是介绍clickhouse 原理详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、MPP数据库简介

1.1、什么是OLTP与OLAP?

1.1.1、OLTP(OnLine Transaction Processing )

联机事务处理 系统,例如mysql。擅长事务处理,在数据操作中保持着很强的一致性和原子性 ,能够很好的支持频繁的数据插入和修改 ,但是,一旦数据量过大,OLTP便力不从心了。

1.1.2、OLAP(On-Line Analytical Processing)

联机分析处理 系统,例如clickhouse,greenplum,Doris。不特别关心对数据进行输入、修改等事务性处理,而是关心对已有 的大量数据进行多维度的、复杂的分析的一类数据系统 。

1.1.3、ClickHouse 简介

ClickHouse的全称是Click Stream,Data WareHouse。ClickHouse 是俄罗斯的 Yandex (俄罗斯第一大搜索引擎) 于 2016 年开源的用于在线分析处理查询(OLAP :Online Analytical Processing)MPP架构的列式存储数据库(DBMS:Database Management System),能够使用 SQL 查询实时生成分析数据报告。

ClickHouse 使用 C++ 语言编写,主要用于在线分析处理查询(OLAP),能够使用 SQL 查询实时生成分析数据报告。clickhouse可以做用户行为分析,流批一体clickhouse没有走hadoop生态,采用 Local attached storage 作为存储,令人惊喜的是,ClickHouse 的性能大幅超越了很多商业 MPP 数据库软件

比如 Vertica,InfiniDB.相比传统的数据库软件,ClickHouse 要快 100-1000X:100Million 数据集:ClickHouse 比 Vertica 约快 5 倍,比 Hive 快 279 倍,比 My SQL 快 801 倍,1Billion 数据集:ClickHouse 比 Vertica 约快 5 倍,MySQL 和 Hive 已经无法完成任务了

1.1.4、Greenplum简介

Greenplum是一家总部位于美国加利福尼亚州,为全球大型企业用户提供新型企业级数据仓库(EDW)、企业级数据云(EDC)和商务智能(BI)提供解决方案和咨询服务的公司,在全球已有:[纳斯达克,[纽约证券交易所,Skype. FOX,T-Mobile;中国已有:中信实业银行,东方航空公司,阿里巴巴,华泰保险,中国远洋,李宁公司等大型企业用户选择Greenplum的产品。Greenplum的架构采用了MPP(大规模并行处理)。

Greenplum名字来源

Greenplum的大中华区总裁Stanley Chen告诉我们:“Greenplum这个名字是一个7岁小女孩无意中脱口而出的。”起初几个创始人在斟酌公司名字的时候都很没头绪,于是他们去问了朋友的孩子,一个年仅7岁的可爱小姑娘告诉他们叫“Apple”,但是爸爸告诉她,这个名字已经被别人用了,还有其他的么?很快孩子便随口说了“Greenplum”,于是“Greenplum”公司的名字就这样诞生了。**
 

1.1.5、Doris简介

Doris由百度大数据部研发 ,之前叫百度 Palo,2018年贡献到 Apache 社区后,更名为 doris,Doris是一个MPP的OLAP系统,以较低的成本提供在大数据集上的高性能分析和报表查询功能。

1.1.6、StoneDB介绍

StoneDB是国内首款基于MySQL的实时HTAP数据库产品, 由杭州石原子科技有限公司自主设计、研发的 基于 MySQL 内核打造的开源 HTAP(Hybrid Transactional and Analytical Processing)融合型数据库产品,可实现与 MySQL 的无缝切换。StoneDB 具备高性能、实时分析等特点,为用户提供一站式HTAP解决方案。StoneDB是一款兼容 MySQL的 HTAP 数据库,可以实现从MySQL到StonDB的无缝切换。
 

StoneDB 是基于 MySQL 内核打造的开源 HTAP (Hybrid Transactional and Analytical Processing) 融合型数据库,可实现与 MySQL 的无缝切换。StoneDB 具备超高性能、实时分析等特点,为用户提供一站式 HTAP 解决方案。
 

StoneDB 包含 100% 兼容 MySQL 5.6、5.7 协议,以及 MySQL 生态等重要特性,支持 MySQL 常用的功能及语法,支持 MySQL 生态中的系统工具和客户端,如 Navicat、Workbench、mysqldump、mydumper。由于 100% 兼容 MySQL,因此 StoneDB 的所有工作负载都可以继续使用 MySQL 数据库体系运行。

StoneDB 专门针对 OLAP 应用程序进行了设计和优化,支持百亿数据场景下进行高性能、多维度字段组合的复杂查询。

StoneDB 采用基于知识网格技术和列式存储引擎,该存储引擎为海量数据背景下 OLAP 应用而设计,通过列式存储数据、知识网格过滤、高效数据压缩等技术,为应用系统提供低成本和高性能的数据查询支持。

1.2、什么是MPP 系统


什么是 大规模并行处理 MPP架构?(Massively Parallel Processing),MPP架构是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的结果汇总在一起得到最终的结果。采用MPP架构的数据库称为MPP数据库。

在 MPP 系统中,每个 单节点也可以运行自己的操作系统、数据库等。换言之,每个节点内的 CPU 不能访问另一个节点的内存。节点之间的信息交互是通过节点互联网络实现的,这个过程一般称为数据重分配(Data Redistribution) 。

与传统的单体架构 明显不同,MPP系统因为 要在不同处理单元之间传送信息,当数据规模很小的时候,MPP的效率要比单体架构要差一点,
但是当数据规模上来之后,MPP的效率要比 单体架构 好。
这就是看通信时间占用计算时间的比例而定,如果通信时间比较多,那MPP系统就不占优势了,相反,如果通信时间比较少,那MPP系统可以充分发挥资源的优势,达到高效率。

1.3、为什么需要MPP数据库?


海量数据的分析需求,传统数据库无法支持大规模集群与PB级别数据量,单台机器性能受限、成本高昂,扩展性受限

支持复杂的结构化查询(这里是重点)
复杂查询经常使用多表联结、全表扫描等,牵涉的数据量往往十分庞大;

支持复杂sql查询和支持大数据规模;

Hadoop技术的先天不足
Hive等sql-on-hadoop性能太慢,分析场景不一样,SQL兼容性与支持不足

1.4、MPP数据库应用领域

大数据分析:MPP数据库做大数据计算或分析平台非常适合,例如:数据仓库系统、历史数据管理系统、数据集市等。MPP数据库有很强的并行数据计算能力和海量数据存储能力,所以,报表统计分析、运维统计数据,快速生成报表展示都可以使用mpp数据库。

符合几个条件:不需要更新数据,不需要频繁重复离线计算,不需要并发大。

有上百亿以上离线数据,不更新,结构化,需要各种复杂分析的sql语句,那就可以选择他。几秒、几十秒立即返回你想要的分析结果。

例如sum,count,group by,order,好几层查询嵌套,在几百亿数据里分分钟出结果,这类的数据库:,clickhouse,greenplum,Doris

MPP数据库不擅长高频的小规模数据插入、修改、删除,每次事务处理的数据量不大。这类数据衡量指标是TPS,适用的系统是OLTP数据库。
 

2、Clickhouse特性


Clickhouse是一个列式数据库管理系统,在OLAP领域像一匹黑马一样,以其超高的性能受到业界的青睐。

2.1、Clickhouse的优势特性:


2.1.1、数据分区与线程级并行


ClickHouse支持PARTITION BY子句,在建表时可以指定按照任意合法表达式进行数据分区操作,比如通过toYYYYMM()将数据按月进行分区、toMonday()将数据按照周几进行分区。分区条件查询,只能读取包含适当分区数据块,而不扫描过多的数据。

灵活的使用,可以大大提升查询的性能。ClickHouse 将数据划分为多个 partition,每个 partition 再进一步划分为多个 index granularity(索引粒度),然后通过多个 CPU核心分别处理其中的一部分来实现并行数据处理。

在这种设计下,单条 Query 就能利用整机所有 CPU。极致的并行处理能力,极大的降低了查询延时。所以,ClickHouse 即使对于大量数据的查询也能够化整为零平行处理。

但是有一个弊端就是对于单条查询使用多 cpu,就不利于同时并发多条查询。所以对于高 qps 的查询业务,ClickHouse 并不是强项。
 

2.1.2、采用列式存储,数据类型一致,压缩性能更高


在一些列式数据库管理系统中(例如InfiniDB CE和MonetDB) 并没有使用数据压缩。>

InfiniDB Community Edition(社区版)提供一个可伸缩的分析型数据库引擎,主要为数据仓库、商业智能、以及对实时性要求不严格的应用而开发。基于MySQL搭建。包括对查询、事务处理以及大数据量加载的支持。

MonetDB是一个开源的面向列的数据库管理系统。MonetDB被设计用来为较大规模数据(如几百万行和数百列的数据库表)提供高性能查询的支持。

但是, 若想达到比较优异的性能,数据压缩确实起到了至关重要的作用。提供 LZ4、ZSTD 两种数据压缩格式

2.1.3、硬件利用率高,连续IO,提高了磁盘驱动器的效率

许多的列式数据库(如 SAP HANA, Google PowerDrill)只能在内存中工作,这种方式会造成比实际更多的设备预算。

ClickHouse被设计用于工作在传统磁盘上的系统,它提供每GB更低的存储成本,但如果有可以使用SSD和内存,它也会合理的利用这些资源

2.1.4、向量化引擎与SIMD提高了CPU利用率,多核多节点并行化大查询


为了高效的使用CPU,数据不仅仅按列存储,同时还按向量(列的一部分)进行处理,这样可以更加高效地使用CPU

ClickHouse会使用服务器上一切可用的资源,从而以最自然的方式并行处理大型查询

支持SQL
ClickHouse支持基于SQL的声明式查询语言,该语言大部分情况下是与SQL标准兼容的。几乎覆盖了标准SQL的大部分语法,包括DDL和DML,以及配套的各种函数,用户管理及权限管理,数据的备份与恢复
支持的查询包括 GROUP BY,ORDER BY,IN,JOIN以及非相关子查询。
绝大部分查询基本和常用的mysql一样,可以省去大部分同学的学习成本。不仅如此提供了强大的函数支查询能力,更丰富的存储格式,例如array多维数组、json、tuple、set等。

 

2.1.5、支持近似计算

ClickHouse提供各种各样在允许牺牲数据精度的情况下对查询进行加速的方法:

用于近似计算的各类聚合函数,如:distinct values, medians, quantiles
基于数据的部分样本进行近似查询。这时,仅会从磁盘检索少部分比例的数据。
不使用全部的聚合条件,通过随机选择有限个数据聚合条件进行聚合。这在数据聚合条件满足某些分布条件下,在提供相当准确的聚合结果的同时降低了计算资源的使用。

2.1.6、索引

主键索引
ClickHouse支持主键索引,它将每列数据按照index granularity(默认8192行)进行划分,会为每个数据片段创建一个索引文件,索引文件包含每个索引行(『标记』)的主键值。

索引行号定义为 n * index_granularity 。当数据被插入到表中时,会分成数据片段并按主键的字典序排序。例如,主键是 (CounterID, Date) 时,片段中数据按 CounterID 排序,具有相同 CounterID 的部分按 Date 排序。

但是值得注意的是:ClickHouse 不要求主键惟一。所以,你可以插入多条具有相同主键的行。

要想实现去重效果,需要结合具体的表引擎ReplacingMergeTree、CollapsingMergeTree、VersionedCollapsingMergeTree实现。

稀疏索引
ClickHouse支持对任意列创建任意数量的稀疏索引。其中被索引的value可以是任意的合法SQL Expression,并不仅仅局限于对column value本身进行索引。之所以叫稀疏索引,是因为它本质上是对一个完整index granularity(默认8192行)的统计信息,并不会具体记录每一行在文件中的位置。

 

2.1.7、丰富的表引擎

ClickHouse和MySQL类似,把表级的存储引擎插件化,根据表的不同需求可以设定不同的存储引擎。

目前包括合并树,日志,接口和其他四大类20多种引擎。

clickhouse 不仅拥有自己强大的MergeTree家族的多种本地引擎外,还提供了丰富的外部引擎供我们选择,包括但不限于:kafka、HDFS、Mysql。
但是使用外部引擎的时,性能自然会不如本地存储。

MergeTree引擎家族中很有很多优秀的引擎 比如: 适合人物画像的AggregatingMergeTree引擎 可自定义去重的SummingMergeTree引擎 折叠树CollapsingMergeTree 用于Graphite监控的GraphiteMergeTree引擎 。。。 这些都具有数据副本的能力 Replicated* 官方推荐的适合大多数场景的依然是MergeTree引擎,其家族中其他引擎大多也是在其基础上做的封装。

除此之外,还有分布式的表引擎Distributed。 Distributed是一种逻辑表引擎,并不存储数据。

创建该表引擎时,会指向已配置的分片集,要查询的时候,它会向每个分片发起查询并最终汇总集合然后返回。这里配置分片集可超灵活的配置,不用的时候可以删除。以后会单独来介绍该引擎的使用

2.1.8、基于shard+replica实现的线性扩展和高可靠

clickhouse高吞吐写入能力
ClickHouse 采用类 LSM Tree的结构,数据写入后定期在后台 Compaction。

通过类 LSM tree的结构,ClickHouse 在数据导入时全部是顺序 append 写,写入后数据段不可更改,

在后台compaction 时也是多个段 merge sort 后顺序写回磁盘。

顺序写的特性,充分利用了磁盘的吞吐能力,即便在 HDD 上也有着优异的写入性能。

官方公开 benchmark 测试显示能够达到 50MB-200MB/s 的写入吞吐能力,按照每行100Byte 估算,大约相当于 50W-200W 条/s 的写入速度。

这篇关于clickhouse 原理详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109335

相关文章

Mysql数据库聚簇索引与非聚簇索引举例详解

《Mysql数据库聚簇索引与非聚簇索引举例详解》在MySQL中聚簇索引和非聚簇索引是两种常见的索引结构,它们的主要区别在于数据的存储方式和索引的组织方式,:本文主要介绍Mysql数据库聚簇索引与非... 目录前言一、核心概念与本质区别二、聚簇索引(Clustered Index)1. 实现原理(以 Inno

使用python生成固定格式序号的方法详解

《使用python生成固定格式序号的方法详解》这篇文章主要为大家详细介绍了如何使用python生成固定格式序号,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录生成结果验证完整生成代码扩展说明1. 保存到文本文件2. 转换为jsON格式3. 处理特殊序号格式(如带圈数字)4

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础