干货 | 100亿+数据量,每天50W+查询,携程酒店数据智能平台实践

对去哪儿旅行(功略库)的数据分析 去哪儿旅行网站上有丰富的图片,旅行数据以及评论数据,用这些大量的数据来学习数据采集及可视化分析是一个不错的选择。 阅读详情

作者简介

 

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


背景

随着大数据不断地融入到工作中,如何使大量的数据资产变现,并提供有价值的见解,通过大量的历史数据和实时数据作为业务工作的参考预测未来,驱动业务的发展,需要统一数据平台来满足用户工作的需求。

 

一、为什么要做?

平台建立之前,我们主要依赖各种不同的数据工具来处理团队数据需求。随着业务的发展,数据在工作中作用越来越大,但不同工具各自独立引起的数据问题也越来越严重。酒店数据智能平台的起源,当时主要从以下几个现实痛点出发:

散:数据分散在不同平台,没有地方可以统一查看所有数据;

杂:不同平台逻辑不同,没有统一评判标准;

浅:数据明细不够直观深入,无法清楚地了解趋势及问题;

慢:查询速度慢,临时取数流程漫长;

晚:当时存在的数据报表平台都无法实现实时的数据监控,对于业务在工作中,特别是订单高峰期库存时刻在变化的时候,不能起到很好的指导和推动作用;

 

下图是平台创建之前的工作方式,不同的部门在很多个数据平台获取各种数据:

下图是平台创建之后,每个部门都用同一份数据,整个平台的各种指标逻辑统一:

平台的创建起步数据引擎采用的是多节点SQL服务器为主,ElasticSearch为辅的方式,但同样遇到了大多数数据平台的通病,数据量太大,数据表多,查询性能差,各种问题防不胜防,主要问题集中在以下几点:

1)数据量日积月累越来越大,哪怕sharding也很难实现到查询秒出,并且硬件成本和程序复杂度都很高;

2)数据查询涉及逻辑复杂,单个SQL往往涉及多个表join,以致SQL执行慢,SQL优化难度大;

3)历史数据更新量大,普通的SQL数据库数据导入都会存在io瓶颈;

4)搜索条件多,汇总维度不固定,导致很多数据无法更进一步汇总;

5)同时在线用户量很高,特别是针对业绩数据,实时订单数据和奖金数据等场景是业务非常关心的,所以这些case的并发量非常高;

6)接口性能不稳定,数据更新时接口性能波动大;

 

二、如何做?

2.1 方案选型

针对上述问题,我们需要解决平台的查询性能,高并发以及每天大量的数据更新时用户端应用的高可用,同时我们的性能响应时间指标是pc端小于3秒,app端小于1秒。

为此,我们尝试了很多种数据库,考虑过相互之间尽量互补,各取所长。经过多次测试,实践得出每个数据库应用于我们场景的结论:

1)ClickHouse 查询速度快,但无法承受高并发;

2)ElasticSearch 查询速度快,cpu消耗到60%对查询性能不会有太大的影响,但不能做多表join,大宽表维护成本不现实,约束了我们的使用场景;

3)Ingite 虽然也是内存数据库,但性能在高并发的时候内存会打爆,不能满足我们的要求,这个是用5台24G内存的虚拟机测试结果;

4)Presto 查询时直接读取hive表,能减少数据同步的流程,降低开发成本,查询速度勉强能接受,但不能满足高可用。因此这个只针对我们团队内部应用场景,不对业务端需求采用该技术方案;

5)CrateDB底层沿用了ElasticSearch的源码,支持SQL语法,比ElasticSearch的使用更友好,也解决了es不能join的问题,但在多表join的场景qps达到20个左右内存就会被打爆(6台8核24G内存虚拟机测试场景),单表查询性能和高并发支撑还是可以的;

6)MongoDB 走索引查询速度非常快,但太依赖左侧原则,也不能join,只能通过嵌套文档的方案解决join的问题,但我们的查询条件太多,不能强依赖左侧原则来查询;

其他还有Hbase,Kylin,Garuda等等,每个数据库我们都有搭建环境压测,每个数据库从硬件成本,性能上都有自己特有的优势,综合到使用场景,暂时最适合我们的还是ClickHouse。

 

2.2 方案落地

ClickHouse在去年的文章《每天十亿级数据更新,秒出查询结果,ClickHouse在携程酒店的应用》中有介绍,虽然它很快,但也有缺点,特别是高并发场景。只要出现瓶颈会很快出现恶性循环,查询请求积压,连接数打满,cpu使用率直线上升。所以ClickHouse会作为一个主力引擎来承受查询请求,充分的利用它的优势,但也需要对它有足够的保护。

实践中我们总结了以下方式来优化接口性能同时起到保护ClickHouse的作用:

1)做好查询监控,针对每个接口,每个查询语句都能知道查询消耗时间,case by case优化;

2)所有数据查询请求拆成异步请求,避免大接口中数据请求等待的过程影响数据展示的速度;

3)针对使用率很高数据量又非常大的表,可以创建一个全量表,同时也创建一个只有最近6个月数据的表。因为我们通过埋点发现,90%以上的查询都主要集中在查最近6个月的数据。所以有90%以上的查询使用的表数据量远远小于全量表,性能会好很多,服务器的开销也会小很多。当然这个方案也是需要case by case看的,也许某些case用户访问量最高的数据集中在最近3个月,可以根据实际情况来定;

4)统计出日常调用量比较大的接口,有针对性的做如下优化:

固定缓存:如果数据固定范围或者对于访问量高的页面默认查询条件,数据当天更新后由job触发主动模拟用户查询,提前为用户把数据缓存到redis中。用户在上班时间段查询就会从redis中拿数据,性能提高了,ClickHouse的压力也降低了,也避免了用户高峰期间集中查询对ClickHouse服务器的冲击。

动态缓存:如果数据范围不固定,但调用量也很大,特别是实时数据,为了ClickHouse的稳定性,也建议增加缓存。我们曾经在这里踩过坑,用户会用同样的条件不断的刷数据,也许他在期待业绩数据的变化,遇到高并发的时候会把ClickHouse服务器CPU打满。实际上通过埋点发现,哪怕缓存时间只有3分钟也可以降低50%以上的ClickHouse查询请求。

分流机制:ClickHouse主要是解决我们大表join查询性能,实际应用中可以将一些场景拆解,比如一些一线业务的权限比较小,对应权限的酒店数据量也会比较小。我们可以定义一个阀值,比如小于5000或者8000的数据走mysql,这部分人走mysql速度也会很快,让权限大的用户走ClickHouse,这样会引流很大一部分用户,提升整个平台的查询性能。

2.3 高可用

数据平台每天都有大量的数据更新,如何保证线上几百个接口不会随着数据量的增加性能降低,如何保证2000多个数据流程准点更新完数据,如何保证平台的高可用,下面是我们针对一些潜在问题的监控和解决方案:

1)流程监控机制:当前整个平台100多亿的数据量,每天需要更新几十亿的历史数据,2000多个数据更新流程,我们需要保证数据每天能按时更新到ClickHouse中,所以我们做了很多监控。包括最晚截止时间未执行的预警,数据量不一致的预警,ClickHouse数据切换异常预警,都会通过oncall电话或者手机短信通知到我们。

2)当某一个节点出现问题的时候,能将查询请求快速转移到健康的服务器上,对于redis/mysql/es我们公司有健全的DR机制和故障转移机制。对于ClickHouse,我们是将不同的机房服务器构建成虚拟集群,比如A机房一台服务器与B机房一台服务器构建成一个集群,通过程序控制将查询请求打散分布到两台服务器上实现负载均衡。如果A机房有异常或者某一台服务器有异常,只需要配置对应的虚拟集群把对应机器设置下线后人工介入处理。

3)需要有风险意识,由监控抓出对服务器CPU/IO消耗大的查询语句或者数据流程。当服务器CPU使用率突然增加20%或者服务器CPU持续消耗超过20%,我们都会抓出当前正在执行的语句同时发出预警邮件,类似于dump做事后分析。同时开发过程中每个人都需要有意识的关注每个功能的数据量,当遇到数据量大或者访问量大的复杂需求,需要做好缓存,埋点监控以及降级方案。

4)需要有数据校验机制,因为DR机制我们的数据是多写,可能会因为某次网络异常引发两边数据不一致的情况。虽然这种概率很低,但有了校验机制可以及时发现并解决这类问题。

5)异常预警:上线的每一个功能,所有报错都会发邮件通知整个开发组。这样就需要控制程序中的每一个异常,每个报错都需要case by case分析并解决掉,同时也需要对我们自己的开发质量有足够的信心。

 

2.4 架构和结果

下面是系统架构图:

 

 

现在整个平台架构由多个虚拟集群组成,随着业务量的增长或者某个集群出现负载压力,可以动态配置新的虚拟集群无限横向扩展满足业务增长需求,也可以将资源利用率低的A集群中的服务器拉入B集群同时分担A,B集群流量。

现在总平台数据量是100多亿,每天有2000多个数据流程运行,需要更新历史数据几十亿。工作日平台每天有2000多在线用户,50多万次的数据查询,调用ClickHouse的次数达到了300多万次。每天有40%左右的请求主要落在数据量比较大的业绩数据,用户行为表上,都是好几亿级业务数据需要join几千万的权限表加千万级的信息表实时计算。

通过下图的监控统计截图可以看到,平台接口1s内响应时间占比在不断提高,超过1s的请求经过优化后占比也是不断的降低。


2019/5/3

2019/8/3

2019/12/3

<1s占比

75.14%

82.25%

93.33%

1s到3s

24.15%

17.28%

6.43%

超过3s

0.71%

0.47%

0.24%

上面主要是从服务端介绍了整个系统,其实从前端我们也做了很多工作,因为纯数据的呈现可能会让人觉得枯燥,或者无法直观的从数据中发现问题。

1)整个平台无论多少功能,所有页面加载采用异步请求。用户在浏览任何页面时,系统不会出现白屏式页面刷新,主要是为了避免用户在关注某个数据的时候因为页面刷新而影响到用户分析数据的思路。

2)如何让用户在茫茫的数据海洋中高效的找到关键数据,我们集成了第三方插件做出一些新颖的图像,宏观的分析数据趋势以及关键类型的汇总占比,让用户通过图形展示能更加直观快速得到数据信息。同时我们修改了echart和highchart相关插件源码,自定义默认的颜色体系,自定义指标的刻度值,通过这些前端的修改,可以提高前端视觉体验。也针对常用图形控件做了一层封装,提高前端的开发效率,降低了开发人员前端技能门槛。

 

三、后期规划

本文主要介绍如何解决数据可视化平台的性能问题,如何保证数据产品的高可用,以及从技术角度如何让数据更直观。2019年我们的主要侧重点是将sql上的数据迁移到clickhouse并优化查询性能,现在90%以上的数据都在clickhouse上,而es,redis,mysql都是在不同的case辅助clickhouse,性能和稳定性有了较大的提升。

今年持续监控,优化性能,同时关注点会适当的下沉到dw,一起完善可视化的上游流程依赖,尽可能的使整个数据生态链更简洁,运行更快更稳定。同时完善平台功能,打通与其他系统之间的交互,加强数据系统与业务系统的关联,通过不断的完善提升数据对业务的帮助。

团队招聘信息

携程酒店数据可视化平台,负责酒店实时数据与离线数据计算的开发和运维,给酒店和业务提供相关数据展示平台。欢迎对大数据技术研究有好奇心和求知欲的小伙伴投递简历到tech@ctrip.com,邮件标题:【数据可视化平台】+【姓名】

【推荐阅读】

 “携程技术”公众号

  分享,交流,成长

面对海量数据,如何才能查得更快? 本文已收录GitHub,更有互联网大厂面试真题,面试攻略,高效学习资料等 本文和大家分享一下如何来保存原始数据,我们知道,原始数据的数据量太大,能存下来就很不容易了,这个数据是没法直接来给业务系统查询和分析的。有两个原因,一是数据量太大了,二是也没有很好的数据结构和查询能力,来支持业务系统查询。 所以一般的做法是,用流计算或者是批计算,把原始数据再进行一次或者多次的过滤、汇聚和计算,把计算结果落到另外一个存储系统中去,由这个存储再给业务系统提供查询支持。这里的“流计算”,指的是 Flink、Storm.. 阅读详情

相关推荐

记一次线上故障:日志暴涨

前言背景 上周三早上连续受到报警信息,提示某某服务器磁盘满了,请开发同学尽快处理! 二话不说先拿出电脑,分析一下服务器的日志,发现有这样的日志记录出现了一千三百多万次 msgWorker - thread-16 - xxxMessageListener ... 具体内容省略 由于之前的日志里是不会打印这些消息日志的,所以,我猜测是不是日志级别设置错了。而且这个消息打印的类并不在项目源码里,而是依...

weijizhi2873的博客 542

海量数据处理

1、10亿个数字,取最小的100个数

邹亮的博客 537

大数据实时计算---Kafka介绍(上)

在介绍大数据实时计算介绍之前,我们先介绍大数据使用的消息中间件Kafka,在大数据中经常会被用到。 Kafka基本概念 Kafka集群的搭建 Kafka集群的操作 ApacheKafka的概念 我们从三个方面去理解什么是kafka Apache Kafka 是一个消息队列(生产者消费者模式) Apache Kafka 目标:构建企业中统一的、高通量、低延时的消息平台。 大多的是消息队列(...

weixin_42229056的博客 2918

大数据(电商行业)规模参考

集群规划 设备 数据量 硬盘 HDFS Kafka 日志服务器 峰值分析 按秒 按小时 按天 内存 组织架构

ArYe 1211

MSSQLServer中大数据量表的查询优化

MSSQLServer中大数据量表的查询优化 MSSQLServer中大数据量表的查询优化

解密m3u8视频合并:从猫抓插件到本地文件修改全流程

本文详细解析了m3u8视频合并的全流程,特别针对加密视频片段提供了解决方案。从使用猫抓插件捕获m3u8文件地址,到利用N_m3u8DL-CLI工具自动下载、解密并合并ts片段,手把手教你处理AES-128加密等常见问题,最终生成完整的本地MP4文件,适合需要备份或处理流媒体资源的用户。

weixin_29290947的博客 1358

【性能优化】MySQL - 单表数据量过千万,采坑优化记录 - 参考

主要用于如何解决单表大数据量问题,提供一个解决思路。

"代码"的日常搬运 7463

Node-Red系列教程——NodeRed通过OPC UA读取数据并写入mysql

NodeRed通opcua读取西门子数据并存入mysql

鲸鱼姐的专栏 1万+

《携程技术2020年度合辑》,送给爱学习的你

01序言 2020年跌宕起伏,突如其来的疫情对旅游行业造成了前所未有的冲击,也让更多人进一步感受到技术互联互通的重要性。对于旅游业技术人而言,外部的不可控因素让我们更加聚焦于系...

携程技术 728

深度学习笔记(3)——kernel(内核)与filter(滤波器)

本文仅仅简单介绍了kernel和filter的概念,介绍了确定filter和kernel个数的方法。

cs111211的博客 7135

Windows+VSCode+Cline+MCP全流程配置指南

本文提供了一份详细的Windows+VSCode+Cline+MCP全流程配置指南,旨在帮助开发者打造高效的AI辅助编码工作站。文章从环境准备讲起,逐步指导安装VSCode、配置Cline插件、搭建Node.js环境,并重点详解如何通过MCP为Cline集成文件系统和GitHub等工具服务器,实现用自然语言操控开发环境,从而显著提升日常编码与文件管理效率。

weixin_28840143的博客 550

干货 | 性能指标提升50%+,携程数据报表平台查询效率治理实践

作者简介携程OLAP引擎开发组,专注于大数据OLAP引擎trino/starrocks的开发与大规模部署和运维。团队热招岗位:资深大数据平台开发工程师、OLAP分析引擎高级/资深开发工程师本文概述了面对公司数据报表平台遇到的查询性能挑战,数据平台组围绕数据缓存、物化视图、查询策略、SQL质量等方向所做的一系列治理工作,以提升平台的查询效率和稳定性。通过这些工作,平台的查询响应时间得到了显著的改善,...

携程技术 1406

【DRAM存储器五十一】LPDDR5介绍--DFE与Pre-Emphasis

简述LPDDR5的DFE和预加重应用设置

highman110的博客 703

携程上海酒店数据采集及可视化

价格越低,消费者评分的方差就越大,1-5 分都有分布,价格越高,评分越高,几乎都在 4 分以上。我觉得这有两个原因,第一,价格高的酒店数量远远不如酒店低的数量,第二,花了 2w 块住一晚酒店,那体验能不好吗?价格多分布在区间的下行,即大部分酒店价格较低,评分则多分布在区间上行,大部分酒店评分较高,这反映了上海市酒店服务业的整体水平较高。从价格的中位数来看,只平平无奇,但是从平均价格来看,上海的酒店价格至少是我老家,湖南一个省内著名省外无名三线城市价格的 2 倍。最后,把酒店价格可视化地展示在上海地图上。

月小水长 2371

从零开始:手把手教你设计人形机器人锂电池供电系统

人形机器人要像人类一样“活起来”,必须有稳定的“能量血液”——供电系统。本文聚焦锂电池供电系统如何根据机器人功耗选择合适的锂电池参数(容量、电压、放电倍率);如何设计电池管理系统(BMS)保护电池安全;如何解决机器人运动时的“瞬时大电流”供电难题;如何通过硬件电路和代码实现供电系统的监测与控制。用“机器人小助手的能量危机”故事引入锂电池供电系统;拆解锂电池核心参数(容量、电压、放电倍率)和供电系统三大组件(电池组、BMS、电源转换模块);

AI天才研究院 1758

YOLOv11改进策略【损失函数篇】| 替换激活函数为Mish、PReLU、Hardswish、LeakyReLU、ReLU6

在卷积神经网络中,激活函数通过在神经网络中引入非线性,使网络能够学习和逼近复杂函数,从而处理复杂的模式识别与分类问题。

Limiiiing的博客 2783

爬取携程酒店信息

爬取携程酒店信息

m0_69003698的博客 8662

Python 爬虫教程:美食网站 + 社交平台餐馆评论抓取(评分提取 + 情感分析)

在当今数字化时代,数据无处不在,而爬虫技术则是获取数据的强大工具之一。无论是市场调研、学术研究还是个人兴趣探索,爬虫都能帮助我们从海量的网络信息中提取有价值的数据。本文将通过一个实战案例,带领大家学习如何使用 Python 爬虫技术抓取美食网站和社交平台上的餐馆评论,并进行评分提取与情感分析。通过这个项目,你将掌握爬虫的基本原理、数据解析、以及如何结合情感分析技术来挖掘数据背后的洞察。

u014481728的博客 310

携程手机版国内机票数据

概述 携程网页版机票查询的网址是https://m.ctrip.com/html5/flight/ 本篇使用天津到石家庄的航线进行测试。 请求分析 浏览器network中可直接查看到请求和响应结果。 请求:https://m.ctrip.com/restapi/soa2/14022/flightListSearch?_fxpcqlniredt=09031039219678951998 请求体:{“preprdid”:"",“trptpe”:1,“flag”:8,“searchitem”:[{“dccode”

洛塔博士的博客 5946

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

日均5000万订单点餐系统中间件选型和关键技术实现方案

日均5000万订单点餐系统中间件选型和关键技术实现方案   一、     业务模型   本系统假定的应用场景为:面向中等以上规模餐厅提供二维码扫码点餐服务,客户可以通过微信或支付宝扫码点单。系统规模为: 1)     商家数量:   10万家活跃商家。 2)     菜单条目总数   1000万条。 3)     日均订单量   5000万单(10万店 x 500单/店)  

binzhaomobile的博客 3822

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

100亿级订单怎么调度,来一个大厂的极品方案

尼恩给大家做一下系统化、体系化的 订单的超时处理的方案,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。大家可以把这个海量任务定时调度的方案写入简历。

架构师尼恩 6749

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

去哪儿酒店实时报价搜索技术分享

去哪儿酒店实时报价搜索技术分享 去哪儿酒店搜索每天处理近千万次用户的实时报价查询请求, 涉及到200多家目标网站的近30万家酒店。 对其内容详细阅读

拟声的主扬在江湖 698

OLAP数仓入门:进阶篇

文章作者:温正湖 网易易数内容来源:数据库内核@知乎专栏导读:前一篇文章从OLTP出发,通过对比引出OLAP,进一步介绍了数仓的基本概念,包括多维数据模型、数据立方体及其典型操作等。本篇...

大数据星球-浪尖 964

“一个扫描枪一张表”,韵达选择 TDengine 应对每日亿级数据量

此前,韵达使用 MySQL 分区+索引处理订单数据的方式遭受到了挑战,面对每日亿级的数据量,MySQL 显然已经无法满足当下的数据处理需求。为更好地发展业务,在此基础上韵达新增了 TDengine 的数据源,用专业的数据库来进行时序数据的处理。

涛思数据 4150

华为开源数据格式CarbonData项目,实现大数据即席查询秒级响应

华为宣布开源了CarbonData项目,该项目于6月3日通过Apache社区投票,成功进入Apache孵化器。CarbonData是一种低时延查询、存储和计算分离的轻量化文件存储格式。那么相比SQL on Hadoop方案、传统NoSQL或相对ElasticSearch等搜索系统,CarbonData具有什么样的优势呢?CarbonData的技术架构是什么样子的?未来有什么样的规划?我们采

~ Caesar's wish书屋 ~ 5333
上一篇: 干货 | 携程Hadoop跨机房架构实践
下一篇: 干货 | Kotlin/Native 异步并发模型初探
携程技术
博客等级 码龄10年 3715粉丝 324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值