【问题标题】:Ensuring ElasticSearch is in Sync with Database确保 ElasticSearch 与数据库同步
【发布时间】:2012-08-10 18:14:14
【问题描述】:

我正在考虑使用每日脚本来执行以下操作,以解决 ES 服务器上的更新出现问题的任何情况(我还没有高可用性设置,即便如此,它也是在 DB 和 ES 之间复制数据的情况下,这仍然可能是一个好习惯)。在把这个脚本放在一起之前,我想我会检查我是否以正确的方式进行,以及是否有任何库或技术我应该使用。

脚本将简单地从数据库中检索所有 ID,并从 ElasticSearch 中检索所有 ID,其中 created_at < current_time(当前时间的快照,因为它是脚本运行时的移动目标)。然后它将根据这些 ID 集之间的差异添加和删除 Elastic 搜索。

这听起来像一个合理的方法吗?

【问题讨论】:

    标签: ruby-on-rails ruby elasticsearch tire


    【解决方案1】:

    回答我的问题,这不是最好的方法。

    一种更简单但更耗费资源的方法是定期重新构建整个索引。当然,这在生产中很难做到,因为它会导致几分钟或几小时的停机时间,所以诀窍是重建一个新索引并切换到使用它。在 ElasticSearch 中,您不能重命名索引,但可以使用别名。

    讨论了here 的方法和轮胎用户here 的rake 任务。

    【讨论】:

      【解决方案2】:

      请查看jdbc-river 插件。这个插件相当稳定,可以用来在ES和数据库之间同步数据。

      【讨论】:

      • 我已经通过 Tire 在 Ruby 中进行了映射,因此除非有插件自动完成,否则没有太多理由切换到 Java 解决方案。
      • 你只需要安装这个插件并像这个查询一样映射数据库curl -XPUT 'localhost:9200/_river/my_jdbc_river/_meta' -d '{ "type" : "jdbc", "jdbc" : { "driver" : "com.mysql.jdbc.Driver", "url" : "jdbc:mysql://localhost:3306/test", "user" : "", "password" : "", "sql" : "select * from orders" } }'
      • 谢谢。我不确定这些类型的映射方式是否与 Tire 映射它们的方式相同。
      猜你喜欢
      • 1970-01-01
      • 2015-04-12
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 2020-06-09
      • 2017-02-07
      • 2011-07-14
      相关资源
      最近更新 更多