架构探索之ClickHouse

导读

ClickHouse是一款开源的列式数据库管理系统,适用于在线分析处理(OLAP)场景,本文通过介绍ClickHouse,帮助读者今后快速地处理大规模数据,并获得实时的分析结果,为业务提供有力支持。

01 

前言

在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?由此我的Runner探索之旅开始了!

架构,软件开发中最熟悉不过的名词,遍布在我们的日常开发工作中,大到项目整体,小到功能组件,想要实现高性能、高扩展、高可用的目标都需要优秀架构理念辅助。所以作者尝试剖析市面上那些经典优秀的开源项目,学习优秀的架构理念来积累架构设计的经验与思考,在后续日常工作中遇到相同问题时能有更深一层的认知。

本章以实时OLAP引擎ClickHouse(简称ck)为例,以其面向场景,架构设计,细节实现等方面来介绍,深度了解其如何成为了OLAP引擎中的性能之王。

02 

  

ClickHouse简介

  

理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。

ClickHouse是俄罗斯Yandex(俄罗斯网络用户最多的网站)于2016年开源的一个用于联机分析(OLAP)的列式数据库管理系统,采用C++语言编写,主要用于在线分析处理查询,通过SQL查询实时生成分析数据报告。

主要面向场景是快速支持任意指标、任意维度并且可以在大数据量级下实现秒级反馈的Ad-hoc查询(即席查询)

03 

ClickHouse架构原理

 

理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。

ClickHouse以其卓越的性能著称,在相关性能对比报告中,ck在单表SQL查询的性能是presto的2.3倍、impala的3倍、greenplum的7倍、hive的48倍。可以看出ck在单表查询是非常出色的,那么ck究竟是如何实现高效查询的呢?

3.1  引子

介绍ck查询原理之前先以最常见的mysql为例,一条简单的查询语句是如何执行的,然后再以ck架构师的角度去考虑ck应该如何优化。mysql查数据时会先从磁盘读出数据所在页(innodb存储单元) 到内存中,然后再从内存中返回查询结果,所以在我们的认知中sql查询(排除语法词法解析,优化等步骤)总结起来可以为以下两点:

1.磁盘读取数据到内存

2.内存中解析数据匹配结果返回

在现代计算机中,CPU参与运算的时间远小于磁盘IO的时间。所以现代OLAP引擎大部分也选择通过降低磁盘IO的手段来提高查询性能,举例如下:

降低磁盘IO
原理
举例
劣势
分布式
并行读取数据,降低单节点读取数据量
hive(texfile)数据倾斜,网络耗时,资源浪费
列式存储
将每一列单独存储,按需读取
hbase适合列使用单一的业务


3.2  架构

通过以上推导分析,我们可以得出OLAP查询瓶颈在于磁盘IO,那么ck的优化手段也是借鉴了以上措施,采用了MPP架构(大规模并行处理)+列式存储,拥有类似架构设计的其他数据库产品也有很多,为什么ck性能如此出众?接下来我们具体分析ck的核心特性,进一步体会ck架构师的巧妙的架构理念。

eb396b8248bf4c76129bd91c1cb1b25d.png

ebcdcbc3d886adb952b407168912aacf.png图片1、2.

3.2.1 列式存储

行式存储:把同一行数据放到同一数据块中,各个数据块之间连续存储。

列式存储:把同一列数据放到同一数据块中,不同列之间可以分开存储。

6182d6be8b3bd19536ec924ea0a6569f.png图片3.

如同上述所讲,分析类查询往往只需要一个表里很少的几个字段,Column-Store只需要读取用户查询的column,而Row-Store读取每一条记录的时候会把所有column的数据读出来,在IO上Column-Store比Row-Store效率高得多,因此性能更好。

3.2.2 block

ClickHouse能处理的最小单位是block,block是一群行的集合,默认最大为8192行。因为每一列单独存储,因此每个数据文件相比于行式存储更有规律,通过对block采用LZ4压缩算法,整体压缩比大致可以8:1。可以看出,ClickHouse通过出色的压缩比与block结构实现了批处理功能,对比海量数据存储下每次处理1行数据的情况,大幅减少了IO次数从而达到了存储引擎上的优化。

3.2.3 LSM

LSM的思想: 对数据的修改增量保持在内存中,达到指定的限制后将这些修改操作批量写入到磁盘中,相比较于写入操作的高性能,读取需要合并内存中最近修改的操作和磁盘中历史的数据,即需要先看是否在内存中,若没有命中,还要访问磁盘文件

LSM的原理: 把一颗大树拆分成N棵小树,数据先写入内存中,随着小树越来越大,内存的小树会flush到磁盘中。磁盘中的树定期做合并操作,合并成一棵大树,以优化读性能。

ClickHouse通过LSM实现数据的预排序,从而减少磁盘的读取量。原理就是将乱序数据通过LSM在内存中排序,然后写入磁盘保存,并定期合并有重合的磁盘文件。ClickHouse的写入步骤可以总结为以下几点:

1.每一批次数据写入,先记录日志, 保证高可用机制

2.记录日志之后存入内存排序,后将有序结果写入磁盘,记录合并次数Level=0

3.定期将磁盘上Level=0或1的文件合并,并标记删除,后续物理删除

3.2.4 索引

ClickHouse的采用一级索引(稀疏索引)+二级索引(跳数索引)来实现索引数据定位与查询。一级索引记录每个block块的第一个,每次基于索引字段查询只需要确定查询第几个block块即可,避免一个查询遍历所有数据。如上述介绍,一个block块为8192行,那么1亿条数据只需要1万行索引,所以一级索引占用存储较小,可常驻内存,加速查询。 二级索引由数据的聚合信息构建而成,根据索引类型的不同,其聚合信息的内容也不同,跳数索引的目的与一级索引一样,也是帮助查询时减少数据扫描的范围,原则都是“排除法”,即尽可能的排除那些一定不满足条件的索引粒度。

另一方面可以发现,因ck存储引擎按有序集合存储,所以在索引结构上,并不需要再利用B+树排序特性来定位。所以在实际使用过程中,也不需要满足最左原则匹配,只要过滤条件中包含索引列即可。

fd010db9d964e6ef709846d88452794b.png

a16876241ee9d90ff0461df1b059bbd3.png图片4、5.

3.2.5 向量化执行

向量化计算(vectorization),也叫vectorized operation,也叫array programming,说的是一个事情:将多次for循环计算变成一次计算。为了实现向量化执行,需要利用CPU的SIMD指令。SIMD的全称是Single Instruction Multiple Data,即用单条指令操作多条数据。现代计算机系统概念中,它是通过数据并行以提高性能的一种实现方式 ( 其他的还有指令级并行和线程级并行 ),它的原理是在CPU寄存器层面实现数据的并行操作。

在计算机系统的体系结构中,存储系统是一种层次结构。典型服务器计算机的存储层次结构如图6所示。一个实用的经验告诉我们,存储媒介距离CPU越近,则访问数据的速度越快。

26d87708a11ad871b5c5a7891789b300.png图片6.

从左至右,距离CPU越远,则数据的访问速度越慢。从寄存器中访问数据的速度,是从内存访问数据速度的300倍,是从磁盘中访问数据速度的3000万倍。所以利用CPU向量化执行的特性,对于程序的性能提升意义非凡。ClickHouse目前利用SSE4.2指令集实现向量化执行。

04 

  

ClickHouse

总结  

理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目

4.1  ClickHouse的舍与得

ClickHouse在追求极致性能的路上,采取了很多优秀的设计。如上述讲的列存、批处理、预排序等等。但是架构都有两面性,从一另方面也带来了一些缺点。

高频次实时写入方面,因ck会将批量数据直接落盘成小文件,高频写入会造成大量小文件生成与合并,影响查询性能。所以ck官方也是建议大批低频的写入,提高写入性能。实际场景中建议在业务与数据库之间引入一层数据缓存层,来实现批量写入。

查询并发问题,ClickHouse是采用并行处理机制,即一个查询也会使用一半cpu去执行,在安装时会自动识别cpu核数,所以在发挥查询快的优势下,也带来了并发能力的不足。如果过多的查询数堆积达到max_concurrent_queries阈值,则会报出too many simultaneous queries异常,这也是ck的一种限流保护机制。所以日常使用过程中注意慢sql的排查,并发请求的控制是保证ck高可用的关键。

了解其原理之后,能够对ClickHouse有更深的认知,也能够解释生产工作中曾经遇到的问题,站在ClickHouse架构师的角度去合理使用,规避劣势,发挥其特性。

4.2  ClickHouse在实际生产中遇到的问题

4.2.1 zookeeper高负载影响

目前ClickHouse开源版本ReplicatedMergeTree引擎强依赖zookeeper完成多副本选主,数据同步,故障恢复等功能,zookeeper在负载较高的情况下,性能表现不佳,甚至会出现副本无法写入,数据无法同步问题。分析ClickHouse对zookeeper相关的使用,以副本复制流程为例,ck对zookeeper频繁的分发日志、数据交换是引起瓶颈原因之一。

07f9b223f36a9f7385b5eca968631ea2.png图片7.

外界解决通用方案:

重新实现HaMergeTree引擎,降低对zookeeper日志的请求次数并减少存储的数据量,来达到降低对zookeeper的负载。

京东零售:自研基于Raft分布式共识算法的zookeeper替代方案。

4.2.2 资源管控问题

ClickHouse的资源管控能力不够完善,在 insert、select 并发高的场景下会导致执行失败,影响用户体验。这是因为社区版ClickHouse目前仅提供依据不同用户的最大内存控制,在超过阈值时会杀死执行的 query。

外界解决通用方案:开发资源管理组件,将并发、内存、CPU等资源拆分给不同的资源组,同时通过资源组的父子关系实现不同资源组共享部分资源的能力。

0a75cac73459e6d5ac75dc41da94148d.png

b854f5e3ed3cfa2d937fa17934d35374.png

求在看

打造SAAS化服务的会员徽章体系,可以作为标准的产品化方案统一对外输出。结合现有平台的通用能力,实现会员行为全路径覆盖,并能结合企业自身业务特点,规划相应的会员精准营销活动,提升会员忠诚度和业务的持续增长。

底层能力:维护用户基础数据、行为数据建模、用户画像分析、精准营销策略的制定

▪功能支撑:会员成长体系、等级计算策略、权益体系、营销底层能力支持

▪用户活跃:会员关怀、用户触达、活跃活动、业务线交叉获客、拉新促

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值