阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

每天十亿级数据更新,秒出查询结果,ClickHouse 在携程酒店的应用

  • 2019-07-05
  • 本文字数:3921 字

    阅读完需:约 13 分钟

每天十亿级数据更新,秒出查询结果,ClickHouse在携程酒店的应用

一、背景

1)携程酒店每天有上千表,累计十多亿数据更新,如何保证数据更新过程中生产应用高可用;


2)每天有将近百万次数据查询请求,用户可以从粗粒度国家省份城市汇总不断下钻到酒店,房型粒度的数据,我们往往无法对海量的明细数据做进一步层次的预聚合,大量的关键业务数据都是好几亿数据关联权限,关联基础信息,根据用户场景获取不同维度的汇总数据;


3)为了让用户无论在 app 端还是 pc 端查询数据提供秒出的效果,我们需要不断的探索,研究找到最合适的技术框架。


对此,我们尝试过关系型数据库,但千万级表关联数据库基本上不太可能做到秒出,考虑过 Sharding,但数据量大,各种成本都很高。热数据存储到 ElasticSearch,但无法跨索引关联,导致不得不做宽表,因为权限,酒店信息会变,所以每次要刷全量数据,不适用于大表更新,维护成本也很高。Redis 键值对存储无法做到实时汇总,也测试过 Presto,GreenPlum,kylin,真正让我们停下来深入研究,不断的扩展使用场景的是 ClickHouse。

二、ClickHouse 介绍

ClickHouse 是一款用于大数据实时分析的列式数据库管理系统,而非数据库。通过向量化执行以及对 cpu 底层指令集(SIMD)的使用,它可以对海量数据进行并行处理,从而加快数据的处理速度。


主要优点有:


1)为了高效的使用 CPU,数据不仅仅按列存储,同时还按向量进行处理;


2)数据压缩空间大,减少 io;处理单查询高吞吐量每台服务器每秒最多数十亿行;


3)索引非 B 树结构,不需要满足最左原则;只要过滤条件在索引列中包含即可;即使在使用的数据不在索引中,由于各种并行处理机制 ClickHouse 全表扫描的速度也很快;


4)写入速度非常快,50-200M/s,对于大量的数据更新非常适用;


ClickHouse 并非万能的,正因为 ClickHouse 处理速度快,所以也是需要为“快”付出代价。选择 ClickHouse 需要有下面注意以下几点:


1)不支持事务,不支持真正的删除/更新;


2)不支持高并发,官方建议 qps 为 100,可以通过修改配置文件增加连接数,但是在服务器足够好的情况下;


3)sql 满足日常使用 80%以上的语法,join 写法比较特殊;最新版已支持类似 sql 的 join,但性能不好;


4)尽量做 1000 条以上批量的写入,避免逐行 insert 或小批量的 insert,update,delete 操作,因为 ClickHouse 底层会不断的做异步的数据合并,会影响查询性能,这个在做实时数据写入的时候要尽量避开;


5)Clickhouse 快是因为采用了并行处理机制,即使一个查询,也会用服务器一半的 cpu 去执行,所以 ClickHouse 不能支持高并发的使用场景,默认单查询使用 cpu 核数为服务器核数的一半,安装时会自动识别服务器核数,可以通过配置文件修改该参数;

三、ClickHouse 在酒店数据智能平台的实践

3.1 数据更新

我们的主要数据源是 Hive 到 ClickHouse,现在主要采用如下两种方式:


1)Hive 到 MySql,再导入到 ClickHouse


初期在 DataX 不支持 hive 到 ClickHouse 的数据导入,我们是通过 DataX 将数据先导入 mysql,再通过 ClickHouse 原生 api 将数据从 mysql 导入到 ClickHouse。


为此我们设计了一套完整的数据导入流程,保证数据从 hive 到 mysql 再到 ClickHouse 能自动化,稳定的运行,并保证数据在同步过程中线上应用的高可用。



2)Hive 到 ClickHouse


DataX 现在支持 hive 到 ClickHouse,我们部分数据是通过 DataX 直接导入 ClickHouse。但 DataX 暂时只支持导入,因为要保证线上的高可用,所以仅仅导入是不够的,还需要继续依赖我们上面的一套流程来做 ReName,增量数据更新等操作。


针对数据高可用,我们对数据更新机制做了如下设计:

3.1.1 全量数据导入流程


全量数据的导入过程比较简单,仅需要将数据先导入到临时表中,导入完成之后,再通过对正式表和临时表进行 ReName 操作,将对数据的读取从老数据切换到新数据上来。

3.1.2 增量数据的导入过程


增量数据的导入过程,我们使用过两个版本。


由于 ClickHouse 的 delete 操作过于沉重,所以最早是通过删除指定分区,再把增量数据导入正式表的方式来实现的。


这种方式存在如下问题:一是在增量数据导入的过程中,数据的准确性是不可保证的,如果增量数据越多,数据不可用的时间就越长;二是 ClickHouse 删除分区的动作,是在接收到删除指令之后内异步执行,执行完成时间是未知的。如果增量数据导入后,删除指令也还在异步执行中,会导致增量数据也会被删除。最新版的更新日志说已修复这个问题。


针对以上情况,我们修改了增量数据的同步方案。在增量数据从 Hive 同步到 ClickHouse 的临时表之后,将正式表中数据反写到临时表中,然后通过 ReName 方法切换正式表和临时表。


通过以上流程,基本可以保证用户对数据的导入过程是无感知的。

3.2 数据导入过程的监控与预警

由于数据量大,数据同步的语句经常性超时。为保证数据同步的每一个过程都是可监控的,我们没有使用 ClickHouse 提供的 JDBC 来执行数据同步语句,所有的数据同步语句都是通过调用 ClickHouse 的 RestfulAPI 来实现的。


调用 RestfulAPI 的时候,可以指定本次查询的 QueryID。在数据同步语句超时的情况下,通过轮询来获得某 QueryID 的执行进度。这样保证了整个查询过程的有序运行。在轮询的过程中,会对异常情况进行记录,如果异常情况出现的频次超过阈值,JOB 会通过短信给相关人员发出预警短信。

3.3 服务器分布与运维

现在主要根据场景分国内,海外/供应商,实时数据,风控数据 4 个集群。每个集群对应的两到三台服务器,相互之间做主备,程序内部将查询请求分散到不同的服务器上做负载均衡。


假如某一台服务器出现故障,通过配置界面修改某个集群的服务器节点,该集群的请求就不会落到有故障的服务器上。如果在某个时间段某个特定的数据查询量比较大,组建虚拟集群,将所有的请求分散到其他资源富于的物理集群上。


下半年计划把每个集群的两台机器分散到不同的机房,可以继续起到现有的主备,负载均衡的作用还能起到 dr 的作用。同时为了保障线上应用的高可用,我们会实现自动健康检测机制,针对突发异常的服务器自动拉出我们的虚拟集群。



我们会监控每台服务器每天的查询量,每个语句的执行时间,服务器 CPU,内存相关指标,以便于及时调整服务器上查询量比较高的请求到其他服务器。



四、ClickHouse 使用探索

我们在使用 ClickHouse 的过程中遇到过各种各样的问题,总结出来供大家参考。


1)关闭 Linux 虚拟内存。在一次 ClickHouse 服务器内存耗尽的情况下,我们 Kill 掉占用内存最多的 Query 之后发现,这台 ClickHouse 服务器并没有如预期的那样恢复正常,所有的查询依然运行的十分缓慢。


通过查看服务器的各项指标,发现虚拟内存占用量异常。因为存在大量的物理内存和虚拟内存的数据交换,导致查询速度十分缓慢。关闭虚拟内存,并重启服务后,应用恢复正常。


2)为每一个账户添加 join_use_nulls 配置。ClickHouse 的 SQL 语法是非标准的,默认情况下,以 Left Join 为例,如果左表中的一条记录在右表中不存在,右表的相应字段会返回该字段相应数据类型的默认值,而不是标准 SQL 中的 Null 值。对于习惯了标准 SQL 的我们来说,这种返回值经常会造成困扰。


3)JOIN 操作时一定要把数据量小的表放在右边,ClickHouse 中无论是 Left Join 、Right Join 还是 Inner Join 永远都是拿着右表中的每一条记录到左表中查找该记录是否存在,所以右表必须是小表。


4)通过 ClickHouse 官方的 JDBC 向 ClickHouse 中批量写入数据时,必须控制每个批次的数据中涉及到的分区的数量,在写入之前最好通过 Order By 语句对需要导入的数据进行排序。无序的数据或者数据中涉及的分区太多,会导致 ClickHouse 无法及时的对新导入的数据进行合并,从而影响查询性能。


5)尽量减少 JOIN 时的左右表的数据量,必要时可以提前对某张表进行聚合操作,减少数据条数。有些时候,先 GROUP BY 再 JOIN 比先 JOIN 再 GROUP BY 查询时间更短。


6)ClickHouse 版本迭代很快,建议用去年的稳定版,不能太激进,新版本我们在使用过程中遇到过一些 bug,内存泄漏,语法不兼容但也不报错,配置文件并发数修改后无法生效等问题。


7)避免使用分布式表,ClickHouse 的分布式表性能上性价比不如物理表高,建表分区字段值不宜过多,太多的分区数据导入过程磁盘可能会被打满。


8)服务器 CPU 一般在 50%左右会出现查询波动,CPU 达到 70%会出现大范围的查询超时,所以 ClickHouse 最关键的指标 CPU 要非常关注。我们内部对所有 ClickHouse 查询都有监控,当出现查询波动的时候会有邮件预警。


9)查询测试 Case 有:6000W 数据关联 1000W 数据再关联 2000W 数据 sum 一个月间夜量返回结果:190ms;2.4 亿数据关联 2000W 的数据 group by 一个月的数据大概 390ms。但 ClickHouse 并非无所不能,查询语句需要不断的调优,可能与查询条件有关,不同的查询条件表是左 join 还是右 join 也是很有讲究的。

五、总结

酒店数据智能平台从去年 7 月份试点,到现在 80%以上的业务都已接入 ClickHouse。满足每天十多亿的数据更新和近百万次的数据查询,支撑 app 性能 98.3%在 1 秒内返回结果,pc 端 98.5%在 3 秒内返回结果


从使用的角度,查询性能不是数据库能相比的,从成本上也是远低于关系型数据库成本的,单机支撑 40 亿以上的数据查询毫无压力。与 ElasticSearch,Redis 相比 ClickHouse 可以满足我们大部分使用场景。


我们会继续更深入的研究 ClickHouse,跟进最新的版本,同时也会继续保持对外界更好的开源框架的研究,尝试,寻找到更合适我们的技术框架。


作者介绍


蔡岳毅,携程酒店大数据高级研发经理,负责酒店数据智能平台研发,大数据技术创新工作。喜欢探索研究大数据的开源技术框架。


本文转载自公众号携程技术中心(ID:ctriptech)


原文链接


https://mp.weixin.qq.com/s/cqbzH9x5aESPBVG8NiaqjQ


2019-07-05 08:0012425

评论

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

情感语音识别:挑战与未来发展方向

来自四九城儿

大宗商品贸易集团数据治理实践,夯实数字基座 | 数字化标杆

袋鼠云数栈

数字化转型 数据治理 数据资产 数据开发 大宗贸易

汇总 | 一文了解常用的 NFT 数据分析平台

NFT Research

NFT 数据分析平台 NFT\ NFTScan

全国独家线下面授 | 上海大规模敏捷LeSS认证2024年3月14-16日开班

ShineScrum捷行

人工智能 | 知识图谱引领精准测试:人工智能在软件测试的新风向

测吧(北京)科技有限公司

测试

人工智能的历史演进:从专家系统到机器学习的蜕变

测吧(北京)科技有限公司

测试

ITSS会议周丨新华三参编运维国标发布,探索技术服务发展新路径

Geek_2d6073

使用 Pinia 的五个技巧

高端章鱼哥

Pinia

“数字创新产品课程” 2024年1月20-21日 · CSPO认证周末班【提前报名特惠】CST导师亲授

ShineScrum捷行

ArcGraph 缓存的设计与应用实践丨技术解读

Fabarta

AI 图数据库 数据库缓存 AI基础设施

Authing 入选《 2023 年央国企信创应用与实践研究报告》优秀服务商

Authing

Idaas Authing 第一新声

戳穿人工智能的六个谎言:辨别真伪

这我可不懂

人工智能 AI

WonderPen妙笔 for Mac:优雅高效,写作利器一触即发

晴雯哥

BatchOutput PDF for Mac(PDF批量处理软件) 3.0.6永久激活版

mac

苹果mac Windows软件 BatchOutput PDF PDF批量处理软件

大模型时代的智能运维与部署

百度开发者中心

人工智能 nlp 大模型 LLM

引领Transformer时代的新型大模型架构

百度开发者中心

大模型 LLM

软件测试/测试开发/人工智能丨从面试屡遭失败,到年薪28w

测试人

人工智能 软件测试

以微模块+液冷重塑绿色智算中心,新华三亮相CDCC数据中心标准大会

Geek_2d6073

Curve v2.7 发布:支持 Hadoop SDK,助力大数据存储降本提效背景

OpenCurve

开源 文件存储 分布式存储 块存储

OpenHarmony之NAPI框架介绍

OpenHarmony开发者

Open Harmony

人工智能测试演进:测试覆盖度分析技术的巅峰

测吧(北京)科技有限公司

测试

选择云服务器的五大考虑因素:性能、成本与安全性

一只扑棱蛾子

云服务器

HarmonyOS属性动画开发示例(ArkTS)

HarmonyOS开发者

HarmonyOS

糟糕!试用期被裁了

王磊

Java

人工智能 | 智能化升级:测试用例变更与新老版本Diff分析

测吧(北京)科技有限公司

测试

E往无前 | 日志成本下降25%+!腾讯云大数据ES Lucene压缩编码深度优化大揭秘

腾讯云大数据

ES

情感语音识别:技术发展与未来趋势

来自四九城儿

赋能自然语言处理的强大模型

百度开发者中心

nlp 大模型

基于 Flink SQL 和 Paimon 构建流式湖仓新方案

阿里云大数据AI技术

软件测试 |人工智能在软件测试中的崭新应用

测吧(北京)科技有限公司

测试

人工智能测试新篇章:有限状态机与知识图谱的融合

测吧(北京)科技有限公司

测试

每天十亿级数据更新,秒出查询结果,ClickHouse在携程酒店的应用_数据库_蔡岳毅_InfoQ精选文章