在 Springboot 应用程序上同步 Elasticsearch Postgresql

und*_*ver 6 architecture postgresql search search-engine elasticsearch

我将 Postgresql 作为我的主数据库,并且我想利用 Elasticsearch 作为我的 SpringBoot 应用程序的搜索引擎。

问题:查询非常复杂,每个表中有数百万行,大多数搜索查询都会超时。

部分解决方案:我利用了 Postgresql 中的物化视图概念,并运行了一个作业,每 X 分钟刷新一次它们。但在具有大量数据且正在进行其他数据库事务(尤其是写入)的系统上,视图往往需要很长时间才能刷新(刷新 5 个视图大约需要 10 分钟)。我意识到目前的观点已经达到极限,我无法添加更多。

就在那时,我开始探索其他搜索选项,最终选择了 Elasticsearch,它非常适合我拥有的数据量。作为 POC,我使用了 Logstash 的 Jdbc 输入插件,但它不支持 DELETE 操作(令人失望)。 从这里开始,软删除是我不能选择的选项,因为:A)几乎 postgresql 数据库中的所有表每隔几分钟就会更新一次,其中一些表对“name”键有约束,在这种情况下,该键将保留到干净为止。 -up 作业运行。B) 我的 Postgresql 数据库中的许多表都是通过 CASCADE DELETE 引用的,我不可能更新 220 表的架构和 JPA 查询来检查软删除布尔值。

上面链接中提到的同一问题还提供了PgSync,它可以定期将 postgresql 与 elasticsearch 同步。然而,我也不能同意,因为它有 LGPL 许可证,而我们组织禁止这样做。

我开始想知道是否还有其他人遇到过 elasticsearch 和 RDMS 的这种奇怪的限制。

我愿意接受其他选择,而不是使用 elasticsearch 来解决我的需求。我只是不知道什么是正确的堆栈。非常感谢这里的任何帮助!

小智 0

然后在图表上它看起来像这样

在连接关系型数据库的服务A中,需要实现一个更改、删除、更新数据的事件监听器。

然后,当数据发生变化需要删除或更新时,例如,生产者调用事件监听器,生产者将数据分发到队列中,并将其发送到某个主题,具体取决于数据需要的位置待写。

在服务 B 中,在消费者中,队列正在监听,它获取必要的数据并将其写入弹性搜索。