• 《Clickhouse原理解析与应用实践》1~6章重点回顾章节-读书笔记


    Clickhouse原理解析与应用实践》1~6章重点回顾章节-读书笔记

    个人github笔记链接

    这里只列举前6章节的内容,因为后面章节的内容,需要对前面的知识内容有一定的熟悉后,才好理解,这里列出来无意义。

    前6章节就能够大致了解ClickHouse整体的存储、读取、写入相关的设计实现。


    基于下面的笔记,个人觉得比较重要的几个知识点概述:

    1. ClickHouse采用多主架构,集群内节点角色对等,天然规避单点问题
    2. ClickHouse支持物理视图,源表的更新会同步到物理视图(除了删除操作,物理视图会保留源表被删除的数据)
    3. ClickHouse的RENAME只支持单个节点内的数据表移动(集群间节点不支持)
    4. ClickHouse仅MergeTree系列表索引支持数据分区
    5. ClickHouse以分区目录为单位进行数据删除与修改(Mutation),该异步操作不支持事务,无法回滚。被删除的数据在下次合并动作被触发时才会真正物理删除。
    6. ClickHouse每次INSERT都会生成新的分区目录(写入同一个分区也会生成不同的分区目录),后台任务会定时对多个相同分区的分区目录进行合并(或手动执行optimize指令)
    7. ClickHouse的一级索引是稀疏索引实现,常驻内存
    8. ClickHouse的二级索引是跳数索引,由数据的聚合信息构建而成
    9. ClickHouse的写入过程大致流程,先生成分区目录,后按照index_granularity索引粒度,生成primary.idx一级索引(如果声明了二级索引,还会创建二级索引文件),每一列字段的.mrk数据标记和.bin压缩数据文件。
    10. ClickHouse的查询过程大致流程,先通过minmax.idx分区索引寻找需查询的分区,再通过primary.idx一级索引、skip_idx.idx 二级索引筛选数据查询的范围,然后通过.mrk数据标记查找索引对应的.bin数据压缩文件,解压后读取数据。

    2.1.1 完备的DBMS功能

    • 大致了解ClickHouse的能力,判断业务中是否适用ClickHouse

    ClickHouse拥有完备的管理功能,所以它称得上是一个DBMS(Database Management System,数据库管理系统),而不仅是一个数据库。作为一个DBMS,它具备了一些基本功能,如下所示。

    • DDL(数据定义语言):可以动态地创建、修改或删除数据库、表和视图,而无须重启服务。
    • DML(数据操作语言):可以动态查询、插入、修改或删除数据。
    • 权限控制:可以按照用户粒度设置数据库或者表的操作权限,保障数据的安全性。
    • 数据备份与恢复:提供了数据备份导出与导入恢复机制,满足生产环境的要求。
    • 分布式管理:提供集群模式,能够自动管理多个数据库节点。

    2.1.3 向量化执行引擎

    • ClickHouse通过硬件支持的向量化指令,实现数据并行操作。

    数据库计算引擎的优化技术:向量化执行与代码生成 - 知乎 (zhihu.com)

    一个实用的经验告诉我们,存储媒介距离CPU越近,则访问数据的速度越快。
    在这里插入图片描述
    ClickHouse利用SSE4.2指令集实现向量化执行。

    2.1.6 多线程与分布式

    相比基于底层硬件实现的向量化执行SIMD,线程级并行通常由更高层次的软件层面控制。现代计算机系统早已普及了多处理器架构,所以现今市面上的服务器都具备良好的多核心多线程处理能力。由于SIMD不适合用于带有较多分支判断的场景,ClickHouse也大量使用了多线程技术以实现提速,以此和向量化执行形成互补

    在各服务器之间,通过网络传输数据的成本是高昂的,所以相比移动数据,更为聪明的做法是预先将数据分布到各台服务器,将数据的计算查询直接下推到数据所在的服务器。

    ClickHouse在数据存取方面,既支持分区(纵向扩展,利用多线程原理),也支持分片(横向扩展,利用分布式原理),可以说是将多线程和分布式的技术应用到了极致

    2.1.7 多主架构

    ​ HDFS、Spark、HBase和Elasticsearch这类分布式系统,都采用了Master-Slave主从架构,由一个管控节点作为Leader统筹全局。

    ​ 而ClickHouse则采用Multi-Master多主架构,集群中的每个节点角色对等,客户端访问任意一个节点都能得到相同的效果。

    这种多主的架构有许多优势,例如对等的角色使系统架构变得更加简单,不用再区分主控节点、数据节点和计算节点,集群中的所有节点功能相同。所以它天然规避了单点故障的问题,非常适合用于多数据中心、异地多活的场景。

    2.2 ClickHouse的架构设计

    篇幅较长,建议阅读书籍原文。该章节大致介绍了ClickHouse代码的数据结构设计。

    ClickHouse按列存储数据,内存中的一列数据由一个Column对象表示。

    下图中从下到上,

    • Columns:ClickHouse数据存储结构
    • DataTypes:负责数据的序列化/反序列化,读取数据前需将其转换成Column或Field对象
    • Functions:普通函数和聚合函数,函数执行同样采用向量化方式直接作用一列数据
    • Storages:数据表底层实现中没有Table对象,取而代之的是IStorage接口,代指数据表
    • Interperters:解释器,解释AST,构造查询执行通道
    • Parsers:分析器,创建AST(抽象语法树)对象
    • Server:ClickHouse服务实例
      在这里插入图片描述

    4.2.4 临时表

    CREATE TEMPORARY TABLE [IF 
    • 相关阅读:
      SpringBoot2.6 升级到springBoot2.7 H2,JPA,Security问题
      React脚手架配置axios代理 (1.配置在package.json, 2.配置在setupProxy.js)
      PCR/qPCR研究:Lumiprobe丨dsGreen 用于实时 PCR
      【无标题】django中logging配置
      C语言学习笔记02
      【图灵MySQL】深入理解MVCC与BufferPoll缓存机制
      ClamAV 部署
      qt响应全局热键
      人工智能之机器学习
      c语言数据结构 排序(三)
    • 原文地址:https://blog.csdn.net/Ashiamd/article/details/126969788