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

导航

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

  • 01 《Elasticsearch vs Clickhouse》
  • 02 《Clickhouse的基础知识扫盲》
  • 03 《​Clickhouse多分片多副本集群部署​》
  • 04 《​​Clickhouse表引擎选择和表结构设计​》
  • 05 《​clickhouse高效数据处理工具vector​》
  • 06 《​​​​​​​​​clickhouse的数据可视化工具clickvisual​》(敬请期待)
  • 07 《kibana自定义插件跳转clickvisual》(敬请期待)
  • 08 《妙用clickvisual api实现用户自动管理》(敬请期待)

「从ES到CK 02」Clickhouse的基础知识扫盲_第1张图片

一、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)]:压缩/解压性能不如LZ4,但压缩率比LZ4高,常用于字符串类型。默认level为1,支持1-22,数字越大压缩率越高,但压缩/解压消耗的cpu、io资源就越多,可结合实际情况设置level值,在cpu资源和磁盘空间之间达到相对平衡
(5)分区

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

(6)数据生命周期

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

四、Clickhouse的配套组件

  • zookeeper

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

  • chproxy

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

  • clickvisual

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

五、CLickhouse部署架构参考

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

「从ES到CK 02」Clickhouse的基础知识扫盲_第2张图片

六、参考文档

  • Clickhouse

        ​​https://clickhouse.com/docs/zh​​

  • Chproxy

        ​​https://www.chproxy.org/cn​​

  • Clickvisual

        ​​https://clickvisual.gocn.vip/​​

下回预告

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

你可能感兴趣的:(日志解决方案,elasticsearch,clickhouse)