武汉的开发者们注意啦!AI技术战略、框架以及最佳实战尽在Azure OpenAI Day 了解详情
写点什么

每天十亿级数据更新,秒出查询结果,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:0012370

评论

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

毕业设计

Geek_35a345

ClickHouse用户资源隔离在 GrowingIO 的实践

GrowingIO技术专栏

Clickhouse 多租户 rbac 用户资源隔离 限流熔断

从月薪8k到年薪60w,闭关3个月靠“刷题,移动端开发技术

android 程序员 移动开发

互联网大厂“围城”,android界面开发

android 程序员 移动开发

浮感

feitian

从0开始写一个基于Flutter的开源中国客户端(4),android应届毕业生面试题

android 程序员 移动开发

专科毕业,Android不好找工作的同学,你的问题在这里,android源码设计模式解析与实战

android 程序员 移动开发

中奖了!中奖了!,android组件化通信

android 程序员 移动开发

为了弄懂Flutter的状态管理, 我用10种方法改造了counter app

android 程序员 移动开发

为什么不能使用 Application Context 显示 Dialog?(1)

android 程序员 移动开发

今日头条屏幕适配方案终极版正式发布!,移动应用开发平台

android 程序员 移动开发

从事这么久的Android 开发工作,知道自己处于什么段位嘛?

android 程序员 移动开发

专科毕业三年,从外包公司到今日头条offer,我想把面试心得分享给你

android 程序员 移动开发

为什么经常看到35岁程序员,转行之后工资呈断崖式下跌?

android 程序员 移动开发

为您的应用配置 Play Feature Delivery,flutter视频教程仿京东

android 程序员 移动开发

毕业总结

Geek_35a345

从 0 到 1,带你解剖 MVP 的神秘之处,并自己动手实现 MVP !

android 程序员 移动开发

为了KPI,对APK进行极限优化!,2021年Android春招面试经历

android 程序员 移动开发

互联网寒冬即将过去,Jetpack将是燃起来的第一把火,我先收藏为敬

android 程序员 移动开发

从Android开发者的角度看一看IOS和Flutter中的列表实现

android 程序员 移动开发

从另一个角度解读handler原理,android开发书籍pdf下载

android 程序员 移动开发

【得物技术】主子订单模型

得物技术

互联网 模型 电商 订单系统 订单

为了这一次字节跳动Android面试机会,我准备了158天,一个疏忽让我前功尽弃

android 程序员 移动开发

为什么不能使用 Application Context 显示 Dialog?,安卓kotlin

android 程序员 移动开发

五千字长文,深度解密:那些BAT大厂的Android面试官到底在想些什么

android 程序员 移动开发

产品级Flutter开源项目FunAndroid,Provider MVVM的最佳实践

android 程序员 移动开发

人工智能的下一站:精细化生活场景的智能时代,靠着这份900多页的PDF面试整理

android 程序员 移动开发

今日头条APK瘦身之路,android组件化开发框架对比

android 程序员 移动开发

二本学历,五年抄代码经验,疫情期被裁,真牛皮

android 程序员 移动开发

今年40岁了,忽然接到公司裁员通知,接下来的路我该怎么办

android 程序员 移动开发

携程商旅订单系统架构优化实践

GavinYe

架构 中台 后端 OTA 订单系统

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