PGSync是一个将Postgres中的数据毫不费力地同步到Elasticsearch的中间件,它允许您将Postgres作为您的真实源,并在Elasticsearch中创建结构化的非规范化文档。
对嵌套实体的更改会传播到Elasticsearch。PGSync的高级查询构建器随后会根据您的架构动态生成优化的SQL查询。PGSync的咨询模型允许您快速移动和转换大量数据,同时保持关系完整性。
只需用JSON描述您的文档结构或模式,PGSync将持续捕获数据中的更改并将其加载到Elasticsearch中,而无需编写任何代码。PGSync将您的关系数据转换为结构化文档格式。
它允许您直接从Postgres利用Elasticsearch的表达能力和可扩展性。您不必编写复杂的查询和转换流水线。PGSync是轻量级、灵活和快速的。
ElasticSearch更适合作为次要的非规范化搜索引擎,以配合更传统的规范化数据存储。此外,您不应该将主要数据存储在Elasticsearch中。
那么,首先如何将数据放到Elasticsearch中呢?Logstash和Kafka等工具可以帮助完成这项任务,但它们仍然需要一些工程和开发工作。
提取、转换、加载和变更数据捕获工具可能很复杂,并且需要昂贵的工程工作。
在较高级别上,您在Postgres数据库中有数据,并且希望将其镜像到Elasticsearch中。这意味着数据的每个更改(INSERT、UPDATE、DELETE和TRUNCATE语句)都需要复制到Elasticsearch。只需在更新数据库后添加一些代码将数据复制到Elasticsearch(或所谓的双重写入)。编写跨越多个表并涉及多个关系的SQL查询很难编写。检测嵌套文档中的更改也可能相当困难。当然,如果您的数据从未更改,则只需及时拍摄快照并将其作为一次性操作加载到Elasticsearch即可。
您在Postgres等关系数据库中已有数据,并且需要一个辅助NoSQL数据库(如Elasticsearch)来执行基于文本的查询或自动完成查询,以镜像现有数据,而无需您的应用程序执行双重写入。
您希望保持现有数据不受影响,同时通过公开数据视图而不影响关系数据的安全性来利用Elasticsearch的搜索功能。
或者您只是想公开关系数据的视图以用于搜索。
PGSync是用Python(支持3.6版以上)编写的,堆栈由:redis、Elasticsearch、postgres和SQlAlChemy组成。
PGSync利用Postgres(PostgreSQL 9.4中引入的)的逻辑解码功能来捕获连续的更改事件流。需要在Postgres配置文件中通过在postgresql.conf文件中设置来启用此功能:
PGSync通过为数据库中的表创建触发器来处理通知事件,从而在事件驱动模型中运行。
注意:如果您更改PGSync架构配置的结构,则需要重建Elasticsearch指示器。我们计划支持零停机迁移以简化此过程。
启用逻辑解码。您还需要在postgresql.conf中至少设置两个参数
使用pgsync--config schema.json或作为守护进程pgsync--config schema.json-d运行该程序。
Elasticsearch中的事务一致输出。这意味着:写入只有在提交到数据库时才会出现,插入、更新和删除操作的顺序与提交时的顺序相同(与最终的一致性相反)。
容错:即使进程崩溃或网络中断等,也不会丢失数据。进程可以从上一个检查点恢复。
支持任意深度的嵌套实体,即具有长关系依赖链的表。
支持Postgres JSON数据字段。这意味着:我们可以将数据库表中的JSON字段提取为结果文档中的单独字段。
使用PGSync,我们可以简单地定义这个JSON模式,其中BOOK表是透视表,透视表表示文档的根。
{";表";:";书";,";列";:[";ISBN";,";标题";,";描述";],";儿童";:[{";表";:";作者";,";列";:[";名称";]}]}。
[{";ISBN";:";9785811243570";,";标题";:";查理和巧克力工厂";,";描述";威利·旺卡著名的巧克力工厂终于开业了!";,";作者";:[";罗尔德·达尔&34;]},{#34;ISBN";:";9788374950978";,";标题";:";Kafka on the Shore";描述";:";Kafka on the Shore是日本作家村上春树2002年的小说,{";,";作者";:[";村上春树";,";菲利普·加布里埃尔";]},{";ISBN";:";9781471331435";,";标题";:";,";描述";:";1984年是乔治·奥威尔关于反乌托邦未来的令人不寒而栗的预言#34;,";作者";:[";乔治·奥威尔";]}]
选择JSON_BUILD_OBJECT(';ISBN';,BOOK_1.ISBN,';Title';,BOOK_1.Title,';Description';,BOOK_1.Description,';Authors';,ANON_1.Authors)作为";JSON_Build_Object_1";,book_1.id from book as book_1左外部联接(选择JSON_AGG(anon_2.anon)作为作者,book_Author_1.book_ISBN作为book_ISBN from book_Author作为book_Author_1左外部联接(选择Author_1.name作为匿名,ANON_2上的AUTHER_1.ID为AUTHER_1)AS ANON_2。id=BOOK_AUTHER_1.OUTHER_ID分组BY BOOK_AUTHER_1。BOOK_ISBN)ANON_1上的AS ANON_1。BOOK_ISBN=BOOK_1。ISBN。
{";ISBN";:";9781471331435";,";This_is_a_CUSTOM_TITLE";:";,";Desc";:";1984年是乔治·奥威尔关于反乌托邦未来的令人不寒而栗的预言。#34;,";贡献者";:[";George Orwell";]}。
如果我们已经有很多文档具有相同的作者,我们想要更改作者姓名怎么办?
PGSync是一种简单易用的变更数据捕获现成解决方案。
Elasticsearch是Elasticsearch BV的商标,在美国和其他国家注册。
此代码在GNU宽松通用公共许可证3.0版(LGPL-3.0)下发布。有关更多详细信息,请参阅许可证。
您应该已经收到了与PGSync一起的GNU宽松通用公共许可证的副本。如果没有,请参阅https://www.gnu.org/licenses/.