报名参加CloudWeGo黑客松,奖金直推双丰收! 了解详情
写点什么

从 ES 到 CK:信息技术发展的新浪潮

  • 2023-11-07
    北京
  • 本文字数:2076 字

    阅读完需:约 7 分钟

大小:1.06M时长:06:09
从ES到CK:信息技术发展的新浪潮

背景


Bonree ONE 是博睿数据发布的国内首个一体化智能可观测平台。会话数据是 Bonree ONE 平台重要的业务模块,在切换到 Clickhouse 之前是基于 ElasticSearch 进行存储的。ElasticSearch(下文简称 ES)是一种基于 Lucene 的分布式全文搜索引擎,主要使用场景在全文检索方向。

ES 存储会话数据的痛点


会话数据的写入量很大,而且涉及一些联动数据,比如基于对象存储的快照数据,查询效率要求在秒级到亚秒级返回,在日志场景,ES 存在以下痛点:


  • 写入同步慢、写入效率差,业务写入会话数据到 ES 的同时,相关联的快照数据写入对象存储系统,相对于快照数据的写入时间,ES 数据写入返回响应需要等待至少亚秒级的延迟,导致产品上会有查询不到数据的现象,影响体验。

  • 数据占用存储多,压缩不好,随着数据量的上涨,成本会越来越高。

  • 查询效率低,海量数据近 30 天经常查不出来。

  • 维护成本高,IO 资源开销大,尤其私有化混部场景,对部署在同一个机器上的其他组件,影响较大。


ES 存在的诸多问题,使得我们迫切寻找一个新的存储方案来进行升级,解决写入和查询的性能问题以及集群管理。

为什么选择 Clickhouse


新的存储方案需要具备高写入吞吐、高读取效率、集群管理方便的特点。


  • 写入效率:Clickhouse 写入可以达到 100M/秒,同时在延迟性上,受攒批效率的影响,实现了亚秒级别的数据写入延迟,而且稳定性相对于 ES 来说更强。在 ES 里,随着数据量积累增加,索引的更新成本是在逐步增长的相对的,写入稳定性也在受影响。

  • 读取效率:在会话场景里,业务查询数据的时间范围以及对应的统计分析都是不确定的,Clickhouse 基于高频查询确认主键字段,基于常用高优查询指定索引等优化手段,保证查询效率稳定。而 ES 在应对非固定查询的场景下,会占用大量内存,同时由于索引块换入换出的问题,会引起 IO 较高的问题。

  • 集群管理:我们自研了 Clickhouse 集群的管理平台,支持对 Clickhouse 服务的数据写入、读取、节点状态等的监控,以及常用运维操作,比如扩缩容、数据均衡等。在 ES 的集群管理上,没有足够的手段覆盖到监控、数据迁移等运维操作。

  • 易用性:Clickhouse 基于 sql 查询,业务接入直接基于 jdbc 的方式或者 http 的方式就可以直接使用。在 ES 中,大段的 Json 格式的查询,有一定的学习门槛。

基于 ES 存储数据的架构如下:


基于 Clickhouse 存储会话的架构如下:



使用基于 Clickhouse 的方式进行存储,实现了多租户管理、查询资源管控、业务写入追踪和个性化调优等手段,让业务在写入效率和查询效率上提升明显。

Clickhouse 关键的参数调优


  • parts_to_throw_insert:表分区之中活跃 part 数目超过多少,会抛出异常。针对不同的业务量,这个数字应该是不同的,用来保证相应的资源匹配相应的写入量级。

  • max_threads:用于控制一个用户的查询线程数。

  • max_execution_time:单个查询最大执行时间。一般跟业务相关,是业务可容忍的最大查询时间。

  • background_pool_size:表引擎操作后台的线程数。太大会影响 cpu 资源,太小会影响 parts 数量,从而可能触发 parts_to_throw_insert 的异常。

  • max_memory_usage:单个查询最多能够使用的内存大小,应对不同的硬件配置以及不同的用户会配置不同的内存大小。

遇到了哪些问题


问题一:too many parts


当写入超过 Clickhouse 服务承受的上限的时候,就会出现 too many parts 异常。这个异常的本意是防止 Clickhouse 服务在超负载的情况下挂掉,同时给维护人一个信号。因此,出现 too many parts 异常的时候,维护人就要关注当前服务是不是遇到超高峰数据的写入了。此时可以关注的指标如下:


  • 当前服务占用的 cpu 是不是超预期了。


关注 merge 任务是不是占满队列,通常写入超预期的情况下,parts 数量也是暴涨,Clickhouse 为了保证查询效率,merge 任务就会暴涨,而 merge 任务是消耗硬件资源的,如果资源不够,merge 任务运行缓慢,就会降低 parts 数量的减少效率,从而导致 parts 数量缓慢增加,当增加到 parts_to_throw_insert 的数值时,就会产生 too many parts 的异常。


  • 关注写入数据攒批的状态,如果写入频繁,单批次数量较小,会导致 parts 数量增长很快,很容易触发到 merge 任务运行的最大值,从而引发 too many parts 异常。


问题二:重启耗时很长


当集群容纳的数据量比较多的时候,Clickhouse 的重启耗时会比较长,通常会达到几十分钟到小时级别不等。重启服务时间过长,对于整个服务的高可用会挑战很大,写入端的稳定性、容错性以及实时性,都会受到挑战。Clickhouse 本身在解决超大容量服务时,也提供了解决方案,即元数据缓存。


效果展示


会话瘦身前-ES

会话瘦身后-CK

效果

数据量

1.3亿

1.3亿

数据量等同,原始数据73GB

实例数

8C32G * 5个

8C32G * 2个

实例数减半以上

磁盘总资源

98G

10.7G

磁盘节省了约89.1%

内存总资源

73.6G

12.2G

内存节省约了83.4%

写入性能

14小时入库完

3.5小时入库完

写入快了4倍

读取性能

存在查询超时的现象

TP99在2S以内

查询效率提升数倍不止



用 Clickhouse 存储会话模块的数据,存储资源节省明显,计算资源同样收益可观,解决了在 ES 存储方案中遇到的性能瓶颈和集群管理问题,同时在易用性上降低了门槛,让业务更加亲和地进行存储切换。


将会话数据从 ES 切换到 Clickhouse,总体运维成本更低,而且提升了写入和查询效率,在用户进行会话数据统计分析和明细时,查询稳定性提升明显,用户体验得到大幅改善。


未来,我们会更加专注 Clickhouse 集群的精细化管理和优化,主要聚焦在以下方向:


  • merge 的效率提升。

  • 存算分离。

  • 高并发查询的优化。


以上三个方向的优化与完善都能够进一步巩固 Clickhouse 集群的稳定性,帮助我们应对更多的业务场景,让业务发展稳中提效。

2023-11-07 16:226270

评论

发布
暂无评论
发现更多内容

2021牛转乾坤:新花样玩转Android组件化架构实践,15K-50K的详细Android学习指南

android 程序员 移动开发

Android - 定位方式,火星坐标系统,一键锁屏,字节Android高工面试

android 程序员 移动开发

读完这些“Java技术栈”,拿下阿里Offer没问题

Java MySQL spring 程序员 JVM

Android 6,android网络开发技术实战详解

android 程序员 移动开发

Anaconda详细安装及使用教程,阿里P8大牛亲自教你

android 程序员 移动开发

2021疫情下Android技术人的宅家学习进阶指南!花了大价钱大厂内部买来的学习资料,爱看不看

android 程序员 移动开发

分布式服务下,消息中间件改造

kafka 架构 RocketMQ RabbitMQ 中间件

Andoird中LiveEventBus的使用——用LiveEventBus替代RxBus

android 程序员 移动开发

Androdid Droid Fu介绍(1),万字Android技术类校招面试题汇总

android 程序员 移动开发

2021新鲜面经,蚂蚁内部转岗Android面试分享,深夜思考

android 程序员 移动开发

云原生:详解|K8s技术栈解析, 一文读懂K8s工作原理

息之

架构 容器 云原生 k8s 集群

A010-menu资源,看完老板哭着让我留下来

android 程序员 移动开发

知识中台与区块链助力多源可信数据价值释放

CECBC

Androdid Droid Fu介绍,flutter底部弹窗

android 程序员 移动开发

Android 3年外包工面试笔记,有机会还是要去大厂学习提升

android 程序员 移动开发

GitLab和Rainbond整合实现一体化开发环境

北京好雨科技有限公司

DevOps gitlab #GitLab gitlab hook rainbond

面试阿里P6,过关斩将直通2面,结果3面找了个架构师来吊打我?

Java spring 程序员 架构

ajax分析 学习(1),android0基础

android 程序员 移动开发

Android 11 Beta 版正式发布!以及众多面向开发者的重磅更新

android 程序员 移动开发

Android 8 通知渠道(Notification Channels),美团移动端开发工程师

android 程序员 移动开发

Activity-的-36-大难点,你会几个?,android游戏开发实践指南

android 程序员 移动开发

Activity的任务栈Task以及启动模式与Intent的Flag详解(经典博文,值得收藏

android 程序员 移动开发

巧用 Redis 数据结构实现亿级数据聚合统计

码哥字节

redis 数据统计 NoSQL 数据库 11月日更

Andriod 网络框架 OkHttp 源码解析,总结一下

android 程序员 移动开发

Activity的生命周期,这可能是目前最全的

android 程序员 移动开发

ajax分析 学习,kotlin构造器

android 程序员 移动开发

Andorid&Kotlin编译速度原理剖析(上),lambda表达式的作用与好处

android 程序员 移动开发

大势已来!!区块链的真正价值是什么

CECBC

想要实现元宇宙,需要哪些技术支撑?

行云创新

技术 云原生 vr 云宇宙 虚拟

Android - 在线浏览源码,电话短信相关,文本变化监听器

android 程序员 移动开发

Android 12体验!新的黑夜模式、影音格式,详解系列文章

android 程序员 移动开发

从ES到CK:信息技术发展的新浪潮_大数据_娄志强_InfoQ精选文章