在我的ES群集中,我有10个分片和2个5个节点的副本。我刚刚向集群添加了一个新节点,它已与集群同步。状态为绿色,根据集群API,我们现在在集群中有6个活动数据节点。但是当我检查“' http://localhost:9200/_cat/shards'”时,没有为此节点分配任何分片。因此,没有弹性查询指向这个新添加的节点。此节点的日志文件没有什么特别之处:
public void fbLogin(View view)
{
// Before Edit:
// LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("user_photos", "email", "public_profile", "user_posts" , "AccessToken"));
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("user_photos", "email", "public_profile", "user_posts"));
LoginManager.getInstance().logInWithPublishPermissions(this, Arrays.asList("publish_actions"));
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>()
{
@Override
public void onSuccess(LoginResult loginResult)
{
// App code
}
@Override
public void onCancel()
{
// App code
}
@Override
public void onError(FacebookException exception)
{
// App code
}
});
}
有关如何解决此问题的任何特别意见?
答案 0 :(得分:0)
可能有几个可能的原因。
当节点离开集群或加入主节点时,会暂时延迟分片重新分配,以避免在重新平衡分片上浪费资源。 检查你的延迟超时。
curl -XPUT 'localhost:9200/<INDEX_NAME>/_settings' -d '
{
"settings": {
"index.unassigned.node_left.delayed_timeout": "30s"
}
}
您需要检查分片分配是否设置为false。再次启用分片重新分配。
curl -XPUT 'localhost:9200/_cluster/settings' -d
'{ "transient":
{ "cluster.routing.allocation.enable" : "all"
}
}'
如果以上所有都是好的,那么您需要检查主日志,了解为什么它没有向节点提供任何数据。在最坏的情况下,您可能需要重新启动群集,您可以一次滚动停止启动一个节点。
答案 1 :(得分:0)
在添加新节点时,Elasticsearch不会触发数据的重新平衡。实际上你真的不希望它,因为当它需要专注于索引文档和回答查询时,它可能会使你的网络饱和并给集群带来压力。
您可以通过_cluster / reroute API(https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-reroute.html)手动将分片移动到新节点
另一个选项(以及我倾向于用于此类事情的选项)是您可以将瞬态设置应用于基于磁盘的水印(例如https://www.elastic.co/guide/en/elasticsearch/reference/current/disk-allocator.html)。如果查看/_cat/allocation?v
并注意到旧节点的磁盘利用率(例如)为60%,则可以将高水位设置降低到55%,以便旧节点开始将数据发送到较新的,没有消耗的磁盘空间。如果这样做,请确保在ES移动数据后重置瞬态设置。