首页 > 其他分享 >「从ES到CK 04」Clickhouse表引擎选择和表结构设计

「从ES到CK 04」Clickhouse表引擎选择和表结构设计

时间:2023-12-19 16:02:24浏览次数:53  
标签:CK 引擎 String 04 ZSTD nanosecond 和表 CODEC Clickhouse

导航

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

「从ES到CK 04」Clickhouse表引擎选择和表结构设计_clickhouse

一、表引擎选择

在系列文章《Clickhouse的基础知识扫盲》也有提到过,合并树(MergeTree)系列的表引擎被誉为Clickhouse 中最强大的表引擎,其中MergeTree引擎作为其系列内其他表引擎的基础,具有如下特性:

存储的数据按主键排序

支持分区

支持数据副本

支持数据采样


在继承MergeTree引擎特性的基础上,衍生出如下各有特色的表引擎,满足不同场景的需求:

表引擎

说明

SummingMergeTree该引擎继承自 MergeTree。区别在于,当合并SummingMergeTree表的数据片段时,ClickHouse会把所有具有相同主键的行合并为一行,该行包含了被合并的行中具有数值数据类型的列的汇总值。如果主键的组合方式使得单个键值对应于大量的行,则可以显著的减少存储空间并加快数据查询的速度。
ReplacingMergeTree

会删除排序键值相同的重复项以节省空间,但是它不保证没有重复的数据出现

AggregatingMergeTree

一般用来做增量数据的聚合统计,包括物化视图的数据聚合。

CollapsingMergeTree引擎继承于 MergeTree,并在数据块合并算法中添加了折叠行的逻辑
VersionedCollapsingMergeTree
擎继承自 MergeTree 并将折叠行的逻辑添加到合并数据部分的算法中
GraphiteMergeTree

该引擎用来对 Graphite数据进行瘦身及汇总

Replicated*

数据副本,支持:

  • ReplicatedMergeTree
  • ReplicatedSummingMergeTree
  • ReplicatedReplacingMergeTree
  • ReplicatedAggregatingMergeTree
  • ReplicatedCollapsingMergeTree
  • ReplicatedVersionedCollapsingMergeTree
  • ReplicatedGraphiteMergeTree


在结合我司日志平台的实际场景后,选用了ReplicatedMergeTree引擎存储完整的日志数据~

二、表结构设计

在系列文章《Clickhouse的基础知识扫盲》也有提到过表结构的相关概念,话不多说直接上DDL,以java日志的表结构为例:

CREATE TABLE elk.java_log_local
(
    `service_name` String CODEC(ZSTD(1)),
    `server_ip` String CODEC(ZSTD(1)),
    `sys_code` String CODEC(ZSTD(1)),
    `env_type` String CODEC(ZSTD(1)),
    `class_name` String CODEC(ZSTD(1)),
    `log_level` String CODEC(ZSTD(1)),
    `thread` String CODEC(ZSTD(1)),
    `_time_nanosecond_` DateTime64(3, 'Asia/Shanghai'),
    `msg` String CODEC(ZSTD(1)),
    `exception` String CODEC(ZSTD(1)),
    `traceId` String CODEC(ZSTD(1)),
    `spanId` String CODEC(ZSTD(1)),
    INDEX idx_msg msg TYPE tokenbf_v1(30720, 2, 0) GRANULARITY 1
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/java_log', '{replica}')
PARTITION BY toYYYYMMDD(_time_nanosecond_)
ORDER BY (_time_nanosecond_, sys_code, env_type, service_name)
-- TTL toDateTime(_time_nanosecond_) + toIntervalDay(14)
SETTINGS storage_policy = '51cto', index_granularity = 8192;


表结构设计说明:

属性

语句

说明

索引

INDEX idx_msg msg TYPE tokenbf_v1(30720, 2, 0) GRANULARITY 1

msg字段为日志详情,涉及长文本模糊匹配的场景,故针对该字段建立跳数索引

主键

-

排序(必填)

ORDER BY (time_nanosecond, sys_code, env_type, service_name)

结合业务场景,根据字段使用频率、优先级,由高至低组合

压缩方式

CODEC(ZSTD(1))

此处选用字符串字段常用的ZSTD压缩算法,压缩级别为1

分区

PARTITION BY toYYYYMMDD(time_nanosecond)

此处选用日期作为分区依据,注意避免过于精细的分区方案,以免影响整体性能

数据生命周期

TTL toDateTime(time_nanosecond) + toIntervalDay(14)

考虑到生命周期可能会根据实际情况而变动,在生产环境中我选用move/delete partition的方式来控制数据生命周期。因为ttl值设定后修改,会引发全表扫描,故设计表结构时需考虑清楚是否引入ttl设置

存储策略

storage_policy = '51cto'

此处采用多级存储,将数据按策略分别存在ssd、hdd和oss,具体可参考《Clickhouse多分片多副本集群部署


三、参考资料

  • Clickhouse

https://clickhouse.com/docs/zh


下回预告

由于logstash消耗的资源较高,在日志平台转战clickhouse后,引入了高效数据处理工具vector,欢迎关注后续更新的系列文章~

标签:CK,引擎,String,04,ZSTD,nanosecond,和表,CODEC,Clickhouse
From: https://blog.51cto.com/u_15104381/8890443

相关文章

  • springboot 记录使用log4j与logback发送日志到syslog服务器
    Linux服务器配置编辑/etc/rsyslog.conf文件。(我的在这里,根据自己系统查看)#取消注释这几行$ModLoadimudp$UDPServerRun514#ProvidesTCPsyslogreception$ModLoadimtcp$InputTCPServerRun514..........#末位追加:local2.info/var/log/login_info.log......
  • ubuntu 18.04.6编译uboot提示error: bad value (‘generic-armv7-a’) for ‘-mtune=
    按照按照  (https://rocketboards.org/foswiki/Documentation/EmbeddedLinuxBeginnerSGuide)制作了一个image当编译uboot的时候,发送命令make:makesocfpga_cyclone5_configmake 得到提示:cc1:error:badvalue(‘generic-armv7-a’)for‘-mtune=’switchcc1:note:va......
  • 使用RocketMQ实现消息顺序消费
    消息的顺序消费在很多交易型的业务场景中都会被要求实现,而且,消息队列的顺序消费解决方案在很多互联网公司的面试中经常会被问到。索尔老师在使用了多个消息队列后发现,虽然每个消息队列都有各自的顺序消费解决方案,但是RocketMQ经过了多年电商的洗礼,其功能性的要求,已经设计的非常全面......
  • [ABC315G] Ai + Bj + Ck = X (1 <= i, j, k <= N) 题解
    原题链接:ABC315G前置知识:扩展欧几里得算法。如果还不会扩欧的话,建议先去做这道题。题意给定\(n,a,b,c,k\)。求有多少个\(x,y,z(x,y,z\len)\)满足\(ax+by+cz=k\)。思路首先看到题目给出的方程式:\(ax+by+cz=k\)。我们会发现很像扩欧板子中的:\(ax+by=k\)。只不过又多了一......
  • Maix II Dock 的USB OTG 及USB UART 测试
    1、通过USBOTG接口实现ADB的终端交互①、使用typeC数据线连接电脑和MaixIIDock板卡的USBOTG接口②、电脑弹窗并识别MaixIIDock板卡为一个“U盘”,如果提示U盘驱动有问题,请忽略。          ③、进入U盘可以看到对应的配置文件及一个app执......
  • 界面控件DevExpress WPF Dock组件,轻松创建类Visual Studio窗口界面!
    本文主要为大家介绍DevExpressWPF控件中的Dock组件,它能帮助用户轻松创还能受MicrosoftVisualStudio启发的Dock窗口界面。P.S:DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用......
  • Docker启动Nacos报错:Nacos Server did not start because dumpservice bean construct
    一、表象重启服务器之后Docker运行Nacos容器,启动成功,但是外网无法访问。查看了一下Nacos启动日志(dockerlogsnacos容器名)二、分析很明显是数据库配``置问题。。如果是数据库配置的问题,可以着重检查以下信息尤其是MySQL内网Host,查询方式见Docker安装Nacos三、解决我已......
  • 怎么使用docker搭建普罗米修斯监控
    普罗米修斯教程参考https://www.cnblogs.com/minseo/category/1688718.html本文介绍怎么使用docker搭建系统和软件版本#cat/etc/redhat-releaseCentOSLinuxrelease7.9.2009(Core)[root@CentOS7K8SHarbor061~]#uname-aLinuxCentOS7K8SHarbor0613.10.0-1160.102.......
  • docker安装openjdk并运行jar包的操作方法
    下载镜像dockerpullopenjdk创建数据卷创建一个java_app的数据卷dockervolumecreatejava_app将jar包上传到/var/lib/docker/volumes/java_app/_data/下,然后启动镜像启动镜像dockerrun--name=javaApp--restart=always--network=host\-vjava_app:/usr/src/m......
  • springboot045新闻推荐系统-计算机毕业设计源码+LW文档
    摘要随着信息互联网购物的飞速发展,国内放开了自媒体的政策,一般企业都开始开发属于自己内容分发平台的网站。本文介绍了新闻推荐系统的开发全过程。通过分析企业对于新闻推荐系统的需求,创建了一个计算机管理新闻推荐系统的方案。文章介绍了新闻推荐系统的系统分析部分,包括可行性分......