con*_*t47 43 ruby-on-rails elasticsearch
我问,因为我们的搜索是在不断变化的状态,因为我们工作的事情了,但每次我们作出改变指数(改变标记生成器或过滤器,或碎片/副本的数量),我们必须吹走整个索引和将我们所有的Rails模型重新索引回Elasticsearch ...这意味着我们必须考虑停机时间来重新索引所有记录.
是否有一种更聪明的方法可以做到这一点,我不知道?
ger*_*tas 70
我认为@karmi做对了.但是,让我解释一下它有点简单.我需要偶尔使用一些新属性或分析设置升级生产模式.我最近开始使用下面描述的场景来进行实时,恒定负载,零停机索引迁移.你可以远程做到这一点.
以下是步骤:
real1和别名real_write,real_read指向它,real_write和读取real_read,_source 文件属性可用.real2使用您选择的新映射和设置创建索引.
使用以下批量查询切换写入别名.
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.这是最终的一致性.
数据必须从迁移real1到real2在,但是新的文件real2不能与旧条目被重写.迁移脚本应该使用bulk带create操作的API (不是index或update).我使用简单的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而不是使用脚本.它有许多有趣的功能,如冲突报告等.
现在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)
写作和读取去real2.您可以real1从ES群集备份和删除索引.
完成!
kar*_*rmi 30
是的,有更聪明的方法可以在不停机的情况下重新索引数据.
首先,永远不要使用"最终"索引名称作为真正的索引名称.因此,如果您想将索引命名为"文章",请不要将该名称用作物理索引,而是创建索引,例如"articles-2012-12-12"或"articles-A","文章" -1"等
其次,创建指向该索引的别名"别名".然后,您的应用程序将使用此别名,因此您永远不需要手动更改索引名称,重新启动应用程序等.
第三,当你想要或需要重新索引数据时,将它们重新索引到不同的索引中,假设"articles-B"--Tire索引工具链中的所有工具都支持你.
完成后,将别名指向新索引.通过这种方式,您不仅可以最大限度地减少停机时间(没有任何停机时间),还可以获得安全快照:如果您以某种方式将索引编入新索引,您可以切换回旧索引,直到您解决问题.
| 归档时间: |
|
| 查看次数: |
26337 次 |
| 最近记录: |