暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

快到飞起的分析数据库ClickHouse笔记-架构

见白 2020-12-09
741




ClickHouse官网定义:ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。

1. clickhouse产生背景

1.1 olap联机分析相关术语


  • 下钻:从高层次向低层次明细数据穿透。例如从“省”下钻到“市”。

  • 上卷:从低层次向高层次汇聚。例如从“市”汇聚成“省”,“武汉、宜昌”汇聚成“湖北”。

  • 切片:将一个或多个维度设定为单个固定值,然后观察剩余的维度。例如设置商品维度为“足球”。

  • 切块:将一个或多个维度设定为多个固定值。例如设置商品维度为“足球”,“篮球”,“乒乓球”。

  • 旋转:旋转立方体的一面,将数据映射到一张二维表,等同于行列置换。

1.2 olap常见架构分类

  1. rolap (relational olap,关系型olap):关系模型构建,数据模型常使用星型模型或雪花模型。多维分析的操作会直接转换为sql查询。其缺点为对实时处理能力要求很高。
  2. molap (Multidimensional olap,多维型olap):多维型olap的出现是为了缓解rolap性能问题。使用多维数组的形式保存数据,借助预先聚合结果,使用空间换取时间的形式提升查询性能。对需要分析的数据进行建模,框定需要分析的维度字段,通过预处理,对各种维度进行组合并事先聚合。最后将聚合结果以某种索引或缓存的形式保存起来,只存聚合结果不存明细数据。
  3. holap (hybrid olap,混合架构型olap):olap和molap两者集成。

1.3 olap实现技术演进


  • 传统关系型数据库阶段:oracle、mysql等关系型数据库作为存储和计算的载体。缺点:数据大、维度多的情况下有严重的性能问题,甚至查询不出结果。

  • 大数据技术阶段:架构被大数据技术重构。rolap架构中hive、sparkSQL等技术取代,molap架构中MapReduce、spark、hbase等技术取代。缺点:数据同步实时性不高。


2. clickhouse架构

2.1 clickhouse基础认识


  • clickhouse的全称为click stream data warehouse,意即点击流数据仓库。yandex公司推出该数据库是为了基于页面的点击事件流,面向数据仓库进行olap分析。

  • clickhouse适用为各类数据分析的场景,数据体量越大优势越大,商业智能BI等可以发挥最大优势。但是不支持事务,不擅长根据主键按行粒度查询,不应该作为key-value数据库,不擅长按行删除。


2.2 相关技术


  • 列式存储与数据压缩:采用列式存储,相同的数据类型和现实语义存储在一起的重复率更高,方便数据压缩且压缩率更高。压缩算法采用LZ4,测试中clickhouse压缩比可达8:1。压缩后的数据降低了IO(减少数据扫描)和存储成本。

  • 向量化:是一种特殊的计算方式,可以在同一时间执行多次操作,通常是对不同的数据执行同样的一个或一批指令,或者说把指令应用于一个数组/向量。类似于arrayMap函数是对数组中的每一个元素进行同样的操作。

  • SIMD:单条指令操作多条数据(常用于计算密集型)。硬件层面引入一组大容量的寄存器,例如:一个寄存器包含8个32位,一次性将8个32位数据按次序同时放入寄存器。同时cpu新增处理该包含8个32位寄存器的指令,可以在一个指令周期内完成8个数据的位移运算。

  • 火山模型:sql经过解析生成一颗查询树,树的每个节点为代数运算符,运算符被看做迭代器,迭代器提供next()接口,接口实现为调用子节点的next()接口获取一行数据进行处理并返回。因此查询执行时由查询树自顶向下调用next()接口,数据自底向上被拉取处理,称为拉取执行模型(Pull Based)。优点是处理逻辑清晰,节点耦合性低;缺点是数据以行为单位处理,不利于cpu cache发挥,每处理一行要调多次next(),其为虚函数,开销大。

  • 向量化执行:采取火山模型,并且next()函数返回的是一批数据(比如1000行)。优点:大大减少火山模型的虚函数调用数量;以块为单位处理数据,提高cache命中率;多行并发处理,契合cpu乱序执行和并发执行的特性;同时处理多行数据应用SIMD。

  • cpu相关特性:超标量流水线与乱序执行。cpu指令执行多阶段切换,一个cpu核同时拥有多套控制单元,因此可以同时有多个流水线并发执行。cpu维护一个乱序执行的指令窗口,窗口中的无数据依赖的指令就会被取来并发执行。流水线不断,即程序分支越少越好;并发指令越多越好,指令间没有依赖。这两种方法可以提高超标量流水线的吞吐。

  • 分支预测:程序分支有条件跳转(if、switch)和无条件跳转(跳转地址或地址指针)。在跳转前流水线只能空缺等待,cpu引入一组专门记录最近几次某个地址的跳转指令的目的地址寄存器。执行跳转指令时直接取出放入流水线,等真正获取目的地址时,如果错了就推翻,再取真正的指令执行。

  • 多级存储与数据预取:cpu附近存储为寄存器,cache,内存,磁盘多级存储。如果访问数据是线性访问模式,cpu会主动将后续的内存块预先载入cache,进行数据预取。如果不是线性模式,则使用software prefetch(程序预取)。例如hash表查找。


2.3 clickhouse的核心特性

ClickHouse是一款MPP架构的列式存储数据库。拥有完备的DBMS功能:DDL(数据定义),DML(数据操作),权限控制,数据备份与恢复,分布式管理等。核心特性有:



  • clickhouse使用关系模型描述数据,并提供传统数据的概念(数据库、表、视图和函数)。完全使用sql作为查询语句,支持大部分标准sql。第三方分析可视化系统可以轻松集成。olap大量的关系模型数据库迁移至clickhouse成本很低。

  • 多样化的表引擎。通过特定的表引擎支撑特定的场景,十分灵活。

  • 多线程与分布式。计算移动比数据移动划算。数据存储支持分区(纵向扩展,利用多线程原理),也支持分片(横向扩展,利用分布式原理)。

  • 多主架构。不区分主控节点、数据节点和计算节点,集群中的所有节点功能相同,天然规避了单点故障,适合多数据中心、异地多活的场景。

  • 在线查询。Vertica商业数据库太贵,clickhouse开源免费。SparkSQL和Hive无法保障90%查询1秒返回,clickhouse亿级数据查询快。ElasticSearch搜索快但是亿级数据聚合比较困难,clickhouse数据聚合快。

  • 数据分片与分布式查询。clickhouse提供本地表与分布式表。本地表是一个数据分片,分布式表不存储数据,是本地表的访问代理。通过分布式表访问集群中的多个数据分片,实现分布式查询。clickhouse的一个分片只能对应一个服务节点。


2.4 clickhouse的架构设计


  • Column与field

    最基础的映射单元,一列数据由一个Column表示。Column分为接口和实现,IColumn接口对象中定义了数据的关系运算方法。采用泛化设计,不同的数据类型由不同的对象实现,如ColumnString、ColumnArray、ColumnTuple等。一般整列操作,如果对单值操作则使用field对象,采用聚合的设计模式,field内部聚合了NULL、UInt64、String、Array等13种类型及其处理逻辑。

  • DataType

    负责数据的序列化和反序列化,IDataType接口,涵盖二进制、文本、JSON等多格式。采用泛化设计,类型有DataTypeString、DataTypeArray、DataTypeTuple等。

  • Block与Block流

    内部数据操作面向Block对象,且采用流的形式。Block对象由数据对象、数据类型和列名称组成的三元组,即Column、DataType和列名称字符串。IBlockInputStream负责数据的读取和关系运算,IBlockOutputStream负责数据输出至下一环节。采用泛化设计,有各种流的实现类型,接口定义了读取数据的若干个read虚方法。IBlockInputStream有60多个实现类,一类为DDL操作,一类为关系运算操作,一类为表引擎处理。IBlockOutputStream与此类似,定义了多个write虚方法,有20多个实现类,基本用于表引擎处理。

  • Table

    不存在table对象,直接使用IStorage接口指代数据表。其定义了DDL、read和write方法。不同的表引擎由不同的子类实现。查询过程为:IStorage接收AST查询语句,返回相应的列数据,数据交由Interpreter处理。

  • Parser与Interpreter

    Parser分析器创建AST对象,Interpreter解释器解释AST,并创建查询的执行管道。Parser分析器将sql语句以递归下降的方法解析成AST语法树。

  • Function与Aggregate Function

    IFunction接口定义普通函数,无状态;IAggregateFunction接口定义聚合函数,有状态,且状态支持序列化和反序列化,使得可以在节点间传输,实现增量计算。

  • Cluster与Replication

    集群由分片(shard)组成,每个分片由副本(replica)组成。1个节点只能有1个分片,因此1分片1副本,需要2台服务器。分片仅是逻辑概念,物理承载还是由副本承担。



* AST:抽象语法树。是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。

3. clickhouse快的原因


前面已经介绍了ClickHouse的架构设计,下面简要介绍下clickhouse为什么在分析数据时能快的飞起。

3.1 基于硬件功效最大化目的设计

  1. 在内存中进行group by。
  2. 使用hashtable装载数据。
  3. 优化cpu L3级别缓存。

3.2 算法优化,基于场景的最佳性能选择算法

  1. 对于常量使用Volnitsky算法,对于非常量使用cpu向量化执行SIMD,进行暴力优化。
  2. 正则匹配使用re2和hyperscan算法。
  3. 去重计数uniqCombind根据数据量的不同选择不同算法:数据量小使用Array保存,中等用HashSet,数据量大用HyperLogLog算法。
  4. 数据结构清晰使用代码生成技术实现循环展开,减少循环次数。
  5. 向量化执行,SIMD应用于文本转换、数据过滤、数据解压和JSON转换等(相较于只使用cpu寄存器优化更好)。

3.3 基于真实产品数据的持续测试改进

最后一点便是yandex的clickhouse团队会跟进用户反馈,快速迭代clickhouse进行持续性的改进。

* ClickHouse号称比传统数据库快100至1000倍,附上官方对比测试:

https://clickhouse.tech/benchmark/dbms/




参考资料:

[1] Yandex.clickhouse官方文档[EB/OL]:https://clickhouse.tech/docs/en/

[2] 朱凯.ClickHouse原理解析与应用实践[M]






文章转载自见白,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论