iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >有赞搜索系统的架构演进
  • 739
分享到

有赞搜索系统的架构演进

2023-06-05 05:06:26 739人浏览 八月长安
摘要

有赞搜索平台是一个面向公司内部各项搜索应用以及部分 NoSQL 存储应用的 PaaS 产品,帮助应用合理高效的支持检索和多维过滤功能,有赞搜索平台目前支持了大大小小一百多个检索业务,服务于近百亿数据。在为传统的搜索应用提供高级检索和大数据交

有赞搜索平台是一个面向公司内部各项搜索应用以及部分 NoSQL 存储应用的 PaaS 产品,帮助应用合理高效的支持检索和多维过滤功能,有赞搜索平台目前支持了大大小小一百多个检索业务,服务于近百亿数据。

在为传统的搜索应用提供高级检索和大数据交互能力的同时,有赞搜索平台还需要为其他比如商品管理、订单检索、粉丝筛选等海量数据过滤提供支持,从工程的角度看,如何扩展平台以支持多样的检索需求是一个巨大的挑战。

我是有赞搜索团队的第一位员工,也有幸负责设计开发了有赞搜索平台到目前为止的大部分功能特性,我们搜索团队目前主要负责平台的性能、可扩展性和可靠性方面的问题,并尽可能降低平台的运维成本以及业务的开发成本。

elasticsearch

Elasticsearch 是一个高可用分布式索引擎,一方面技术相对成熟稳定,另一方面社区也比较活跃,因此我们在搭建搜索系统过程中也是选择了 Elasticsearch 作为我们的基础引擎。

架构 1.0

时间回到 2015 年,彼时运行在生产环境的有赞搜索系统是一个由几台高配虚拟机组成的 Elasticsearch 集群,主要运行商品和粉丝索引,数据通过 Canal 从 DB 同步到 Elasticsearch,大致架构如下:

有赞搜索系统的架构演进

通过这种方式,在业务量较小时,可以低成本的快速为不同业务索引创建同步应用,适合业务快速发展时期,但相对的每个同步程序都是单体应用,不仅与业务库地址耦合,需要适应业务库快速的变化,如迁库、分库分表等,而且多个 canal 同时订阅同一个库,也会造成数据库性能的下降。

另外 Elasticsearch 集群也没有做物理隔离,有一次促销活动就因为粉丝数据量过于庞大导致 Elasticsearch 进程 heap 内存耗尽而 OOM,使得集群内全部索引都无法正常工作,这给我上了深深的一课。

架构 2.0

我们在解决以上问题的过程中,也自然的沉淀出了有赞搜索的 2.0 版架构,大致架构如下:

有赞搜索系统的架构演进

首先数据总线将数据变更消息同步到 MQ,同步应用通过消费 mq 消息来同步业务库数据,借数据总线实现与业务库的解耦,引入数据总线也可以避免多个 canal 监听消费同一张表 binlog 的虚耗。

高级搜索(Advanced Search)

随着业务发展,我们也逐渐出现了一些比较中心化的流量入口,比如分销、精选等,这时普通的 bool 查询并不能满足我们对搜索结果的细粒率排序控制需求,将复杂的 function_score 之类专业性较强的高级查询编写和优化工作交给业务开发负责显然是个不可取的选项,这里我们考虑的是通过一个高级查询中间件拦截业务查询请求,在解析出必要的条件后重新组装为高级查询交给引擎执行,大致架构如下:

有赞搜索系统的架构演进

这里另外做的一点优化是加入了搜索结果缓存,常规的文本检索查询 match 每次执行都需要实时计算,在实际的应用场景中这并不是必须的,用户在一定时间段内(比如 15 或 30 分钟)通过同样的请求访问到同样的搜索结果是完全可以接受的,在中间件做一次结果缓存可以避免重复查询反复执行的虚耗,同时提升中间件响应速度,对高级搜索比较感兴趣的同学可以阅读另外一篇文章《有赞搜索引擎实践(工程篇)》(见技术博客),这里不再细述。

大数据集成

搜索应用和大数据密不可分,除了通过日志分析来挖掘用户行为的更多价值之外,离线计算排序综合得分也是优化搜索应用体验不可缺少的一环,在 2.0 阶段我们通过开源的 es-hadoop 组件搭建 Hive 与 Elasticsearch 之间的交互通道,大致架构如下:

有赞搜索系统的架构演进

通过 flume 收集搜索日志存储到 hdfs 供后续分析,也可以在通过 hive 分析后导出作为搜索提示词,当然大数据为搜索业务提供的远不止于此,这里只是简单列举了几项功能。

问题

这样的架构支撑了搜索系统一年多的运行,但是也暴露出了许多问题,首当其冲的是越发高昂的维护成本,除去 Elasticsearch 集群维护和索引本身的配置、字段变更,虽然已经通过数据总线与业务库解耦,但是耦合在同步程序中的业务代码依旧为团队带来了极大的维护负担。消息队列虽然一定程序上减轻了我们与业务的耦合,但是带来的消息顺序问题也让不熟悉业务数据状态的我们很难处理。

除此之外,流经 Elasticsearch 集群的业务流量对我们来说呈半黑盒状态,可以感知,但不可预测,也因此出现过线上集群被内部大流量错误调用压到CPU占满不可服务的故障。

目前的架构 3.0

针对 2.0 时代的问题,我们在 3.0 架构中做了一些针对性调整,列举主要的几点:

  1. 通过开放接口接收用户调用,与业务代码完全解耦;

  2. 增加 proxy 用来对外服务,预处理用户请求并执行必要的流控、缓存等操作;

  3. 提供管理平台简化索引变更和集群管理 这样的演变让有赞搜索系统逐渐的平台化,已经初具了一个搜索平台的架构:

有赞搜索系统的架构演进

Proxy

作为对外服务的出入口,proxy 除了通过 ESLoader 提供兼容不同版本 Elasticsearch 调用的标准化接口之外,也内嵌了请求校验、缓存、模板查询等功能模块。

请求校验主要是对用户的写入、查询请求进行预处理,如果发现字段不符、类型错误、查询语法错误、疑似慢查询等操作后以 fast fail 的方式拒绝请求或者以较低的流控水平执行,避免无效或低效能操作对整个 Elasticsearch 集群的影响。

缓存和 ESLoader 主要是将原先高级搜索中的通用功能集成进来,使得高级搜索可以专注于搜索自身的查询分析和重写排序功能,更加内聚。我们在缓存上做了一点小小的优化,由于查询结果缓存通常来说带有源文档内容会比较大,为了避免流量高峰频繁访问导致 codis 集群网络拥堵,我们在 proxy 上实现了一个简单的本地缓存,在流量高峰时自动降级。

这里提一下模板查询,在查询结构(DSL)相对固定又比较冗长的情况下,比如商品类目筛选、订单筛选等,可以通过模板查询(search template)来实现,一方面简化业务编排DSL的负担,另一方面还可以通过编辑查询模板 template,利用默认值、可选条件等手段在服务端进行线上查询性能调优。

管理平台

为了降低日常的索引增删、字段修改、配置同步上的维护成本,我们基于 Django 实现了最初版本的搜索管理平台,主要提供一套索引变更的审批流以及向不同集群同步索引配置的功能,以可视化的方式实现索引元数据的管理,减少我们在平台日常维护上的时间成本。

由于开源 head 插件在效果展示上的不友好,以及暴露了部分粗暴功能:

有赞搜索系统的架构演进

如图,可以通过点按字段使得索引按指定字段排序展示结果,在早期版本 Elasticsearch 会通过 fielddata 加载需要排序的字段内容,如果字段数据量比较大,很容易导致 heap 内存占满引发 full GC 甚至 OOM,为了避免重复出现此类问题,我们也提供了定制的可视化查询组件以支持用户浏览数据的需求。

ESWriter

由于 es-hadoop 仅能通过控制 map-reduce 个数来调整读写流量,实际上 es-hadoop 是以 Elasticsearch 是否拒绝请求来调整自身行为,对线上工作的集群相当不友好。为了解决这种离线读写流量上的不可控,我们在现有的 DataX 基础上开发了一个 ESWriter 插件,能够实现记录条数或者流量大小的秒级控制。

挑战

平台化以及配套的文档体系完善降低了用户的接入门槛,随着业务的快速增长,Elasticsearch 集群本身的运维成本也让我们逐渐不堪,虽然有物理隔离的多个集群,但不可避免的会有多个业务索引共享同一个物理集群,在不同业务间各有出入的生产标准上支持不佳,在同一个集群内部署过多的索引也是生产环境稳定运行的一个隐患。

另外集群服务能力的弹性伸缩相对困难,水平扩容一个节点都需要经历机器申请、环境初始化、软件安装等步骤,如果是物理机还需要更长时间的机器采购过程,不能及时响应服务能力的不足。

未来的架构 4.0

当前架构通过开放接口接受用户的数据同步需求,虽然实现了与业务解耦,降低了我们团队自身的开发成本,但是相对的用户开发成本也变高了,数据从数据库到索引需要经历从数据总线获取数据、同步应用处理数据、调用搜索平台开放接口写入数据三个步骤,其中从数据总线获取数据与写入搜索平台这两个步骤在多个业务的同步程序中都会被重复开发,造成资源浪费。这里我们目前也准备与 PaaS 团队内自研的DTS(Data Transporter,数据同步服务)进行集成,通过配置化的方式实现 Elasticsearch 与多种数据源之间的自动化数据同步。

要解决共享集群应对不同生产标准应用的问题,我们希望进一步将平台化的搜索服务提升为云化的服务申请机制,配合对业务的等级划分,将核心应用独立部署为相互隔离的物理集群,而非核心应用通过不同的应用模板申请基于 k8s 运行的 Elasticsearch 云服务。应用模板中会定义不同应用场景下的服务配置,从而解决不同应用的生产标准差异问题,而且云服务可以根据应用运行状况及时进行服务的伸缩容。

--结束END--

本文标题: 有赞搜索系统的架构演进

本文链接: https://www.lsjlt.com/news/241322.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 有赞搜索系统的架构演进
    有赞搜索平台是一个面向公司内部各项搜索应用以及部分 NoSQL 存储应用的 PaaS 产品,帮助应用合理高效的支持检索和多维过滤功能,有赞搜索平台目前支持了大大小小一百多个检索业务,服务于近百亿数据。在为传统的搜索应用提供高级检索和大数据交...
    99+
    2023-06-05
  • 技术架构分享:美团配送系统架构演进实践
    美团配送自成立以来,业务经历了多次跨越式的发展。业务的飞速增长,对系统的整体架构和基础设施提出了越来越高的要求,同时也不断驱动着技术团队深刻理解业务、准确定位领域模型、高效支撑系统扩展。如何在业务高速增长、可用性越来越高的背景下实现系统架构...
    99+
    2023-06-05
  • 详解:知乎反作弊系统「悟空」架构演进!
    Hi there! 距离 2015 年 4 月「悟空」正式与大家见面,已经整整三个年头了。随着知乎的不断发展壮大,过去的一段时间,「悟空」不断面临着新的考验,并持续地在优化升级。接下来跟大家系统分享一下这几年「悟空」的架构演进和构建过程中积...
    99+
    2023-06-05
  • 今日头条架构演进之路——高压下的架构演进专题
    今天给大家分享今日头条架构演进,前面几位讲师讲了很多具体的干货,我的分享偏重基础设施及架构思路的介绍,我们想法是通过提供更好的基础设施,帮助架构做更好的迭代。从架构的角度,技术团队应对的压力最主要来自三方面:服务稳定性。接口的稳定性,让服务...
    99+
    2023-06-04
  • 途牛的服务器部署及架构有哪些演进
    本篇内容主要讲解“途牛的服务器部署及架构有哪些演进”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“途牛的服务器部署及架构有哪些演进”吧! 服务化推进  途牛的服务化始于2011年,当时途牛主要进行...
    99+
    2023-06-10
  • 苏宁易购CMS架构演进:泰坦平台的探索与实践!
    产品演变历程2012年苏宁易购所有的网站内容管理在核心主系统commerce上,完成了第一版本网站上线,并且形成了内容管理框架理论,后续产品和技术思路也是基于此框架演变2014年内容管理业务完成了从commerce中拆分,CMS 1.0版本...
    99+
    2023-06-05
  • 用 PHP 构建先进的搜索树数据结构
    使用 php 构建高级搜索树涉及创建节点类 (node) 和搜索树类 (searchtree),以及实现插入、查找和删除元素的方法。这些元素以对数时间复杂度存储在一个二叉树中,每个节点包...
    99+
    2024-05-07
    php 搜索树
  • Windows系统下如何进行多条件搜索
       直接使用自然语言搜索:在 Windows 7 系统中,打开资源管理器,点击“组织”->“文件夹和搜索”选项。   切换到“搜索&rdqu...
    99+
    2023-06-06
    Windows 搜索 系统 条件
  • 一个成熟的大型网站系统架构演化过程
    这篇文章主要介绍“一个成熟的大型网站系统架构演化过程”,在日常操作中,相信很多人在一个成熟的大型网站系统架构演化过程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”一个成熟的大型网站系统架构演化过程”的疑惑有所...
    99+
    2023-06-10
  • 分布式架构的演进过程是怎样的
    本篇内容介绍了“分布式架构的演进过程是怎样的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!架构是演变而来的,不是设计出来的。没有最好的架构,...
    99+
    2023-06-02
  • 服务器分布式架构的演进是怎样的
    本篇内容介绍了“服务器分布式架构的演进是怎样的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是分布式架构?分布式系统(distribut...
    99+
    2023-06-02
  • ETL架构中的子系统有哪些
    这篇文章主要讲解了“ETL架构中的子系统有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ETL架构中的子系统有哪些”吧!三个简单的字母,E-T-L,很容...
    99+
    2024-04-02
  • Cacti系统的架构和组件有哪些
    Cacti系统的架构和组件包括以下几个部分: 数据采集器(Data collector):负责收集网络设备、服务器等设备的性能数...
    99+
    2024-03-15
    Cacti
  • 怎么进行Linux系统内核架构分析
    这期内容当中小编将会给大家带来有关怎么进行Linux系统内核架构分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Linux系统中内核是一个非常重要的一部分,那么Linux内核具体是什么样子呢?下面本篇文...
    99+
    2023-06-28
  • 国内ERP系统和SAP系统架构有哪些差异
    国内ERP系统和SAP系统架构有哪些差异,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。系统构架是对已确定的需求的技术实现构架、作好规划,运用成套、完整的工具,在规划的步骤下...
    99+
    2023-06-05
  • Tomcat系统架构是怎样的
    这篇文章主要介绍“Tomcat系统架构是怎样的”,在日常操作中,相信很多人在Tomcat系统架构是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Tomcat系统架构是怎样的”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-27
  • Oracle ERP系统架构有哪些优缺点
    Oracle ERP系统的架构有以下优点和缺点:优点:1. 完整的功能覆盖:Oracle ERP系统提供了广泛的功能模块,覆盖了企业...
    99+
    2023-10-12
    Oracle
  • Prometheus系统的架构是怎样的
    Prometheus系统的架构主要包括以下几个组件: Prometheus Server:Prometheus服务器是整个架构的...
    99+
    2024-03-04
    Prometheus
  • Win10系统中Cortana搜索慢的解决办法
    进入Win10时代,Cortana的出现让桌面用户眼前一亮,这位数字助手能够与用户沟通,帮助用户更方便地使用电脑,其中搜索功能是主要的组成部分。不过由于种种原因,Cortana的搜索有时候会遇到问题,例如Win7升级到W...
    99+
    2023-05-21
    Win10 Cortana
  • CentOS系统里提高文本搜索效率的方法有哪些
    这篇文章主要介绍“CentOS系统里提高文本搜索效率的方法有哪些”,在日常操作中,相信很多人在CentOS系统里提高文本搜索效率的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CentOS系统里提高...
    99+
    2023-06-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作