我们遇到了一个生产事件,Elasticsearch集群运行状况检查返回了red
状态。运行状况检查报告显示marvel-2019.06.20
有2个unassigned_shards,这似乎是根本原因。
curl -XGET 'localhost:9200/_cluster/health?level=indices&pretty'
{
"cluster_name" : "sap-jam-jam8",
"status" : "red",
"timed_out" : false,
"number_of_nodes" : 2,
"number_of_data_nodes" : 2,
"active_primary_shards" : 122,
"active_shards" : 239,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 7,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"indices" : {
...
...
".marvel-2019.06.20" : {
"status" : "red",
"number_of_shards" : 1,
"number_of_replicas" : 1,
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 2
}
}
我们检查了Elasticseach的配置,发现cluster.routing.allocation
已被禁用。
curl -XGET 'localhost:9200/_cluster/settings?pretty'
{
"persistent" : { },
"transient" : {
"cluster" : {
"routing" : {
"allocation" : {
"enable" : "none"
}
}
}
}
}
按照this stackoverflow post的建议,我们强制分配了一个分片,此问题已消失。
curl -XPOST -d '{ "commands" : [ {
"allocate" : {
"index" : ".marvel-2014.05.21",
"shard" : 0,
"node" : "SOME_NODE_HERE",
"allow_primary":true
}
} ] }' http://localhost:9200/_cluster/reroute?pretty
解决此事件后,我认为有必要弄清楚基本概念shard allocation
。我做了一些研究,但是以下问题仍然让我感到困惑。
assign shard
到其他节点?在我的情况下,我们有两个Elasticsearch节点A和B。已经在A中创建了两个分片,并占用了磁盘空间。
当B不可用时,为什么不只激活服务器A中的这两个分片?
至少它返回yellow
健康状态。
assign a shard
的程序是什么?在第一个问题中,我们假设在服务器A中同时创建了主分片和副本。说assign shard to B
时,这是什么意思?
这是否意味着将分片从服务器A复制到服务器B?
主分片和复制都已创建,但是未激活。这怎么可能?除了磁盘存储之外,还有其他开销来激活分片吗?例如记忆吗?
".marvel-2019.06.20" : {
"status" : "red",
"number_of_shards" : 1,
"number_of_replicas" : 1,
"active_primary_shards" : 0,
"active_shards" : 0, // both shards are inactive.
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 2
}
要使分片处于活动状态,Elasticsearch需要执行以下步骤:
答案 0 :(得分:0)
我不是专家,但有一些想法:
cat shards
(https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-shards.html)找到原因。分片的确消耗了内存,因为必须缓存其元数据。