有没有更聪明的方法来重新索引弹性搜索?

con*_*t47 43 ruby-on-rails elasticsearch

我问,因为我们的搜索是在不断变化的状态,因为我们工作的事情了,但每次我们作出改变指数(改变标记生成器或过滤器,或碎片/副本的数量),我们必须吹走整个索引和将我们所有的Rails模型重新索引回Elasticsearch ...这意味着我们必须考虑停机时间来重新索引所有记录.

是否有一种更聪明的方法可以做到这一点,我不知道?

ger*_*tas 70

我认为@karmi做对了.但是,让我解释一下它有点简单.我需要偶尔使用一些新属性或分析设置升级生产模式.我最近开始使用下面描述的场景来进行实时,恒定负载,零停机索引迁移.你可以远程做到这一点.

以下是步骤:

假设:

  • 你有索引real1和别名real_write,real_read指向它,
  • 客户端只写入real_write和读取real_read,
  • _source 文件属性可用.

1.新指数

real2使用您选择的新映射和设置创建索引.

2. Writer别名开关

使用以下批量查询切换写入别名.

curl -XPOST 'http://esserver:9200/_aliases' -d '
{
    "actions" : [
        { "remove" : { "index" : "real1", "alias" : "real_write" } },
        { "add" : { "index" : "real2", "alias" : "real_write" } }
    ]
}'
Run Code Online (Sandbox Code Playgroud)

这是原子操作.从这时起real2,所有节点上都会填充新客户端的数据.读者仍然使用旧的real1通道real_read.这是最终的一致性.

3.旧数据迁移

数据必须从迁移real1real2在,但是新的文件real2不能与旧条目被重写.迁移脚本应该使用bulkcreate操作的API (不是indexupdate).我使用简单的Ruby脚本es-reindex,它有很好的ETA状态:

$ ruby es-reindex.rb http://esserver:9200/real1 http://esserver:9200/real2
Run Code Online (Sandbox Code Playgroud)

更新2017您可以考虑使用新的Reindex API而不是使用脚本.它有许多有趣的功能,如冲突报告等.

4.读者别名开关

现在real2是最新的,客户正在写它,但他们仍在阅读real1.让我们更新读者别名:

curl -XPOST 'http://esserver:9200/_aliases' -d '
{
    "actions" : [
        { "remove" : { "index" : "real1", "alias" : "real_read" } },
        { "add" : { "index" : "real2", "alias" : "real_read" } }
    ]
}'
Run Code Online (Sandbox Code Playgroud)

5.备份和删除旧索引

写作和读取去real2.您可以real1从ES群集备份和删除索引.

完成!

  • 我们已将这个有用的脚本扩展为完整的gem:https://github.com/mojolingo/es-reindex (2认同)

kar*_*rmi 30

是的,有更聪明的方法可以在不停机的情况下重新索引数据.

首先,永远不要使用"最终"索引名称作为真正的索引名称.因此,如果您想将索引命名为"文章",请不要将该名称用作物理索引,而是创建索引,例如"articles-2012-12-12"或"articles-A","文章" -1"等

其次,创建指向该索引的别名"别名".然后,您的应用程序将使用此别名,因此您永远不需要手动更改索引名称,重新启动应用程序等.

第三,当你想要或需要重新索引数据时,将它们重新索引到不同的索引中,假设"articles-B"--Tire索引工具链中的所有工具都支持你.

完成后,将别名指向新索引.通过这种方式,您不仅可以最大限度地减少停机时间(没有任何停机时间),还可以获得安全快照:如果您以某种方式将索引编入新索引,您可以切换回旧索引,直到您解决问题.

  • @ karmi ..我在这里有疑问.在将数据迁移到新索引之后,您已经说过将别名指向新索引.但是,在数据迁移期间,如果没有停机时间,将会有更新的数据插入旧索引,新索引将不会有这些新数据.我们如何避免这种数据丢失? (3认同)
  • 这里描述的好文章:http://www.elasticsearch.org/blog/changing-mapping-with-zero-downtime/ (2认同)