PostgreSQL与Elasticsearch和PGSync的实时数据集成 -Tolu


PGSync是一个变更数据捕获工具,用于将数据从Postgres转移到Elasticsearch。它允许你保留Postgres作为你的真实来源,并在Elasticsearch中公开结构化的非规范化文档。
这对于构建后端服务以驱动文本搜索应用或构建实时仪表盘应用非常有用。
对嵌套实体的改变会传播到Elasticsearch。
PGSync的高级查询生成器会根据你的模式生成SQL查询。
只需用JSON描述你的模式,PGSync就会持续捕捉你的数据变化,并将其加载到Elasticsearch中。
PGSync提供了一个自我管理的变化数据捕获解决方案。
 
原有问题
在高层次上,你在Postgres数据库中拥有数据,你想在Elasticsearch中展示它。这意味着你的数据的每一个变化都需要被复制到Elasticsearch中。

起初,这似乎很容易,然后就不容易了。只需添加一些代码,在更新数据库后将数据复制到Elasticsearch,或者在你的应用层面上执行所谓的双重写入。编写跨越多个表和涉及多个关系的SQL查询可能不是件容易的事。检测嵌套文件中的变化也可能相当困难。
当然,如果你的数据从未发生过变化,那么你可以直接拍下时间快照,然后将其加载到Elasticsearch中。请记住,你不应该真的把你的主要数据存储在Elasticsearch中。
Elasticsearch更适合作为一个次要的非规范化搜索引擎,与传统的规范化数据存储一起使用。

其中一个挑战是在合理的时间范围内将数据从真实源中取出并放入二级存储。
现有的工具,如Apaches的Kafka、Amazons的Kinesis或Elastics的Logstash需要相当多的工程和专业知识。

如何解决问题
PGSync利用PostgreSQL 9.4中引入的Postgres的逻辑解码功能来捕获连续的变化事件流。

PGSync的查询生成器能够根据你的模式动态地建立高级关系查询。

只需在Elasticsearch中定义一个描述数据结构的模式(JSON),引导数据库并启动PGSync守护程序。

它同时运行一个轮询和一个事件驱动的模型,以捕获到日期的变化,并通知在某个时间点发生的变化。最初的同步会轮询数据库自上一次迭代以来的变化,此后对数据库的变化恢复到事件通知(基于触发器并由pg-notify处理)。

不需要用诸如 "updated_at"、"timestamp "或 "status "等字段来污染你的数据库,以检测和跟踪行级变化。
 
PGSync降低了大多数应用程序堆栈的复杂性。

  •     Postgres是你的读/写事实来源,而Elasticsearch是你的只读搜索层。
  •     你有不断变化的数据。
  •     你在现有的关系型数据库(如Postgres)中拥有数据,你需要一个辅助的NoSQL数据库,如Elasticsearch,用于基于文本或自动完成查询。
  •     你想避免其他工具所规定的开发开销和复杂性。

 
安装需要:
Prerequisites: Python 3.6+, Redis 3.1.0+, Elasticsearch 5.0+, PostgreSQL 9.4+.
Install PGSync from PyPi.
$ pip install pgsync
$ pgsync --config <absolute path to JSON schema config> --daemon

 源码:Github repository.