嵌入在JVM中的ElasticSearch:等到准备好了

时间:2016-08-03 01:42:15

标签: java elasticsearch

在版本2中运行嵌入式ES的正确方法是什么?我正在玩2.3.4版,我遇到了一些麻烦,感觉很脆弱。

此版本1的博客http://geekabyte.blogspot.ro/2015/08/embedding-elasticsearch-in-spring.html主要适用。配置现在看起来像这样:

Settings.Builder settingsBuilder = Settings.builder();
settingsBuilder.put("node.name", "embedded-node");
settingsBuilder.put("path.home", "/existing/dummy/path/");
settingsBuilder.put("path.data", "/path/where/my/data/will/be/stored/");
settingsBuilder.put("http.enabled", false);

新要求"path.home"。我不明白为什么,它是嵌入式的。我已经看到有人将它设置为ES安装基础文件夹,但随后它会抛出" Jar hell"。将其设置为现有的空文件夹现在可以正常工作。 问题1 :有更好的方法吗?

我从网上复制粘贴的其他配置选项是:

settingsBuilder.put("client.transport.sniff", false);
settingsBuilder.put("index.number_of_replicas", 0);
settingsBuilder.put("index.number_of_shards", 1);
settingsBuilder.put("action.write_consistency", "one");

最后是创建节点的代码:

NodeBuilder.nodeBuilder()
            .settings(settings)
            .clusterName("embedded-cluster")
            .data(true).local(true).node();

问题2 :我是否需要明确告诉ES关闭?

我见过Difference between close and shutdown a node in elasticsearch?但似乎版本1,在我的API中没有这样的方法。

索引数据后,我等待

this.node.client().admin().indices().refresh(new RefreshRequest(indexName)).actionGet();

确保正确编入索引并可用。它在Integration test elastic search, timing issue, document not found

上提到过

JVM关闭后,使用索引的嵌入式数据存储重新启动,ES无法立即查询。我收到其中一个错误:

  

ClusterBlockException [阻止:[SERVICE_UNAVAILABLE / 1 / state not   恢复/初始化];]

  

执行阶段[query_fetch]失败,所有分片都失败

我目前的解决方案是在启动节点和查询节点之间等待3秒钟:

NodeBuilder.nodeBuilder()...node();
Thread.sleep(3000);
node.client().prepareSearch()...

问题3 :如何以编程方式等待ES准备好处理请求?

1 个答案:

答案 0 :(得分:1)

见Andrei Stefan的评论:

  

在运行搜索之前尝试一下   node.client().admin().cluster().prepareHealth().setWaitForGreenStatus() .execute().actionGet();

在较新的Elasticsearch版本中,特别是从版本6开始,嵌入式ES模式不再起作用。对于自动化测试设置,这对我有用:https://github.com/allegro/embedded-elasticsearch