Elasticsearch数据库同步

时间:2015-02-11 19:08:20

标签: elasticsearch elasticsearch-plugin elasticsearch-jdbc-river

我使用jdbc river同步Elasticsearch和数据库。已知的问题是从数据库中删除的行仍保留在ES中,jdbc river插件无法解决这个问题。 jdbc river的作者提出了解决问题的方法:

  

一种好的方法是加窗索引。每个时间范围(可能每天一次或每周一次)为河流创建一个新索引,并添加到别名中。旧的>索引将在一段时间后被删除。此维护类似于> logstash索引,但它超出了河流范围。

我的问题是,这对于精确的方式意味着什么?

假设我在数据库中有一个名为table1的表,有100万行,我的尝试如下:

  1. 使用index1创建名为river1的河流。 index1包含索引 table1的行。将Index1添加到别名。
  2. table1中的某些行在白天被删除,因此每天晚上我创建另一条名为river2的河流,其中index2为 仅包含table1中现在的内容。
  3. 从别名中删除旧的index1并将index2添加到别名。
  4. 删除旧的index1。
  5. 这是正确的方法吗?

2 个答案:

答案 0 :(得分:2)

如何使用_ttl字段?将SQL语句中的静态_ttl定义为比SQL更新频率更长。

当河流计划运行频率超过1小时时,SQL会是这样的:

"select '1h' as _ttl, some_id as _id, ..."

这样,当河流运行时,_ttl会更新,但删除的行不会更新,并且会在_ttl到期时从ES中删除。

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-ttl-field.html

答案 1 :(得分:0)

是的,可以使用_ttl字段完成,但我使用脚本解决了它。

每晚脚本都以索引表开始,并为该日创建索引。索引可以持续几个小时。

另一个脚本定期从localhost:9200/_river/jdbc/*/_state?pretty读取输出并检查是否所有河流都已完成(通过检查lastEndDate字段的存在)。当所有河流都完成后,使用新创建的索引刷新别名。旧索引被删除。