【AICon】 如何构建高效的 RAG 系统?RAG 技术在实际应用中遇到的挑战及应对策略?>>> 了解详情
写点什么

将数据从 PostgreSQL 同步到 Elasticsearch 的经验总结

  • 2015-01-07
  • 本文字数:1418 字

    阅读完需:约 5 分钟

Elasticsearch 是一款基于 Apache Lucene 构建的开源全文检索引擎,它能够轻松地进行大规模的横向扩展,以支撑 PB 级的结构化和非结构化海量数据的处理。而关系型数据库比较擅长对数据的管理,但对全文检索功能的支持相对不足,所以有时候一些实际项目需要将关系型数据库中的数据同步到 Elasticsearch 中,以提供更加强大的全文检索功能。另外,一些基于关系型数据库的历史遗留系统的存在,当遇到全文检索的新需求时,就更加需要将数据同步到 Elasticsearch 中。近日,在线银行支付平台 GoCardless 的软件工程师 Chris Sinjakli 发表了一篇题为《将数据从 PostgreSQL 同步到 Elasticsearch 的经验教训》的博文。在文章中,他结合自己的实际经历(GoCardless 使用Elasticsearch 增强搜索功能)总结了将数据从关系型数据库 PostgreSQL 同步到 Elasticsearch 的经验教训。

Chris 首先指出当需要把数据同时存储到 PostgreSQL 和 Elasticsearch 两个地方时,开发者需要深入考虑的一些问题,如当 Elasticsearch 处理有很大延迟时将会发生什么未知事情、如果更新时出现异常将会发生什么情况、怎么知道 Elasticsearch 正确处理了每次更新等。接下来 Chris 引出要解决以上问题必须做到异步的更新、达到最终一致性、进行索引重建。

关于如何做到异步更新,Chris 指出 GoCardless 开发团队构造了一个队列用于数据的异步同步,且通过线程池来协助处理。这样既可以单独更新,也可以批量更新,并使用基于 JSON 格式的数据和利用 Elasticsearch 的 API 保证了响应时间和可预知性。

关于如何确保一致性,Chris 指出 Elasticsearch 的更新API 不具有线程安全性,尤其在高并发更新时。如果只是调用该更新API 来索引更新数据的话,就有可能引起并发问题。不过,Elasticsearch 提供了一个具有乐观锁的索引版本系统,通过该系统就可以做到安全的更新。但是当在更新索引的同时,用户还是有可能搜索出脏数据。庆幸的是,Elasticsearch 还提供了另一种处理索引版本的方案,该方案是由发起请求的外部程序来设置版本类型并提供版本号,这样使得Elasticsearch 总是保持同步的文档具有最高版本号。GoCardless 开发团队考虑到PostgreSQL 的事务ID(64 位整数)在保证事务情况下能够实现自增,所以GoCardless 开发团队就使用PostgreSQL 的事务ID 作为版本号。这样就可以实现每次同步到Elasticsearch 的数据都是最合适的(尽管不是最新的),但最后仍会达到数据的一致性。

关于如何重建索引,Chris 指出以上的异步方式仍然存在丢失更新的可能,如网络分区下引起的问题。为了处理以上问题,GoCardless 开发团队采取周期地将最近写入到PostgreSQL 的记录进行一次批量同步并使用Elasticsearch 的 Bulk API 重新批量索引所同步数据的方案。该方案以较小的重复记录为代价彻底解决了更新丢失的问题,并且只需使用与原来同样的代码和在无需停止服务器的情况下即可实现索引重建。Chris 还特别指出,如果想在无需停止服务器的情况实现重建索引,这就需要从一开始就正确地使用 Elasticsearch 的索引别名。

最后,Chris 指出如果要构建更加良好的搜索体验,还有很多工作需要做,尤其是不同的应用程序有着不同的约束条件,所以他建议开发者在开始编写产品代码前就要深入思考相关问题及处理方案。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2015-01-07 03:3110956
用户头像

发布了 92 篇内容, 共 44.7 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

区块链信息共享应用落地搭建解决方案

t13823115967

区块链+ 区块链应用 信息共享

Scala中String和Int隐式转换的问题分析

木子李G

scala 大数据 编程 隐式转换

恕我直言!有了这份MySQL学习文档,你收藏夹里的其他MySQL学习资料都可以扔了

Java架构之路

Java 程序员 架构 面试 编程语言

动态高并发时为什么推荐ReentrantLock而不是Synchronized?

moon聊技术

JVM 并发 synchronized ReentrantLock 锁升级

超详细讲解!Android面试真题解析火爆全网,搞懂这些直接来阿里入职

欢喜学安卓

android 编程 程序员 面试 移动开发

《数据结构与抽象:Java语言描述》.pdf

田维常

数据结构

仅凭这份Java大纲笔记,我如愿拿到了阿里offer。

Java架构之路

Java 程序员 架构 面试 编程语言

刚拿到蚂蚁金服架构师offer!大佬教你如何成为offer收割机

比伯

Java 编程 架构 面试 计算机

智慧警务开发,二维码定位报警系统搭建

t13823115967

智慧公安 智慧公安扫码

港美股交易系统开发框架构造简述篇

软件开发大鱼V15988750073

国际配售 港股交易系统开发 证券交易系统 资管系统 港股打新系统

请问如何短时间突击 Java 通过面试?

Java架构师迁哥

某美女的程序员老公半夜都还不回家,原来是偷偷在公司看Redis+JVM+Spring cloud+MySQL技术文档

Java架构之路

Java 程序员 架构 面试 编程语言

Github 2020 年度报告:你以为新冠击溃了开发者?不!他们创造了更多代码...

阿里巴巴云原生

开源 Serverless 程序员 代码

Mybatis动态映射,so easy啦

田维常

助力孩子走上学霸之路,K12学习神器现已面世!

E科讯

SGY奇点交易所系统软件APP开发

系统开发

话题讨论 | 程序员自己电脑中毒是甚么体验?

xcbeyond

话题讨论

用60行代码实现一个高性能的圣诞抽抽乐H5小游戏(含源码)

徐小夕

Java 大前端 H5游戏 H5

新思科技最新报告显示开源安全是首要考虑因素

InfoQ_434670063458

服务于阿里、滴滴、华为等一线互联网公司的分布式消息中间件RocketMQ核心笔记

Java架构追梦

Java 架构 面试 RocketMQ 消息中间件

EPBC环保生态链系统开发案例丨环保生态链EPBC源码平台

系统开发咨询1357O98O718

环保链APP系统开发案例

四面腾讯pcg后端开发岗,一个星期面完成功拿到20K的offer。分享面经

Java架构之路

Java 程序员 架构 面试 编程语言

区分Protobuf 3中缺失值和默认值

Gopher指北

protobuf Go 语言

iOS面试基础知识 (一)

iOSer

ios 面试 runtime 编程开发 iOS Developer

SGY奇点交易所系统软件开发|SGY奇点交易所APP开发

系统开发

还有谁比阿里人更懂SpringCloud Alibaba 呢?P8大牛纯手打笔记免费分享!

Java架构之路

Java 程序员 架构 面试 编程语言

了解OAuth2.0

环信

DolphinDB与Elasticserach在金融数据集上的性能对比测试

DolphinDB

数据处理 金融 时序数据库 tsdb DolphinDB

阿里架构师经验分享!啃完999页Android面试高频宝典,面试心得体会

欢喜学安卓

android 程序员 面试 移动开发

JS&Swift

ios swift

区块链BaaS应用平台开发

13828808769

将数据从PostgreSQL同步到Elasticsearch的经验总结_语言 & 开发_李士窑_InfoQ精选文章