设为首页 收藏本站
查看: 2636|回复: 0

[经验分享] 将数据从PostgreSQL同步到Elasticsearch的经验总结

[复制链接]

尚未签到

发表于 2019-1-29 11:02:19 | 显示全部楼层 |阅读模式
  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)关注我们,并与我们的编辑和其他读者朋友交流。

  •   本文来自:Linux教程网


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-669100-1-1.html 上篇帖子: 让我们ElasticSearch作伴,一起潇洒复习~ 下篇帖子: elasticsearch建立索引操作的API
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表