方案选择

由于是针对业务数据做全文搜索,数据存在数据库里,所以将这些数据同步到 ES ,怎么做呢,无非两种方式:一是通过 ES 的 API 进行增删改查,二是通过中间件进行数据全量、增量的同步。很明显 API 的方式比较麻烦,那就试试第二种吧。中间件的方式总共搜了三种方案:

方案1:elasticsearch-jdbc
一个 独立的第三方工具。使用很简单,写个 shell 脚本就行了:

这个工具的活跃度也很高,问题是它的版本兼容性:目前最高只兼容Elasticsearch2.3.4

elastic 官方已经把 Elasticsearch、Logstash 、Kibana 版本升级到5.x版本,现在统一是5.2.2,这和以前的2.x在插件机制上有一些差异,个人倾向于使用最新版,所以这个工具暂时放弃了。

方案2:logstash-input-jdbc
logstash 的一个jdbc 插件,ruby 写的,据说不太好装,logstash 印象里一直是做日志文件收集的,尤其我们的数据库不是常见的 mysql、oracle,而是 postgresql ,感觉趟这个坑的人不多,没信心一定能成功。

方案3 :PostgreSQL 的 ElasticSearch 同步插件
直接用 PostgreSQL 的插件,国内 PG 的大牛德哥在云栖社区贴了篇文章《PostgreSQL内核扩展之 - ElasticSearch同步插件》,写的很详细,显然这个方案跑通过了,所以就选了这个方案。

下面描述该方案实现方法。

multicorn简介

例如用户需要将数据库中某些数据同步到ES建立索引,传统的方法需要应用来负责数据的同步。这种方法会增加一定的开发成本,时效也不是非常的实时。

PostgreSQL的扩展插件multicorn,允许直接在数据库中读写ES,方便用户实时的在ES建立索引。

这种方法不需要额外的程序支持,时效也能得到保障。

安装过程

安装PostgreSQL 9.5。略,需要包含 --with-python

安装 ES on CentOS 7。略

安装PostgreSQL 插件 multicorn。

PostgreSQL提供的FDW接口,允许用户在数据库中直接操纵外部的数据源,所以支持ES只是一个例子,还可以支持更多的数据源。 这是已经支持的,几乎涵盖了所有的数据源。

https://wiki.postgresql.org/wiki/Fdw  

multicorn在FDW接口的上层再抽象了一层,支持使用python写FDW接口,方便快速试错,如果对性能要求不是那么高,直接用multicore就可以了。

开发人员如何编写FDW? 可以参考一下如下:

http://multicorn.readthedocs.io/en/latest/index.html

create extension

$ psql
postgres=# create extension multicorn ;
CREATE EXTENSION

基于multicorn创建es foreign server

CREATE SERVER multicorn_es FOREIGN DATA WRAPPER multicorn
OPTIONS (wrapper 'dite.ElasticsearchFDW'
);

创建测试表

CREATE TABLE articles (id serial PRIMARY KEY,title text NOT NULL,content text NOT NULL,created_at timestamp
);

创建外部表

CREATE FOREIGN TABLE articles_es (id bigint,title text,content text
) SERVER multicorn_es OPTIONS (host '127.0.0.1', port '9200', node 'test', index 'articles');

创建触发器

对实体表,创建触发器函数,在用户对实体表插入,删除,更新时,通过触发器函数自动将数据同步到对应ES的外部表。

同步过程调用FDW的接口,对ES进行索引的建立,更新,删除。

为什么mongodb/mysql与elasticsearch不需要创建触发器。这是应为第三方工具实现思路不一样,monstache和go-mysql-elasticsearch实现的是实时同步,不需要触发器,自动实现同步;而multicorn给用户提供了更灵活的方式,可以通过触发器选择数据同步时机。

CREATE OR REPLACE FUNCTION index_article() RETURNS trigger AS $def$BEGININSERT INTO articles_es (id, title, content) VALUES(NEW.id, NEW.title, NEW.content);RETURN NEW;END;
$def$ LANGUAGE plpgsql;CREATE OR REPLACE FUNCTION reindex_article() RETURNS trigger AS $def$BEGINUPDATE articles_es SETtitle = NEW.title,content = NEW.contentWHERE id = NEW.id;RETURN NEW;END;
$def$ LANGUAGE plpgsql;CREATE OR REPLACE FUNCTION delete_article() RETURNS trigger AS $def$BEGINDELETE FROM articles_es a WHERE a.id = OLD.id;RETURN OLD;END;
$def$ LANGUAGE plpgsql;CREATE TRIGGER es_insert_articleAFTER INSERT ON articlesFOR EACH ROW EXECUTE PROCEDURE index_article();CREATE TRIGGER es_update_articleAFTER UPDATE OF title, content ON articlesFOR EACH ROWWHEN (OLD.* IS DISTINCT FROM NEW.*)EXECUTE PROCEDURE reindex_article();CREATE TRIGGER es_delete_articleBEFORE DELETE ON articlesFOR EACH ROW EXECUTE PROCEDURE delete_article();

测试

curl 'localhost:9200/test/articles/_search?q=*:*&pretty'
psql -c 'SELECT * FROM articles'写入实体表,自动同步到ES
psql -c "INSERT INTO articles (title, content, created_at) VALUES ('foo', 'spike', Now());"
psql -c 'SELECT * FROM articles'查询ES,检查数据是否已同步
curl 'localhost:9200/test/articles/_search?q=*:*&pretty'更新实体表,数据自动同步到ES
psql -c "UPDATE articles SET content='yeay it updates\!' WHERE title='foo'"查询ES数据是否更新
curl 'localhost:9200/test/articles/_search?q=*:*&prett

需要更多教程,微信扫码即可

elastic search与postgresql的数据同步相关推荐

  1. elastic search与mysql的数据同步

    go-mysql-elasticsearch插件简介 go-mysql-elasticsearch是用于同步mysql数据到ES集群的一个开源工具,项目github地址: https://github ...

  2. MySQL 到 PostgreSQL 实时数据同步实操分享

    摘要:很多 DBA 和开发同学经常会遇到要从一个数据库实时同步到另一个数据库的问题,同构数据还相对容易,遇上异构数据.表多.数据量大等情况就难以同步.最近了解到一款实时数据同步工具 Tapdata C ...

  3. 大数据同步利器: 表格存储全增量一体消费通道

    表格存储(Table Store)是阿里云自研的NoSQL多模型数据库,提供海量结构化数据存储以及快速的查询和分析服务,表格存储的分布式存储和强大的索引引擎能够提供PB级存储.千万TPS以及毫秒级延迟 ...

  4. 大数据同步利器: 表格存储全增量一体消费通道 1

    表格存储(Table Store)是阿里云自研的NoSQL多模型数据库,提供海量结构化数据存储以及快速的查询和分析服务,表格存储的分布式存储和强大的索引引擎能够提供PB级存储.千万TPS以及毫秒级延迟 ...

  5. MySQL 到 MongoDB 实时数据同步实操分享

    MySQL数据怎么实时同步到 MongoDB 实践分享系列 摘要:很多 DBA 同学经常会遇到要从一个数据库实时同步到另一个数据库的问题,同构数据还相对容易,遇上异构数据.表多.数据量大等情况就难以同 ...

  6. 基于Elastic Search的推荐系统“召回”策略

    当我们打开一个资讯APP刷新闻时,有没有想过,系统是如何迅速推送给我们想看的内容?资讯APP背后有一个巨大的内容池,系统是如何判断要不要将某条资讯推送给我们的呢?这就是今天想跟大家探讨的问题--推荐系 ...

  7. MySQL 到 MySQL 实时数据同步实操分享

    摘要:很多 DBA 和开发同学经常会遇到要从一个数据库实时同步到另一个数据库的问题,同构数据还相对容易,遇上异构数据.表多.数据量大等情况就难以同步.最近了解到一款实时数据同步工具 Tapdata C ...

  8. MySQL 到 SQL Server 实时数据同步实操分享

    摘要:很多 DBA 和开发同学经常会遇到要从一个数据库实时同步到另一个数据库的问题,同构数据还相对容易,遇上异构数据.表多.数据量大等情况就难以同步.最近了解到一款实时数据同步工具 Tapdata C ...

  9. mysql和elastic search数据同步方案

    方案一 利用es api实时写入es中 优点:实时性高,能灵活控制写入es的时间 缺点:同步方案与业务逻辑耦合,严重依赖于es api,破坏了原有业务程序逻辑 demo:https://blog.cs ...

最新文章

  1. ABAP 向上取整和向下取整 CEIL FLOOR
  2. ECC6.0中数据导出到本地时报错GETWA_NOT_ASSIGNED
  3. win10自启动文件夹目录
  4. 纯css3实现的鼠标悬停动画按钮
  5. java遍历树结构数据_Java数据结构——二叉树的遍历(汇总)
  6. 洛谷 1057——台阶问题(递推与递归二分)
  7. 你的GAN再不听话,就把它暴力肢解了吧,有用 | Demo · 代码
  8. 《像计算机科学家一样思考Python(第2版)》——2.7 注释
  9. 获取文件绝对路径最后的文件夹名称
  10. php获取省市区区划代码,使用PHP解析行政区划代码
  11. 将Altera FPGA的sof文件和NIOS II的elf固件合并为一个jic文件以使用Quartus Programmer烧写
  12. 国科大学习资料--操作系统(杨力祥)--2015年思考题(含解答)
  13. silverlight文件下载方法
  14. oracle数据库审计要素,明御数据库审计及风险控制系统招标参数.docx
  15. 如何自动发送生日提醒和祝福
  16. java appdata_纯手写!!转移系统用户资料和更改AppData路径的方法 不接受反驳!...
  17. 转自国学大师--南怀谨先生
  18. 微信支付遇到 商户号该产品权限未开通,请前往商户平台产品中心检查后重试
  19. 关于促销活动页面测试的那些事儿
  20. 创建一个简单的springboot项目demo

热门文章

  1. 首批马云援欧口罩运抵比利时eWTP枢纽
  2. 蔚来汽车澄清“4年亏损57亿美元”说法:只有200亿人民币
  3. 特斯拉联合苹果发难 要对小鹏汽车“窃密”员工动手了...
  4. 令人窒息!iPhone充电时自燃烧毁房子,到底是谁的锅?
  5. 首次超过苹果!华为高端智能手机Q1国内市场出货量占48%
  6. 6月21日武汉见!华为nova 5正式官宣:麒麟980+40W快充
  7. 苹果挖迪士尼墙脚:喜获视频服务总监
  8. 结果出来了!视觉中国被罚30万 再次发布道歉声明...
  9. 新一季“十大最堵互联网公司”出炉:360百度腾讯跻身三甲
  10. 特斯拉花式作妖:停售Model S标准续航版 国内官网已下架