Clickhouse原理解析
OLAP常见架构
OLAP名为联机分析(豆腐分析)
下钻(豆腐下钻)
从“省”下钻到“市”上卷(豆腐上卷)
从“市”汇聚成“省”切片(豆腐切片)
将一个或多个维度设为单个固定值,然后观察剩余的维度切块(豆腐切块)
将商品维度固定成“足球”“篮球”和“乒乓球”旋转(豆腐旋转)
旋转立方体的一面,如果要将数据映射到一张二维表,那么就要进行旋转,这就等同于行列置换。ROLAP
直接使用关系模型构建,数据模型常使用星型模型或者雪花模型。MOLAP
使用多维数组的形式保存数据,其核心思想是借助预先聚合结果HOLAP
这种思路可以理解成ROLAP和MOLAP两者的集成LSM
首先,会在内存中构建出一棵小树,构建完毕即算写入成功(这里会通过预写日志的形式,防止因内存故障而导致的数据丢失)(景区多个门口排队,进入景区,每个人都有凭证)其次,小树在构建的过程中会进行排序,这样就保证了数据的有序性(基于个头排序)最后,当内存中小树的数量达到某个阈值时,就会借助后台线程将小树刷入磁盘并生成一个小的数据段。在每个数据段中,数据局部有序(进入游戏项目1继续按个头排队)ClickHouse不适用的场景
不支持事务不擅长根据主键按行粒度进行查询不擅长按行删除数据并发不高大表join核心特性
在线查询完备的DBMS功能
DDL(数据定义语言)DML(数据操作语言)权限控制数据备份与恢复分布式管理列式存储与数据压缩
网络带宽|/磁盘IO|/向量化执行引擎
向量化执行,需要利用CPU的SIMD指令ClickHouse目前利用SSE4.2指令集实现向量化执行多样化的表引擎多线程与分布式
支持分区(纵向扩展,利用多线程原理)支持分片(横向扩展,利用分布式原理)多主架构数据分片与分布式查询clickhouse的架构设计
Column与Field(字段和单值)DataType(数据类型)
序列化反序列化Block与Block流(数据块)
数据对象
Column数据类型
DataType列名称Table(表)IStorage接口(表引擎)
IStorageSystemOneBlock(系统表)StorageMergeTree(合并树表引擎)StorageTinyLog(日志表引擎)Parser与Interpreter(解析)
Parser分析器负责创建AST对象Interpreter解释器则负责解释AST,并进一步创建查询的执行管道Functions与Aggregate Functions(函数)
普通函数和聚合函数Cluster与Replication(集群和副本)
ClickHouse的1个节点只能拥有1个分片分片只是一个逻辑概念,其物理承载还是由副本承担的客户端访问接口ClickHouse
CLI(Command Line Interface)即命令行接口
TCP传输层JDBC
HTTP应用层 ClickHouse的数据类型
基础类型
数值类型
IntFloatDecima字符串类型
StringFixedString
空字符填充UUID
格式为8-4-4-4-12时间类型
DateTimeDateTime64Date复合类型
数组元组枚举嵌套特殊类型
Nullable
基础数据类型可以是Null值Domain
IPv4IPv6数据字典
内置字典外部扩展字典MergeTree原理(找书模型)
MergeTree的存储结构
checksums.txt:校验文件,使用二进制格式存储
完整性正确性columns.txt:列信息文件,使用明文格式存储count.txt:计数文件,使用明文格式存储primary.idx:一级索引文件,使用二进制格式存储[Column].bin:数据文件
LZ4压缩格式[Column].mrk:列字段标记文件,使用二进制格式存储
标记文件与稀疏索引对齐,又与.bin文件一一对应partition.dat与minmax_[Column].idx一级索引(按书名字母排序引导牌)
稀疏索引
在稠密索引中每一行索引标记都会对应到一行具体的数据记录。而在稀疏索引中,每一行索引标记对应的是一段数据,而不是一行primary.idx内的索引数据常驻内存索引粒度
一级索引和数据标记的间隔粒度相同(同为index_granularity行)数据文件也会依照index_granularity的间隔粒度生成压缩数据块索引数据的生成规则
1 819257 80 =>>>5780索引的查询过程
MarkRange(数据治理开头是sjzl)
mark = 0 1 2row = 1 2 3==>markrange [0,1]:[1,2]生成查询条件区间(比如找数据治理书)
id=2 ===> [2,2]递归交集判断
除8合并MarkRange区间数据标记 (对齐排序,引导牌 、记录书柜号和几排几行)
数据标记的生成规则
mark压缩块偏移量解压后偏移量数据标记的工作方式
读取压缩数据块读取数据数据存储(书柜)
压缩数据块
头信息
压缩算法类型1byte压缩后的数据大小4byte压缩前的数据大小4byte压缩数据
大小范围
按压缩前大小,控制在64KB~1MB压缩数据块最终的大小
单个批次数据size
继续获取下一批数据单个批次数据64KB
直接生成压缩数据块单个批次数据size>1MB
截断数据分区 (图书分类)
数据的分区规则
不指定分区键
all_0_0_0使用整型
1_0_0_0使用日期类型
20100101_0_0_0使用其他类型
hash128_0_0_0分区目录的命名规则
PartitionID_MinBlockNum_MaxBlockNum_LevelMergeTree系列表引擎
MergeTTL和多路径存储
数据TTL
表列多路径存储策略
默认策略
单磁盘JBOD策略
多磁盘轮询策略
HOT/COLD策略ReplacingMergeTree
功能
数据去重特点
orderby去重分区内去重合并生效SummingMergeTree
数据汇总AggregatingMergeTree
数据聚合CollapsingMergeTree
折叠表
以增代删
有序VersionedCollapsingMergeTree
高级折叠表
以增代删
无序副本和分片
副本
功能
数据备份提高负载
分摊查询读写分离特点
依赖zookeeper
INSERTALTER表级别的副本多主架构Block数据块
128*8192原子性
block要么全部成功,要么全部失败唯一性
hash摘要
block内顺序数据行数据大小ZooKeeper内的节点结构
元数据
metadata
主键分区键采样表达式columns
列名称数据类型replicas
副本名称判断标识
leader_election:用于主副本的选举工作
MERGEMUTATION操作
ALTER DELETEALTER UPDATEblocks
Hash信息摘要partition_idblock_numbers
分区顺序=partition顺序
Merge按序quorum
当至少有quorum数量的副本写入成功后,整个写操作才算成功操作日志
log
INSERTMERGEDROP PARTITIONmutations
alert DELETEalert UPDATEreplicas/{replica_name}
queue:任务队列log_pointer
最后一次执行的log日志下标信息mutation_pointer
最后一次执行的log日志下标信息Entry
LogEntry
source replica
指令来源副本block_id
当前分区的BlockIDpartition_name
当前分区目录的名称type
get
下载分区merge
合并drop partition
删除分区MutationEntry
source replica
指令来源副本commands
ALTER DELETEALTER UPDATEmutation_id
MUTATION操作的版本号partition_id
当前分区目录的IDINSERT的核心执行流程
创建副本实例
创建第一个副本实例
初始化所有的ZooKeeper节点,·在/replicas/节点下注册自己的副本启动监听任务,监听/log日志节点参与副本选举,选举出主副本,选举的方式是向/leader_election/插入子节点,第一个插入成功的副本就是主副本创建第二个副本实例
/replicas/节点下注册自己的副本实例启动监听任务,监听/log日志节点参与副本选举,选举出主副本向第一个副本实例写入数据由第一个副本实例推送Log日志
由执行了INSERT的副本向/log节点推送操作日志第二个副本实例拉取Log日志第二个副本实例向其他副本发起下载请求第一个副本实例响应数据下载第二个副本实例下载数据并完成本地写入MERGE的核心执行流程
由主副本来制定
创建远程连接,尝试与主副本通信主副本接收通信由主副本制定MERGE计划并推送Log日志各个副本分别拉取Log日志各个副本分别在本地执行MERGEMUTATION的核心执行流程
推送MUTATION日志所有副本实例各自监听MUTATION日志由主副本实例响应MUTATION日志并推送Log日志各个副本实例分别拉取Log日志各个副本实例分别在本地执行MUTATIONALTER的核心执行流程
修改共享元数据监听共享元数据变更并各自执行本地修改确认所有副本完成修改Distributed表引擎
1)ZooKeeper内的节点结构
clickhouse/task_queue/dd
/query-[seq]/active:临时保存当前集群内状态为active的节点/query-[seq]/finished2)DDLLogEntry日志对象的数据结构
query记录了DDL语句hosts记录了指定集群的hosts主机3)initiator记录初始化host主机的名称,hosts主机列表的取值来自于初始化host节点上的集群外部存储类型
HDFSMySQLJDBCKafkaFile内存类型
Memory表引擎Set
数据不会丢失,当数据表被重新装载时,文件数据会再次被全量加载至内存只能作为IN查询的右侧条件被查询使用JoinBuffer日志类型
TinyLog接口类型
DictionaryDistributedSQL优化规则
1、count优化
count() 和 count(*) 且没有过滤条件,会使用system.tables 的 total_rows2、消除子查询重复字段3、谓词下推:
当 group by 有 having 子句,但是没有 with cube、with rollup 或者 with totals 修饰的时候,having 过滤会下推到 where 提前过滤4、聚合计算外推
select sum(id * 2) === > select sum(id)*25、删除重复的 group (ordelimit)by key



