架构探索之路-第一站-clickhouse

这篇具有很好参考价值的文章主要介绍了架构探索之路-第一站-clickhouse。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

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

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

二、Clickhouse简介

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

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

三、Clickhouse架构原理

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

1. 引子

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

  1. 磁盘读取数据到内存
  2. 内存中解析数据匹配结果返回

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

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

2. 架构

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

2.1 列式存储

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

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

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

2.2 block

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

2.3 LSM

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

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

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

  1. 每一批次数据写入,先记录日志, 保证高可用机制
  2. 记录日志之后存入内存排序, 后将有序结果写入磁盘,记录合并次数Level=0
  3. 定期将磁盘上Level=0或1的文件合并,并标记删除. 后续物理删除

2.4 索引

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

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

2.5 向量化执行

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

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

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

四、Clickhouse总结

1. clickhouse的舍与得

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

  • 高频次实时写入方面, 因ck会将批量数据直接落盘成小文件, 高频写入会造成大量小文件生成与合并, 影响查询性能. 所以ck官方也是建议大批低频的写入, 提高写入性能. 实际场景中建议在业务与数据库之间引入一层数据缓存层,来实现批量写入
  • 查询并发问题, clickhouse是采用并行处理机制, 即一个查询也会使用一半cpu去执行, 在安装时会自动识别cpu核数, 所以在发挥查询快的优势下, 也带来了并发能力的不足. 如果过多的查询数堆积达到max_concurrent_queries阈值, 则会报出too many simultaneous queries异常, 这也是ck的一种限流保护机制. 所以日常使用过程中注意慢sql的排查, 并发请求的控制是保证ck高可用的关键.

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

2. clickhouse在实际生产中遇到的问题

2.1 zookeeper高负载影响

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

解决通用方案:

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

2.2 资源管控问题

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

易观性能对比: https://zhuanlan.zhihu.com/p/54907288

官网性能对比: https://clickhouse.com/

作者:京东科技 李丹枫

来源:京东云开发者社区 转载请注明来源文章来源地址https://www.toymoban.com/news/detail-746645.html

到了这里,关于架构探索之路-第一站-clickhouse的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 探索Xiotman:物联网软件架构的创新之路

    🚀🚀众所周知,物联网是当今科技领域的一个热门话题,它指的是 通过互联网将各种物理设备、传感器、终端等连接起来,实现信息的交换和通信 。物联网的应用场景非常广泛,涉及智能家居、智能城市、智能医疗、智能工业等领域。然而,物联网终端应用的开发也面临着

    2024年02月09日
    浏览(38)
  • 猫头虎分享: 探索软件系统架构的革新之路

    博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接 : 🔗 精选专栏 : 《面试题大全》 — 面试准备的宝典! 《IDEA开发秘籍》 — 提升你的IDEA技能! 《100天精通鸿蒙》 — 从Web/安卓到鸿蒙大师! 《100天精通Golang(基础入门篇)》 — 踏入

    2024年02月22日
    浏览(77)
  • 探索LLaMA模型:架构创新与Transformer模型的进化之路

    在人工智能和自然语言处理领域,预训练语言模型的发展一直在引领着前沿科技的进步。Meta AI(前身为Facebook)在2023年2月推出的LLaMA(Large Language Model Meta AI)模型引起了广泛关注。LLaMA模型以其独特的架构设计和对Transformer模型的有效改进,展示出在各种自然语言任务上的卓

    2024年04月28日
    浏览(47)
  • 探索容灾架构演进之路-从单点到异地多活

    在公司发展初期,业务发展和用户增长是首要关注的焦点。然而,随着业务规模不断扩大,用户数量逐渐攀升,应用稳定性的重要性也变得愈发凸显。在这个演进过程中,传统架构下的应用部署模式开始显露出多方面的稳定性风险,其中最为显著的问题之一就是机房单点故障

    2024年02月05日
    浏览(56)
  • 架构师成长之路Redis第一篇|Redis 安装介绍以及内存分配器jemalloc

    Redis官网:https://redis.io/download/ 下载安装二进制文件 可下载安装最新版Redis7.2.0,或者可选版本6.x 我这里下载6.2.13和7.2最新版本,后面我们都是安装6.2.13版本的信息进行讲解 二进制文件安装步骤 安装前期准备: 安装gcc yum install gcc 压缩文件 tar -xzf redis6.2.13.tar.gz 编译 cd redis-x

    2024年02月11日
    浏览(48)
  • AI大模型探索之路-应用篇17:GLM大模型-大数据自助查询平台架构实践

    在众多大型企业中,数据资产庞大无比,因此它们纷纷构建了多种大数据平台。然而,关键在于如何高效地利用这些数据,例如,将数据有效地提供给产品经理或数据分析师以供他们进行设计和分析。在传统工作流程中,由于这些角色通常不是技术专家,他们往往无法直接使

    2024年04月22日
    浏览(87)
  • 【自制视频课程】C++OpnecV基础35讲——第一章 前言

            首先,opencv是一个广泛使用的计算机视觉库,它提供了丰富的图像处理和计算机视觉算法,可以帮助我们快速地开发出高质量的图像处理应用程序;         其次,opencv是一个开源库,可以免费使用和修改,这为我们提供了一个学习和研究计算机视觉的良好平

    2024年02月05日
    浏览(51)
  • 从零开始理解Linux中断架构(1)-前言

    前言         前段时间在转行手撸WIFI路由器,搞wifi路由器需要理解网络驱动程序,以太网卡驱动程序,无线WIFI驱动程序,而网卡驱动的关键路径就在中断程序中,需要了解NIC设备驱动程序如何收发数据,为了彻底的知道数据包是如何二层传递上来的,又需要了解一点Lin

    2024年02月09日
    浏览(54)
  • 探索ClickHouse——连接Kafka和Clickhouse

    可以从https://downloads.apache.org/kafka/下找到希望安装的版本。需要注意的是,不要下载路径包含src的包,否则会报“Classpath is empty”之类的错误。 配置kafka 将下面这行加入文件的末尾 同时修改log的路径 创建zookeeper service 将下面内容填入上述文件中 创建kafka service 将下面内容填

    2024年02月07日
    浏览(49)
  • 探索区块链世界:LearnBlockchain - 一站式学习资源

    项目地址:https://gitcode.com/xilibi2003/learnblockchain 在数字化的世界中,区块链技术以其去中心化、安全和透明的特性,正在引领一场变革。如果你正打算踏入这一领域或希望深化你的区块链知识,那么我强烈推荐你访问并使用 LearnBlockchain 项目。这是一个开放源代码的在线平台,

    2024年04月09日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包