16.ClickHouse之存储设计| 青训营笔记

245 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天

表定义和结构

  • 分布式表:不存储数据,用于将查询路由到集群的各个节点
    • cluster: 逻辑集群,由多个节点组成
    • shard_key: 指导数据写入分布式表时的分布方式
  • 本地表:实际存储数据的表
  • 集群架构 image.png
  • 引擎架构 image.png

存储架构

  • 存储架构 image.png image.png
    • part和partition
      • part是物理文件夹的名字
      • partition是逻辑结构 image.png
    • part和column
      • 每个column都是一个文件
      • 所有的column文件都在自己的part文件夹下
    • column和index
      • 一个part有一个主键索引
      • 每个column都有列索引 image.png

索引设计

  • 索引设计
    • Hash Index
      1. 将输入的key通过一个HashFunction映射到一组bucket上
      2. 每个bucket都包含一个指向一条记录的地址
      3. 哈希索引在查找的时候只适用于等值比较 image.png
    • B-Tree
      1. 数据写入是有序的,支持增删查改
      2. 每个节点有多个孩子节点
      3. 每个节点都按照升序排列key值
      4. 每个key有两个指向左右孩子节点的引用
        • 左孩子节点保存的key都小于当前key
        • 右孩子节点的保存的key都大于当前key image.png
    • B+Tree
      • 所有的数据都存储在叶子节点,非叶子节点只保存key值
      • 叶子节点维护到相邻叶子节点的引用
      • 可以通过key值做二分查找,也可以通过叶子节点做顺序访问 image.png
      • 对于大数据量,B(B+)-Tree深度太高
      • 索引数据量太大,多个列如何平衡查询和存储
      • OLAP场景写入量非常大,如何优化写入
    • Log-structured merge-tree (LSM tree)是一种为大吞吐写入场景而设计的数据结构
      • 着重优化顺序写入
      • 主要数据结构
      1. SSTables
        1. Key按顺序存储到文件中,称为segment
        2. 包含多个segment
        3. 每个segment写入磁盘后都是不可更改的,新加的数据只能生成新的segment image.png
      2. Memtable
        1. 在内存中的数据保存在memtable中,大多数实现都是一棵Binary search tree
        2. 当memtable存储的数据到达一定的阈值的时候,就会按顺序写入到磁盘

参考

​​‍​⁢⁣⁣‍​‌‍​‬​‬⁢​⁣⁤⁡⁣⁡⁣⁢​⁢​‬‌​​⁤‬⁤​⁡⁣​​‌⁢‍第五届青训营 ClickHouse-你没见过的列存储.pptx - 飞书云文档 (feishu.cn)