0

我想使用多播功能设置一个elasticsearch集群。一个节点是外部elasticsearch节点,另一个节点是节点客户端(客户端属性设置为true-不保存数据)。

该节点客户端是使用 spring data elasticsearch 创建的。所以我想将postgresql数据库中的数据索引到外部elasticsearch节点。我已经使用jdbc River插件索引了数据。

但我想知道是否有任何应用程序可以用于来自 postgresql 的索引数据,而不是使用 River 插件

4

1 回答 1

5

可以实时执行此操作,尽管它需要编写专用的 Postgres->ES 网关并使用一些 Postgres 特定的功能。我在这里写过:http: //haltcondition.net/2014/04/realtime-postgres-elasticsearch/

原理实际上很简单,我想出的方法的复杂性是由于处理一些极端情况,例如多个网关运行和网关暂时不可用。简而言之,我的解决方案是:

  • 将触发器附加到所有感兴趣的表,将更新的行 ID 复制到临时表。
  • 触发器还发出一个行已更新的异步通知。
  • 一个单独的网关(我的是用 Clojure 编写的)连接到 Postgres 服务器并监听通知。这是棘手的部分,因为并非所有 Postgres 客户端驱动程序都支持异步通知(有一个新的实验性 JDBC 驱动程序可以支持,这是我使用的)。
  • 更新时,网关读取、转换数据并将其推送到 Elasticsearch。

在我的实验中,这个模型能够在 Postgres 行插入/更新后对 Elasticsearch 进行亚秒级的更新。显然,这在现实世界中会有所不同。

这里有一个带有 Vagrant 和 Docker 测试框架的概念验证项目:https ://bitbucket.org/tarkasteve/postgres-elasticsearch-realtime

于 2014-11-05T09:23:29.970 回答