一般来说,微信主要的数据分析场景包含以下几个方面:
除此以外,还有实时监控、日志系统明细查询等场景。
在所有的场景当中,使用者都有非常重要的诉求——快:希望查询响应更快,指标开发更快完成,看板更新更及时。与此同时,微信面临的是海量的数据,业务场景中“单表日增万亿”很常见,这就对下一代“数据分析系统”提出新的挑战。
在使用ClickHouse之前,微信使用的是Hadoop生态为主的数仓,存在以下这些问题:
架构臃肿,在微信业务体量规模的数据下,传统架构很难做到流批一体。进而导致,代码需要写多套、数据结果难以对齐、存储冗余。经过十几年的发展之后,传统的Hadoop生态的架构变得非常臃肿,维护难度和成本都很大。
所以,微信一直在寻求更轻量、简单敏捷的方案来解决这些问题。经过一番调研,在百花齐放的OLAP产品中,最终选定了ClickHouse作为微信OLAP的主要核心引擎。主要有两个原因:
因此,微信尝试在OLAP场景下,构建基于ClickHouse计算存储为核心的“批流一体”数仓。
但是,使用原生的ClickHouse,在真正放量阶段出现了很多问题:
稳定性:ClickHouse的原始稳定性并不好,比如说:在高频写入的场景下经常会出现too many part等问题,整个集群被一个慢查询拖死,节点OOM、DDL请求卡死都比较常见。另外,由于ClickHouse原始设计缺陷,随数据增长的依赖的zookeeper瓶颈一直存在,无法很好解决;微信后期进行多次内核改动,才使得它在海量数据下逐步稳定下来,部分issue也贡献给了社区。
此时,腾讯云数据仓库Clickhouse团队积极深入业务,主动与微信团队合作,双方开始共同解决上述问题。腾讯云数据仓库Clickhouse提供全托管一站式的全面服务,使得微信团队不需要过多关注稳定性问题。另外,双方团队积累了丰富查询优化经验,共享经验更有利于Clickhouse性能极致提升。
微信跟腾讯云数据仓库Clickhouse的合作,从今年3月份开始,在验证期小规模试用ClickHouse后,业务一直在快速增长,双方开始共建进行稳定性和性能上的优化。主要做了两件事:一个是建立了整个ClickHouse OLAP的生态,另外一个是做了的探索出贴近业务的查询优化方法。
要想比较好地解决ClickHouse易用性和稳定性,需要生态支撑,整体的生态方案有以下几个重要的部分:
微信WeOLAP团队和腾讯云重点在以下方面进行了合作攻坚:
微信的吞吐达到了十亿级别,实时接入方面,通过令牌、反压的方案,比较好地解决了流量洪峰的问题。另外通过Hash路由接入,使数据落地了之后可直接做Join,无需shuffle实现的更快Join查询,在接入上也实现了精确一次。离线同步方案上,微信跟大多数业界的做法基本上一致,在通过预构Merge成建成Part,再送到线上的服务节点,这其实是种读写分离的思想,更便于满足高一致性、高吞吐的场景要求。
ClickHouse整个的设计哲学,要求在特定的场景下,采用特定的语法,才能得到最极致的性能。为解决ClickHouse使用门槛高的问题,微信把相应的优化经验落地到内部BI平台上,沉淀到平台后,使得小白用户都可以方便使用ClickHouse。通过一系列优化手段,在直播、视频号等多个Case实现10倍以上性能提升。
基于共建的ClickHouse生态,在微信有以下的典型应用场景:
由于科学探索是随机的,很难通过预构建的方式来解决,之前用Hadoop的生态只能实现小时到分钟的级别。目前ClickHouse优化完之后,在单表万亿的数据量下,大多数的查询,P95在5秒以内。数据科学家现在想做一个验证,非常快就可以实现。
早期做A/B实验的时候,前一天晚上要把所有的实验统计结果,预先聚合好,第二天才能查询实验结果。在单表数据量级千亿/天、大表实时Join的场景下,微信前后经历了几个方案,实现了近50倍的性能提升。从离线到实时分析的飞跃,使得P95响应<3S,A/B实验结论更加准确,实验周期更短,模型验证更快。
虽然大家普遍认为ClickHouse不太擅长解决实时相关的问题,但最终通过优化,可以做到扫描量数十亿,全链路时延<3秒,P95响应近1秒。
目前,微信当前规模千台,数据量PB级,每天的查询量上百万,单集群TPS达到了亿级,而查询耗时均值仅需秒级返回。ClickHouse OLAP的生态相对于之前的Hadoop生态,性能提升了10倍以上,通过流批一体提供更稳定可靠的服务,使得业务决策更迅速,实验结论更准确。
ClickHouse原始的设计和Shard-Nothing的架构,无法很好地实现秒级伸缩与Join的场景;因此下一个微信和腾讯云数据仓库ClickHouse的共建目标,是实现存算分离的云原生数仓:
CIO之家 www.ciozj.com 公众号:imciow