当前位置: 首页 > 网络应用技术

李杨:JD零售OLAP平台建设和场景实践

时间:2023-03-08 23:15:28 网络应用技术

  简介:今天,我将与您分享JD.com零售OLAP平台的构建和场景实践,其中主要包括四个部分:

  ------

  控制面可以提供高可靠性,高效,可持续的操作和维护保证,并迅速部署时间。尤其是对于OLAP核心发动机的核心发动机,其操作和维护(例如Clickhouse)尤其重要。

  控制面的整体体系结构设计如上图所示。从请求的开头,域名分析和转移规则都可以到达后端服务管理员。管理员具有一层验证层。验证完成后,队列中的任务将在消费完成后在后端存储中写下任务结果。如果有大量群集部署和配额更改,则将在此处完成一系列任务。完成后,将其保存在数据部门。这是整体架构设计。

  在业务管理方面,控制面可以提供以下功能:

  在操作和维护管理方面:

  首先,您可以部署一个新集群。例如,在应用物理资源或容器资源之后,您可以及时创建资源并及时使用它。

  其次,例如,当存在节点故障时(例如,硬件故障,例如CPU,内存或磁盘失败),应在线执行及时的节点或替换节点,否则会影响整个群集。一种是影响DDL,另一个是影响写作。

  第三,您可以进行配额管理和控制。这在促销中非常有用。它可用于限制查询数量,并发和加班等,以防止流量增加并导致集群的不稳定性。

  第四,您可以进行群集检查。群集检查后,您可以检查每个集群的服务状态。例如,它是否可以创建表,删除表,插入数据,查询数据是正常的等等,都有真实的-Time警报群集检查检查服务状态。

  以上是我们的JD.com零售OLAP控制表面的核心功能。它不仅提高了集群操作和维护中集群交付的效率,还可以节省运行和维护的成本。

  ------

  Jingdong Retail是一个场景,具有E-商务交易和用户流量为核心。以下方面有两个困难:

  为了响应上述场景,我们主要使用真实的时间数据更新以及实现的视图并加入“优化”。下一步,通过某些特定情况详细说明。

  首先查看真实的数据更新。我们创建了两个表,一个是本地表,另一个是一个分布式表。

  本地表面主要将替换的梅尔特里用于重型发动机。这些字段是Create_time创建时间,ID,注释和数据版本。该分区是用于格式化创建时间的TUYE区域,然后根据ID的ID。当前需求在同一ID上以真实时间数据进行更新。

  例如,在群集的两个碎片中,分为三个数据,插入2个数据是相同的ID(0),但是查询分布式表发现数据并不重。

  第一个解决方案是使用OptMize进行重型。在执行OptMize之后,通过查询本地表,发现OptMize在多部门和碎片中不会很重,并且只能在同一分区中很重。

  第二种方法是使用最终的重量。通过查询本地表格,发现数据仅在11号和12日仅保留一块数据。在多个分区之间可能很重,但不能是沉重的多片。

  因为我们的群集是多个片段,所以也是第三种方法 - 使用argmax。我们通过argmax添加了数据版本,我们可以选择最大的版本编号,然后查询分布式表,并发现argmax可能很重在多点电影中,这也是我们建议使用的一种方式。

  因此,实际 - 时间数据更新方法通常具有上述三种类型,但是各种方案的范围是不同的。我们可以根据自己的业务场景使用不同的目标。Optmize在分区内可能很重。最终可以在本地表格内部驱动器上,而Argmax在分配表中可能很重。

  接下来,让我们看一下实现的视图。使用实体视图,例如:过去3个小时的业务以及三天前的Sky -Grager数据数据。目前,实现的视图是一个不错的选择。因此,如何使用实体视图?让我们看一下这种情况。有一个详细的表测试。它有大约13亿行。目录聚集直接询问,发现大约需要2.1秒。查询如何变得更快?

  我们创建了一个实现的视图,以预处理原始表。实现的视图选择了求和件。这是一个聚合物引擎。您还可以选择其他引擎来聚合。它根据排序键汇总辅助聚合,即日期字段。还有一个选择语句,该语句批次编写以将此选择语句写入实体的视图列表中。

  创建实体视图后,我们去执行相同的陈述。查询性能提高了约113次,大约需要0.002秒。

  那么,可以实现这种效果的实现观点的原则是什么?总体显示在图中。

  实现的视图将创建一个隐藏的内表以将数据保存在视图中,然后实现的视图将写入原始表的数据,即通过第一个结果的内部表的结果,选择的聚合。然后根据排序键执行辅助聚合,以便将原始表的数据量减少,并可以加速查询。

  在正式介绍联接优化之前,请添加一些基本知识:本地表的查询是查询的一部分,以下行L称为本地表面。在进行此优化之前,请查看该过程总体分布式表执行。

  首先,分布式表将查询将查询分为本地表的查询。例如,在准确的城市之后,查询了查询分布式表,并将本地表发送到路线下每个碎片的本地表格。。

  上面显示了加入的执行过程。例如,选择ID,名称,从学生加入SCOR中得分,需要计算右表的结果,请发送请求,向每一块发送请求。如果有100件,则群集是需要100×100的一部分,每次扩展时,它都必须通过磁盘网卡,这将是时间 - 耗时。

  第一个优化是全局联接。在原始查询中,将首先计算右表,第一个分布式表被扩展,然后合并为临时表。假定它被命名为B004,这是第一次扩展的开始,它将发送临时表B004。碎片的所有计算部分的加入结果是第二个分布式表,然后第三步,合并2的结果是最终结果。这样,这样,如果我们有100件,则整体全局连接是,我们只需要2×100的查询部分,这大大减少了查询。

  第二个优化解决方案是本地联接,右表的分布式表已更改为表面。该方法的执行过程是我们需要扩展左表,只需要在左表上发送分布式表每件作品,右侧本身就是本地表。这是最终结果。如果总共有100件,您只需要启动100次并发送每个碎片,并且查询100次,。这将减少带宽的消耗并提高性能。

  您可以优先考虑本地加入,然后再加入全球连接,最后将小表放在右边,以便您可以提高连接的性能。

  以上是业务场景难度的一些优化技术。

  ------

  我们还希望获得高的并发查询并具有较大的吞吐量写作,但是在默认配置下,ClickHouse不支持高并发查询,并且也非常慢。这是我们业务中的两个主要疼痛点。让我们看看这两个场景。

  以真实的时间广告和单个项目为例,它用于实时产生广告效果。最终数据报告显示可帮助广告客户实施营销计划。如图所示,您可以看到每秒的Qps接近2000,这是618的屏幕截图。我们集群的总体配置是7个件6-复制1过程。硬件配置为42 32C128G,900G*3 SSD磁盘,整个集群的QPS可以达到2000。当然,如果要达到2000年,我们将进行一系列的技术优化。

  首先,技术优化的第一点必须增加副本,因为增加副本可以增强整个集群的并发能力。第二个是max_threads,减少每个查询的线程数量。如果ClickHouse未设置此参数,则将查询物理核心的所有线程,这将导致某些任务不可用,因此必须设置此参数。第三个是调整QUERY_THREAD_LOG的存储,因为大量数量QPS过来,将有很多请求日志。如果我们不调整存储空间,我们将很快填充磁盘,从而导致群集不可用。

  上图显示了优化之前和之后的最大稳定操作。在优化之后,它只能达到1000QPS。优化同一集群后,它可以在2000QPS附近运行,可以满足业务需求。

  第二个典型的业务是写出出色的吞吐量。以JD云监控项目为例,它负责JD云加载对日志的平衡访问。日志量非常大。单个集群写作的峰值每天可以达到6000亿件,并且可以维持数据。可以看出,群集每天约为3G/秒,并且促销可以达到6G/秒。我们的群集配置为60零件和两个副本1过程,硬件配置为120 64 -core 256G1T*1 SSD。

  通过这种群集配置,我们可以每天完成这6000亿次写作。为了支持这一数量的写作,我们还需要一系列技术优化。

  第一点是引入Chproxy的交通负载平衡,并将请求粒度完善到每个SQL,以便每个SQL请求都将路由到不同的部分。如果您不引入CHPROXY,您将直接连接客户端并通过群集连接群集域名。如果连接未及时发布,它将始终写入节点。很容易爆炸群集单节点。引入了CHPROXY的流量负载平衡后,可以将SQL平衡到每个节点。

  第二点是本地表的写作,可以改善整体写作表现,约为分布表的两到三倍。

  最后,让我们看一下每天的最大写作量。在优化之前,每天约为1000亿元。优化后,每天可以达到6000亿。

  ------

  在电子商务场景中,主要促销活动通常会遇到它,以确保OLAP服务的稳定性。

  促进战争的总体过程显示在我们需要在不同时期做不同的事情的图中。一开始,它是为了准备准备计划,收集业务资源,整理业务层面的准备工作,然后集群的容量扩展和压力测试以及断层钻的优化等。最后,我们欢迎门的开始以及决定性的战斗618。

  我们的OLAP如何保证业务?

  首先,收集和级别确认业务资源。在促销之前,我们的平台将收集资源并确认为企业的资源确认,并进行合理的计划和分销,以确保流量快速增加具有足够的资源支持操作。,对资源的需求可能具有新的在线业务,能力扩展业务,移民业务以及更换现有集群的业务。这些都在我们推广之前已经整理好了,以便我们可以提前制定计划。

  其次,业务团队应及时订阅监视和警报。例如,监视具有CH系统层,服务层以及对写作层的CH查询和监视。我们有两个警报系统:一个是服务层,例如某些监视CH的重要指标,ZK的一些监视警报以及Chproxy流量负载的某些监视警报;内存,磁盘和连接性,这些主要是监视硬件是否有故障。右图是一张图片警报和监视样本。我们可以通过它们维修集群故障。我们还需要业务团来订阅这些监视和警报,以监视整个集群的稳定性和可靠性。

  如何保证大型促销集群?

  第一点是压力测试。我们需要进行一些高尺寸和压力测试的结果。压力测量的结果必须设定合理的配额。例如,我们共享群集的CPU通常为40%,独家集群为80%。我们通过这些目标值为业务设定了合理的配额。如果压力测试存在问题,我们可以协助企业及时优化以满足其QPS和集群的稳定性。

  第二点是故障练习。有许多故障练习,第一个是双流动切换。例如,我们的零级业务是非常核心的业务。有必要在不同的计算机室中执行两个群集。如果同一计算机室有问题,请及时将其切成备份群集。另一个是故障的修复。失败后,我们必须通过控制面离线或更换,以确保群集的稳定性业务的可用性。

  第三点是降级措施。我们的降级措施将在不同的业务水平上合理分配,尤其是当我们不参加压力测试业务时。如果我们不参加压力测试,我们将在早期阶段降级业务防止其突然的交通影响促进促销的核心业务,以确保大时的整体集群稳定性。

  以上三点是我们集群保证的三个核心步骤。从高足够的压力测试开始到故障练习,再到最终降级措施,我们将与业务团队完成,以确保整体稳定的操作。

  ------

  问:您在此主题中遇到的最大挑战是什么?

  答:我遇到的最大挑战是解决高和合并的问题,因为当高度和头发的高度和头发时,QP可以超过2000,而我们的Clickhouse则默认情况下是100并发。我们在高方面进行了很多技术调整并发,可以允许企业达到较高和复杂的场景。遇到很多问题后,我们首先添加了多个副本(通常默认值是三个或两份副本以确保数据安全性),因为可以添加每个附加副本,我们可以整体上一块碎片。查询能力。我们还进行了一些参数调整。例如,如果共存高,则有很多队列。我们必须控制这些线程,否则很容易安排。加法,高平行场景将很容易填充群集中的某些日志,因为我们的每个查询都会记录日志,我们必须设置日志中的日志也是加快合并的必要条件,因为如果不加速合并,数据很慢,并且很容易填充磁盘。这是查询日志的一个方面。第三点是高头和头发很容易触发我们的一些配额限制,我们必须放大它。我们需要对内存执行一些限制。如果未执行这些限制或没有扩大这些限制,则无法实现QP,从而导致总体稳定性和可用性不足。

  另一个困难是加入的优化。效率优化之一是本地联接。我们还在本地联接中进行了许多测试。例如,与词典表进行比较,我们发现以下字典表的数据量100万是使用词典表来表现良好。我们发现使用本地联接是很好的。这个结论。一开始,我们都使用了词典来制作金眼刷,但是我们终于发现,在某个性能中,词典表不如词典本地表。大量的POC得出了这个结论。因此,每个人都可以在字典表和本地加入上进行全面的性能测试。

  以上是我们的两个挑战。

  问:什么是OLAP?主要引擎是什么?

  答:OLAP是一种在线多维和高性能实时分析服务。专业术语是在线链接。MySQL OLTP的在线交易查询是两种不同的类型。OLAP主要用于质量数据。

  我们的Jingdong零售主要使用两种引擎和Doris作为主要发动机,并将Doris用作两个引擎。现在最受欢迎的是Clickhouse,其次是Doris和Druid的两个引擎,但现在许多大型制造商,包括Tencent Ali Bytes,都在开发,转向点击室。当然,JD.com还应用了两三年的Clickhouse。我们还进行了一系列内核研发来解决某些Zookeeper的性能以及在线弹性望远镜系统的某些事情,因为Clickhouse是Clickhouse是在弹性望远镜系统中不是很好,因此我们也在做这项工作。

  问:如果您申请了这么多资源以供业务支持,如何考虑输入生产,请在业务情况下查看120高配置的机器?

  答:我们投资了120个单元,输出是平衡整个JD云的所有负载。首先,我们为什么使用120个单元,为什么我们使用SSD型号?为什么如此高的型机器?写作量很大,平均每日约为6000亿元人民币,在集群中写入约1000万秒的数据量。如果您不需要这样的高profile机器,则磁盘已经是SSD,并且其性能将永远无法达到性能。对此效果。第二点是输入输出比率。我们可以通过此群集监视整个JD云的日志,以及负载平衡的效果。例如,JD云,一个在外面,另一个在内部。监视和负载平衡非常重要,因此我们使用JD Rail OLAP监视Jingdong Cloud的整体效果以及整体稳定性。比率非常大。

  问:切换主库时数据是否有延迟,以及如何使用户感知最小值?

  答:主库切换,我们使用双写入过程。我们的核心业务是双重的。当促销时,将使用一个百分比,例如或以备用格式的其他群集的100%或100%,或者以一定比率约为80%-20%的双重写作。当业务切换时,基本上没有延迟,但是域名已切换。数据是实时编写的。这两个集群基本上没有延迟。这是我们要切换的功能。

  问:想问我们调整过程的过程是什么样的?

  答:我们的调整过程首先结合了自己的经验以优化某些参数,并将再次执行业务。由于您想实现如此大的QP和如此高的吞吐量,因此您通常应该执行压力测试。如果您在压力测试期间遇到问题,将分析内核源代码,然后将进行一系列参数调整或内核优化。这篇文章首次发表在微信公共帐户“ datafuntalk”中。

  原始:https://juejin.cn/post/7099040858921500686

猜你喜欢