「从ES到CK 02」Clickhouse的基础知识扫盲
  EDk3t64ONTxS 2023年12月12日 26 0

导航

在完成将公司日志数据从Elasticsearch(下称ES)转战到Clickhouse后,个人认为有必要将过程记录分享。限于篇幅及便于分类组织,我会以一个系列文章的形式记录:

  • 01 《Elasticsearch vs Clickhouse
  • 02 《Clickhouse的基础知识扫盲》
  • 03《Clickhouse多分片多副本集群部署》(敬请期待)

「从ES到CK 02」Clickhouse的基础知识扫盲_列式数据库

一、CLickhouse 是什么

ClickHouse是俄罗斯Yandex公司于2016年开发,是一个用于OLAP的列式数据库管理系统(DBMS)。

存储形式

优点

缺点

业界代表

行式

  • 针对行的查询
  • 一致性、事务性强
  • 适合频率较高delete/update 


  • 针对列的查询
  • 存储成本高
  • 不利于聚合操作 

Mysql、sql server等

列式

  • 针对列的查询
  • 压缩率高(值近似、类型一致),存储成本低
  • 单表海量数据查询/分析效率高、速度快 
  • 针对行的查询
  • 一致性、事务性弱
  • 不适合频率较高delete/update
  • 多表关联查询

Clickhouse、SAP HANA等


二、为什么选择CLickhouse


  • 数据压缩

支持多种压缩算法,在磁盘空间和cpu的消耗之间达到相对平衡


  • 顺序读写

通过预排序、定期合并排序,巧妙的转化为顺序读写,大大提升吞吐量和查询效率


  • 多核心并行处理

ClickHouse会使用服务器上一切可用的资源,从而以最自然的方式并行处理大型查询


  • 支持通用SQL

在大多数情况下遵循ANSI SQL标准 


三、CLickhouse 基础知识科普

1、架构层面

(1)分片

  • 数据读取由分布式表从所有分片获取数据,作并行处理后返回客户端
  • 数据写入有2种方式: 1、直接写入本地表,通过外部负载均衡实现数据平均分布 2、通过分布式表写入,利用sharding_key实现数据平均分布, 支持如下分片方式:

分片方式

说明

random随机分片

写入数据会被随机分发到分布式集群中的某个节点上

constant固定分片

写入数据会被分发到固定一个节点上

column value分片

按照某一列的值进行hash分片

自定义表达式分片

指定任意合法表达式,根据计算后的值进行hash分片

(2)副本

  • Clickhouse 使用 zookeeper(请使用3.4.5或以上版本)存储副本的元信息
  • 副本是表级别的,不是服务器级别的。所以服务器里可以同时有复制表和非复制表
  • 只有MergeTree 系列里的表可支持副本
  • INSERT和ALTER语句会被复制
  • 复制方式是多主异步的 


2、表引擎

(1)合并树家族(MergeTree)

合并树家族(MergeTree)是Clickhouse内适用于高负载任务的最通用和功能最强大的表引擎,基于MergeTree还衍生出十多种具备不同特性的表引擎,下文会重点介绍MergeTree。日志平台选用的是ReplicatedMergeTree,以实现数据副本复制

(2)集成的表引擎

支持直接从Hive、S3、RabbitMQ、kafka、mysql等14种常见的数据源同步数据 

(3)特殊的表引擎

  • 分布式表:本身不存储数据,读取时可在多个服务器进行分布式查询,自动并行后返回。写入时可通过sharding_key将数据写入各个shard
  • 物化视图:功能类似于数据库视图

3、表结构(MergeTree)

(1)索引

  • 一级索引(稀疏索引):将每列数据按照 index granularity(默认8192行)进行划分,查询时用二分法查找数据。因此,应尽量选用区分度低的字段
  • 二级索引(跳数索引):跳数索引是指数据片段按照粒度(index_granularity)分割成小块后,将一定数量(granularity_value)的小块按照一定规则组合成一个新的块,对这个新的块写入索引信息 

(2)主键

主键值不是唯一的,且主键必须是 order by 字段的前缀字段。主键索引采用的是稀疏索引。

(3)排序(必填)

MergeTree 中唯一一个必填项,它设定了分区内的数据按照哪些字段顺序进行有序保存,应根据字段使用频率、优先级,由高至低组合,在没有显式设置主键的情况下,order by 字段即主键。 

(4)压缩方式

  • LZ4:默认的压缩方式,压缩/解压性能极强,但压缩率一般
  • ZSTD[(level)]:默认level为1。压缩/解压性能不如LZ4,但压缩率比LZ4高,常用于字符串类型

(5)分区

分区是在一个表中通过指定的规则划分而成的逻辑数据集。分区的目的主要是降低扫描的范围,避免全表扫描,优化查询速度,一般按月、日或事件类型来划分。但要避免过于精细的分区方案,以免影响整体性能。 

(6)数据生命周期

支持字段、表级别的TTL。当字段的值过期时,会替换成该字段的默认值,当该字段所有值过期,会自动删除此字段;当表中的数据行过期时,会自动删除对应行


四、Clickhouse的配套组件

  • zookeeper

负责存储表的元数据,用于副本复制

  • chproxy

负责Clickhouse节点的负载均衡,可实现读写分离

  • clickvisual

目前市面上唯一一款支持clickhouse的类kibana的业务日志查询平台,支持日志查询、聚合、告警


五、CLickhouse部署架构参考

下图为1分片2副本的架构图:

「从ES到CK 02」Clickhouse的基础知识扫盲_CLickhouse_02

六、参考文档

  • Clickhouse

https://clickhouse.com/docs/zh

  • Chproxy

https://www.chproxy.org/cn

  • Clickvisual

https://clickvisual.gocn.vip/


下回预告

CLickhouse多分片多副本集群的详细部署过程,欢迎关注后续更新的系列文章~

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月12日 0

暂无评论