干货 | 携程Elasticsearch数据同步实践

2024年01月数据月报 2024年01月数据月报,为您准备了阿里、字节、百度等大厂180多篇实践案例 阅读详情

作者简介

 

dot,携程技术经理,专注高并发、高性能领域。

一、背景

Elasticsearch是最近几年非常热门的分布式搜索和数据分析引擎,携程内部不仅使用ES实现了大规模的日志平台,也广泛使用ES实现了各个业务场景的搜索、推荐等功能。

本文聚焦在业务搜索的场景分享了我们在做数据同步方面的思考和实践,希望能对大家有所启发。

 

二、现状调研

数据同步是个很麻烦的事情,在各种论坛、分享中被大家反复讨论。

我们的需求大致包括全量、增量地从Hive、MySql、Soa服务、Mq等不同类型的数据源获取数据,部分数据还需要进行一定的计算或者转换,然后近实时地同步到ES中,以被用户搜索到。

 

为了讨论方便,假定本文的场景是文章搜索的场景:

1)索引内容为文章,主要的信息保存在article表里;

2)每个文章关联了tag,保存在article_tag表里;

3)tag表里的tagName也需要进入ES索引,以便使用标签名字搜索文章;

 

在以前同步这样的数据进入ES,单条文章的数据组装伪代码如下:

List<Long> tagIds = articleTagDao.query("select tagId from article_tags where articleId=?", articleId);
List<TagPojo> tags =tagDao.query("select id, name from tags whereid in (?)");
ArticleInEs articleInEs = new ArticleInEs();
articleInEs.setTagIds(tagIds);
articleInEs.setTagNames(tags.stream().filter(tag-> tagIds.contains(tag.getId())).map(TagPojo::getName).collect(Collectors.toList()));

只是一个标签的信息的组装代码就如此繁琐,而实际的情况要复杂得多。比如可能会有十几个乃至几十个ES索引字段,或者还要考虑代码、SQL性能以及业务逻辑,组装数据这个工作本身就已经让人头秃了,更别说可能还有业务的逻辑要处理了。

 

由于携程使用ES的业务非常多,迫切需要一个简单易用的框架或者工具完成这个工作,以便大家从繁琐重复的代码里脱身,专注在完成业务本身上。

 

开源社区有很多类似的实现,类似elasticsearch-jdbc、go-mysql-elasticsearch、Logstash等,经过评估我们认为存在以下问题,无法落地:

 

1)常见的工具都是基于配置的,固然非常方便,但是由于安全的原因,我们拿不到生产环境的DB的明文连接串,无法配置数据源;

 

2)从DB得到的数据有时候需要经过处理以后才能推送给ES,简单的基于配置的方式无法满足;

 

3)ES的用户名、密码等,我们不希望出现在配置中,需要有统一的地方对连接信息进行管理,以保证安全及便于维护;

 

4)数据的组装有的场景比较复杂,目前这些工具的配置写起来可能比代码还繁琐;

 

5)增量的数据来源,有时候是MQ,无法使用配置进行更新;

 

6)有的工具是单独的命令行,无法和我们的JOB结合(基于JAVA)

 

评估下来,发现这几个工具更适用于简单的DB数据,或者已经有了DB平表的场景。一则我们场景有比较复杂的,一则有平表的话同步到ES已经不是多麻烦的事情了。我们需要造一个车轮才能解决全部需求,除了满足以上提到的开源工具不支持的场景,还要保留他们的基于配置的机制,达到只完成必要的SQL、ES Mapping,和增加必要的数据源即可完成索引的创建工作。

 

三、实现思路

 

整体同步模块的结构如下:

 

我们从不同的维度来介绍组件的设计思路:

 

3.1 根据索引方式

1)第一种是全量同步,全量由于是对整个索引的变更,所以既要保证稳定,又要确保不会创建有问题的索引。

全量会从零创建一个全新的索引。同步开始前,会修改索引mapping的number_of_replicas为0、refresh_interval为-1等参数,以提高索引速度。同时增加了一个_indexTime的字段,表示本数据的更新时间,用于后续的查错、比对等;索引全部完成以后,增加了force merge、恢复mapping修改、_refresh等操作,保证建立的索引是尽可能紧凑的;通过定时确保索引的health索引是绿色的,以免未完全准备好切换后耗时不稳定;最后检查本次索引最终的有效文档数和线上有效索引的文档数的差值是否在配置的可接受范围内,如果不在则认为本次索引出错,删除本次索引内容。

 

2)第二种是MQ增量,携程内部使用QMQ接收了来自Otter的MySql变更,MQ里会有变化的数据库表、字段的信息,因此可以针对性地实现对MQ的解析的规则,从而可以轻而易举地达到通过MQ对ES里的文档进行全部、部分的索引。由于大部分情况MQ里的信息都比较少,因此更多的情况下,建议收到MQ以后,采用第三种方法进行增量。

 

3)第三种是Id增量,由使用方传入需要索引的Id列表,使用Id根据配置生成完整的文档提交到ES,以简化整个索引过程的模型。这种方法是最常用的,对临时更新数据也非常友好。如果提供的Id在最终的数据里没有发现,将删除ES里对应的数据,以处理数据在DB里被物理删除的情况。

 

4)最后一种是时间增量,组件会维护每个索引的更新时间,以确保增量JOB滚动执行的时候,新的数据总是能尽快地进入ES。由于该方案会要求定期查指定表里的最新数据,因此对DB不是很友好,大部分情况下我们并不是很建议使用该方法维护索引。

 

以上几种场景,全量、Id和时间增量,都要求配置能拼装出完整的文档,确保每次发送给ES的都是完整的文档。实现上需要确保建立全量的过程里发生的增量,在新建的索引切换到线上使用之前,能够同步到增量,这一步通常是在MQ里进行处理。

 

3.2 根据数据来源

1)基于SQL的配置,完成类似文章标签的关联,这种组装场景非常简单,有时候也是为了简化SQL或者优化SQL性能,而单独拎出来的查询;由于逻辑的通用型,因此内置了代码插件实现该类型数据的读取和组装。

 

2)基于代码的处理,适用于类似SQL不方便完成、需要从SOA服务查询数据,或者数据需要进行复杂处理的场景;这种需要使用自己根据组件的要求实现自定义插件,以提供数据给组件进行统一处理。

 

3.3 根据模块

1)Runner,是组件的调用总入口,负责参数的解析、Executor的生成、Rule等模块的初始化等。借助封装的友好型,Runner可以配合分布式JOB完成同一索引的并行建立,以加快整个索引的建立速度,这种并行方式在内部已经广泛使用。

 

2)Query,是整个内部流程的控制中心,负责根据Runner传入的参数,进行SQL的拼装、DB的读取、Executor和Plugin的调度等。不同的索引方式,需要对SQL进行不同的预处理,类似时间增量需要维护增量的时间等,也在该模块内完成。

为了简化开发成本,Query里也实现了执行配置里指定的Groovy脚本,在数据进入Executor前可以在脚本中进行处理,某些简单的场景里可以非常轻便地实现数据过滤和处理。

 

3)PluginManager,负责插件配置的解析、插件实例的生成、插件的调用管理等。我们归纳了常见的数据组装的方式,提供了几个内置的插件,基本上就能完成大部分基于DB的数据获取和组装。比如Assoc Plugin可以完成类似文章标签这种聚合场景,Map Plugin可以完成类似Map的映射场景,而Filter则支持对每一条数据进行简单的过滤处理,类似去Html、去重等。为了减少对DB的压力,内置的插件都支持设置数据的缓存时间,有效时间内,优先取内存里保存的数据。

 

4)Executor,用于接收来自Query的数据,完成真正落地动作。内置了两种Executor,使用方可以按照具体情况选择:

  • IndexExecutor,将数据通过Bulk方式提交数据到ES,从而更新ES索引;同时也要完成新索引的创建、索引状态的更新、别名切换等动作。

  • PersistExecutor,会把来自Query的数据,写入指定的数据库里的平表。这也能看出有平表的话,同步到ES已经很简单了。

5)RuleManager/Rule Loader,用于完成规则的加载和管理,支持从公司统一的QConfig或者当前工程的资源文件夹读取配置。插件实现了像ES一样的检测,对不符规范的配置会提供相应的报错,以减少因配置问题造成的数据错误。

 

四、小结

实际工作中,还有Hive到ES等场景,由于不在本组件范围内,因此文中没有讨论。目前我们也有场景是使用ES-Hadoop完成全量索引建立以后,使用本组件维护增量的。

 

目前已经有数个业务几十个索引使用了该组件维护索引,让研发人员最大程度的关注在业务逻辑上,而不被繁琐的重复代码所干扰。通过该组件,可以将不同数据源的数据,通过组装导出到ES索引中,也能导出到DB平表中,因此在部分数据同步的场景里也可以使用。

【推荐阅读】

 “携程技术”公众号

  分享,交流,成长

UR10e+D435+ag95夹爪 gazebo 仿真记录(一) 学习仿真环境gazebo下利用UR10e机械臂搭建模拟平台,此博客用于记录搭建过程!!主要参考光头明明、总有一天全城的人都要高看我们和bug404_三位博主。最终自己功能包的主要参考了bug404_的ur_platform,感觉这个结构比较合理。运行环境:Ubuntu18.04+Ros-melodic+Gazebo9。 阅读详情

相关推荐

hcaptcha-challenger:基于本地AI模型自动破解验证码的工程实践

验证码作为区分人类与机器的经典安全机制,其核心原理是通过图像识别、行为分析等交互式挑战来阻挡自动化程序。传统绕过方法依赖第三方打码平台或脚本,存在成本高、稳定性差的问题。随着多模态大语言模型和计算机视觉技术的发展,本地化AI求解成为新的技术方向,它通过集成YOLO、ResNet等模型,在本地完成图像语义理解,实现了高隐私、低成本、可进化的验证码自动化解决方案。这种范式尤其适用于需要大规模稳定处理网页交互的场景,如电商数据采集和社交媒体管理。hcaptcha-challenger项目正是这一理念的工程实践,它

weixin_42587866的博客 1025

Elasticsearch使用场景 有哪些?

Elasticsearch常用于以下场景: 日志分析和监控:Elasticsearch可以收集、存储和分析大量服务器日志数据,帮助您监控系统性能和查找故障。 搜索引擎:Elasticsearch可以构建高性能的搜索引擎,用于查询大量文档、网页和其他数据。 商业智能和数据分析:Elasticsearch可以用于处理和分析大量实时数据,以帮助企业做出更明智的决策。 安全性分析:Elastics...

weixin_35755434的博客 2783

Prompt Learning 简介

• Prompt Learning 可以将所有的任务归一化预训练语言模型的任务• 避免了预训练和fine-tuning 之间的gap,几乎所有 NLP 任务都可以直接使用,不需要训练数据。• 在少样本的数据集上,能取得超过fine-tuning的效果。• 使得所有的任务在方法上变得一致。

jxsdq的博客 1万+

Elasticsearch Top5典型应用场景

题记 刚接触Elasticsearch的朋友,或多或少会遇到一个问题,Elasticsearch在实际公司应用中除了搜索到底能做什么? 本文给出了答案。 除了“You Know, for Search”,Elasticsearch的使用会不断增长和变化。ObjectRocket作为一家托管云计算公司,已经在ObjectRocket平台上提供托管Elasticsearch一段时间了,并且能够看...

铭毅天下Elasticsearch 3万+

fins协议握手信号服务器响应,欧姆龙FinsTCP与FinsUDP协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析附含报文模拟器等...

前言 – Fins欧姆龙这个协议网上极少有相关的模拟器、Tcp的这一块倒是有但是Udp的基本都是不可用1、 Fins协议结构也很简单 协议分为两种 一种tcp一种udp2、 Tcp比Udp的报文会多一层tcp的head头部3、 Udp回应报文在Wireshark中是解析不到(因为他按照UDP的格式去解那指定是解不到)好长时间没有更新过博客了、也比较懒= = 。一、Read(TCP)发包那么这个就很...

weixin_32491317的博客 4436

全球最大光伏电池缺陷异常检测数据集PVELAD【发布】

下载地址 1:GitHub - binyisu/PVEL-AD 下载地址 2:http://aihebut.com/col.jsp?id=118 下载地址 3:NAVEDownload 竞赛测试系统:Photovoltaic cell anomaly detection | Kaggle 一、简介 PVEL-AD 数据集又叫做EL2021数据集是用于对光伏电池异常缺陷检测方法进行基准测试的数据集,重点是光伏电池工业检测。PVEL-AD包含 36,543 张具有各种内部缺陷和异构背...

苏打水的杯子的博客 2万+

ES的使用场景深入详解

Elasticsearch作为一种功能强大的搜索引擎和分析工具,在各个领域都有着广泛的应用。无论是日志分析、全文搜索、实时分析还是推荐系统等领域,它都可以帮助用户快速、准确地获取和处理数据,为决策提供有力的支持。ES(Elasticsearch)是一种基于Lucene库的开源、分布式、RESTful搜索引擎。它在全文搜索、结构化搜索、分析以及这三个领域的组合方面有着广泛的应用。

m0_58010546的博客 2662

ESP32+MAX7219二进制时钟设计与嵌入式时间映射实践

二进制时钟是嵌入式系统中数据表示与物理呈现深度耦合的典型范例,其核心在于将时间语义(年月日时分秒)解构为比特位,并通过LED点阵的空间权重布局实现直观识别。该设计依托RTC模块提供时间基准,依赖SPI协议完成微控制器与专用驱动芯片(如MAX7219)的可靠通信,涉及寄存器级配置、位图坐标变换、软硬件时序对齐等关键原理。技术价值体现在低资源占用下的高可读性人机交互,适用于教学演示、极客项目及嵌入式UI原型开发。本文聚焦ESP32平台在MicroPython环境下,结合MAX7219驱动8×8点阵实现高可靠性二

weixin_42160645的博客 299

ES 搜索场景具体应用

ES的使用场景梳理

yuhouwucaihong的博客 2330

激光可燃气体传感器DIY指南:从TDLAS原理到STM32实战(附代码)

本文详细介绍了如何DIY激光可燃气体传感器,从TDLAS原理到STM32实战,包括硬件选型、光路搭建、电子系统设计和嵌入式软件开发。通过TDLAS技术实现高灵敏度甲烷检测,适合工业安全和环境监测应用。附有完整代码和实用调试技巧,帮助开发者快速掌握光学气体检测技术。

fanta的博客 440

【异常】安装hermes-agent时提示GnuTLS recv error (-110): The TLS connection was non-properly terminated.

Git克隆仓库时出现TLS连接异常报错的解决方案摘要: 当执行git clone命令时遇到"GnuTLS recv error (-110)"报错,通常由网络不稳定、缓冲区不足或证书验证问题导致。主要解决方案包括:1)增大Git HTTP缓冲区(git config --global http.postBuffer 524288000);2)使用GitHub镜像站加速克隆;3)临时禁用SSL验证进行测试;4)检查并调整代理配置;5)改用SSH协议克隆。建议优先尝试增大缓冲区和镜像站方案,

奶爸的编程之路,也就一周冷个三天 1349

es搜索引擎

es

m0_73858774的博客 2546

10、硬件工程师笔试面试——继电器(2025版本)

在设计电路时,应综合考虑SSR的优势和局限性,确保选择合适的型号,并采取适当的设计措施来优化性能和可靠性。继电器的主要功能是利用较小的电流或电压来控制较大电流或电压的电路,实现信号的放大和隔离。在处理继电器故障时,应综合考虑电源、线圈、触点和负载等因素,及时进行故障诊断和处理,以确保电路系统的稳定性和安全性。由于汽车电子系统的复杂性,继电器的设计和选择必须考虑到系统的特定要求,包括电流容量、电压等级、环境条件(如温度、湿度、振动)以及所需的保护和隔离功能。确定线圈的工作电压或电流,以及吸合电压或电流。

XU157303764的博客 3732

es 删除数据_干货 | 携程Elasticsearch数据同步实践

作者简介dot,携程技术经理,专注高并发、高性能领域。一、背景Elasticsearch是最近几年非常热门的分布式搜索和数据分析引擎,携程内部不仅使用ES实现了大规模的日志平台,也广泛使用ES实现了各个业务场景的搜索、推荐等功能。本文聚焦在业务搜索的场景分享了我们在做数据同步方面的思考和实践,希望能对大家有所启发。二、现状调研数据同步是个很麻烦的事情,在各种论坛、分享中被大家反复讨论...

weixin_39859819的博客 312

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

干货 | 携程酒店搜索引擎AWS上云实践

作者简介宮娴,携程高级后端开发工程师;Spike,携程高级后端开发专家。随着携程国际化业务的快速推进,搜索引擎作为用户体验中至关重要的一环,上云变得志在必行。本文主要分享酒店搜索引擎迁移AWS的探索与实践过程,内容将涵盖一个HTTP请求的全链路处理过程:包括从APP发出请求到网关,再到内网错综复杂的微服务,最后到所依赖的各种持久化存储。一、微服务架构带来的挑战这次上云的...

携程技术 2785

android 蓝牙通讯demo

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

干货 | 携程机票大数据架构最佳实践

本文转载自 携程技术中心(ctriptech) 公众号,本文PPT请点击下面 阅读原文 获取  作者简介 许鹏,携程机票大数据基础平台Leader,负责平台的构建和运维。深度掌握各种大数据开源产品,如Spark、Presto及Elasticsearch。著有《Apache Spark源码剖析》一书。本文来自许鹏在〖DAMS 2017中国数据资产管理峰会〗上的分享,首发DBAplus社群(ID:db

Hadoop技术博文 3994

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

作者简介岳毅,携程高级研发经理,负责酒店数据智能平台研发,大数据技术创新工作。喜欢探索研究大数据的开源技术框架。背景随着大数据不断地融入到工作中,如何使大量的数据资产变现,并提供有价值...

携程技术 3497

mysql读数据入库es_es数据库查询

DB 与 Elasticsearch 混合之应用系统场景分析探讨作者介绍李猛,Elastic Stack深度用户,通过Elastic工程师认证,2012年接触Elasticsearch,对Elastic Stack技术栈开发、架构、运维等方面有深入体验,实践过多种大中型项目;为企业提供Elastic Stack咨询培训以及调优实施;多年实战经验,爱捣腾各种技...文章工程师甲2020-05-282...

weixin_39939601的博客 1065

干货 | 万字长文详解携程酒店订单缓存 & 存储系统升级实践

作者简介荣华,携程高级研发经理,专注于后端技术项目研发管理。军威,携程软件技术专家,负责分布式缓存系统开发 & 存储架构迁移项目。金永,携程资深软件工程师,专注于实时计算,数据分析工程。俊强,携程高级后端开发工程师,拥有丰富SQLServer使用经验。前言携程酒店订单系统的存储设计从1999年收录第一单以来,已经完成了从单一SQLServer数据库到多IDC容灾...

携程技术 2053

快手、携程等公司转战到 ClickHouse,ES 难道不行了?

上一篇:3600万中国人在抖音“上清华”0、2T架构师学习资料干货分享茉莉花,别名:茉莉,拉丁文名:Jasminum sambac (L.) Ait,木犀科、素馨属直立或攀援灌木,高达3米...

emprere的博客 1031

重磅 | 死磕 Elasticsearch 方法论认知清单(2021年国庆更新版)

每个人都会犯错,别再让相同的错误一再发生,别再让我们为那些错误付出沉痛的代价。清单不是写在纸上的,而是印在心上的。我们别无选择,清单,正在一步步变革我们的生活,变革这个复杂的世界........

铭毅天下Elasticsearch 4316

【干货】逛了4年Github ,一口气把我收藏的 Java 开源项目分享给你!

教程 Java JavaGuide :【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。 CS-Notes :技术面试必备基础知识、Leetcode 题解、后端面试、Java 面试、春招、秋招、操作系统、计算机网络、系统设计。 advanced-java :互联网 Java 工程师进阶知识完全扫盲:涵盖高并发、分布式、高可用、微服务、海量数据处理等领域知识。 architect-awesome :后端架构师技术图谱。 toBeTopJavaer :Java工程师成神之路 。 t

weixin_48791363的博客 312

clickhouse 查询优化_查询提升 200 倍,ClickHouse 你值得拥有!

作者:起个帅的名来源:https://juejin.im/post/6863283398727860238ClickHouse 是 Yandex(俄罗斯最大的搜索引擎)开源的一个用于实时数据分析的基于列存储的数据库,其处理数据的速度比传统方法快 100-1000 倍。ClickHouse 的性能超过了目前市场上可比的面向列的 DBMS,每秒钟每台服务器每秒处理数亿至十亿多行和数十千兆字节的数据。C...

weixin_31857829的博客 430

查询提升 200 倍,ClickHouse 你值得拥有!

Java技术栈www.javastack.cn关注阅读更多优质文章作者:起个帅的名来源:https://juejin.im/post/6863283398727860238ClickHo...

Java技术栈,分享最主流的Java技术 717

clickhouse 删除表_查询提升 200 倍,ClickHouse 你值得拥有!

Java技术栈www.javastack.cn关注阅读更多优质文章作者:起个帅的名来源:https://juejin.im/post/6863283398727860238ClickHouse 是 Yandex(俄罗斯最大的搜索引擎)开源的一个用于实时数据分析的基于列存储的数据库,其处理数据的速度比传统方法快 100-1000 倍。ClickHouse 的性能超过了目前市场上可比的面向列...

weixin_39995764的博客 530

Elasticsearch的使用场景深入详解

2. **高性能查询和数据分析**:利用倒排索引和缓存技术,Elasticsearch能够快速响应用户的搜索需求,同时支持复杂的数据分析和聚合操作,适用于需要快速读取和分析大量数据的场合。4. **日志和事件数据分析**:由于其高性能和实时性特点,Elasticsearch广泛用于日志和事件数据的收集、存储以及分析,是构建日志分析系统和监控系统的常用工具。5. **安全和合规性分析**:Elasticsearch可以帮助企业监控和分析安全事件,满足合规性要求的数据报告和分析。

Clihome的博客 582
上一篇: 干货 | PID算法在广告成本控制领域的应用
下一篇: 干货 | 携程移动直播探索
携程技术
博客等级 码龄10年 3715粉丝 324原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值