Elasticsearch 索引为红色,未分配分片
Elasticsearch Index red with no shards assigned
我正在使用 ELK 堆栈,但我的名为 metricbeat-7.4.0-000001
的 metricbeat 索引没有分配分片。
关于我的 ELK 栈的信息:
- Elastic、Logstask、Kibana 版本:7.4.0(我确实打算在一切顺利 运行 之后更新)
- Ubuntu 18.04 LTS 上的单节点(我也打算尽快升级 - 我在 20.04 之前就开始了这个项目)
- 2 x Xeon E5-2620(6 核,12 线程 @ 2GHz),64GB RAM
- 系统平均负载为 0.03,RAM 消耗略低于 7GB,所以我很难认为服务器的性能不够好。
- 1TB 磁盘 space,正在使用 147 GB,所以我也看不出它是磁盘消耗
几周来我一直在努力解决这个问题,遵循了无数的教程和支持页面,但都无济于事。据我所知,如果没有磁盘 space,或者服务器没有可用的内存/处理资源,这是一个常见问题。
除了从头开始重新创建我的集群,我觉得我什么都试过了。删除索引、重新导入所有 metricbeat 配置(索引模板、生命周期策略)、重新路由(并且 w/out 重试失败)的次数多得我数不过来。 ILM 策略似乎 link 已启动,但未分配分片。
在重新创建索引模板时,我停止了 logstash(以防止创建任何不需要的索引),导出 json 然后在 Kibana 开发工具中重新导入它。然后,我只修改索引模板以更改索引模式以匹配我的索引,从默认的 metricbeat-*
到 metricbeat-7.4.0-*
。我的索引是使用模式 beatname-version-autoincrement 创建的,例如 metricbeat-7.4.0-000001
这并不是唯一让我感到悲伤的指标。我在 winlogbeat 索引和 heartbeat 索引方面遇到了同样的问题,但是我怀疑我已经设法用它们解决了这个特定问题。
当我运行解释这个索引的分配时,它告诉我以下内容:
{
"index" : "metricbeat-7.4.0-000001",
"shard" : 0,
"primary" : true,
"current_state" : "unassigned",
"unassigned_info" : {
"reason" : "INDEX_CREATED",
"at" : "2020-06-03T04:23:31.865Z",
"last_allocation_status" : "no"
},
"can_allocate" : "no",
"allocate_explanation" : "cannot allocate because allocation is not permitted to any of the nodes",
"node_allocation_decisions" : [
{
"node_id" : "OQ3AFLyhRcao1z2es2p79w",
"node_name" : "server.network.local",
"transport_address" : "ipaddress:9300",
"node_attributes" : {
"rack_id" : "main",
"ml.machine_memory" : "67501658112",
"xpack.installed" : "true",
"ml.max_open_jobs" : "20"
},
"node_decision" : "no",
"weight_ranking" : 1,
"deciders" : [
{
"decider" : "awareness",
"decision" : "NO",
"explanation" : "node does not contain the awareness attribute [main]; required attributes cluster setting [cluster.routing.allocation.awareness.attributes=main]"
}
]
}
]
}
但是,我已经在 elasticsearch.yml node.attr.rack_id: main
中分配了,这没有区别。然而,由于这是一个单一的节点,我不明白为什么它很难确定将它分配到哪里,因为没有选项。
我的下一个怀疑是它可能只需要一点时间来弄清楚。我在某处读到 Elasticsearch 运行 的生命周期策略每 15 分钟一次,我想知道这是否与分配分片有关?然而,鉴于世界上所有的耐心(或者至少值得几个小时),我发现没有任何变化 - 我什至重新启动并等到第二天,仍然无济于事。
最近,我重新创建了索引(多次)。当前的这个只有几个小时的历史并且有一个新的索引,仍然存在同样的问题。
当我收集我的碎片时,我得到了包含以下内容的东西。我可以看到我对 heartbeat 的期望,但 metricbeat 主索引显示没有分片。
heartbeat-7.4.0-000001 0 p STARTED 0 283b ipaddress server.network.locak
heartbeat-7.4.0-000001 0 r UNASSIGNED
metricbeat-7.4.0-000001 0 p UNASSIGNED
metricbeat-7.4.0-000001 0 r UNASSIGNED
下面是我的 elasticsearch.yml 的评论删除版本:
node.name: auditsvr.ctperth.local
node.attr.rack_id: main
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: ipaddress
discovery.seed_hosts: ["ipaddress"]
discovery.type: single-node
xpack.monitoring.collection.enabled: true
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.key: cert.key
xpack.security.transport.ssl.certificate: cert.crt
xpack.security.transport.ssl.certificate_authorities: ca-cert.crt
xpack.security.transport.ssl.verification_mode: none
metricbeat 也一样:
metricbeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
index.codec: best_compression
setup.kibana:
host: "http://server.network.local:80"
output.logstash:
hosts: ["ipaddress:5044"]
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
logging.level: info
logging.to_files: true
logging.files:
path: /var/log/metricbeat
name: metricbeat
keepfiles: 7
permissions: 0644
setup.ilm.enabled: auto
setup.ilm.rollover_alias: "metricbeat"
setup.ilm.pattern: "{now/d}-000001"
我的下一步是重新开始,但我只能想象这是一个配置问题,这意味着我需要重新开始。我觉得这需要比我更熟悉 Elastic 的人,我通常可以解决这些问题,但需要一些指导。
提前欣赏
更新
应 Val 的要求,请在此处找到 metricbeat 索引模板:
https://sandbox.michael-thompson.net/Whosebug/62169773/metricbeat-7.4.0%20Index%20Template.json
这里的集群设置:
https://sandbox.michael-thompson.net/Whosebug/62169773/clustersettingsincludedefaultstrue.json
不幸的是,它们对于 pastebin 来说太大了。
谢谢
有问题的集群设置如下,知道它是怎么弄到那里的吗?
"persistent" : {
"cluster" : {
"routing" : {
"allocation" : {
"awareness" : {
"attributes" : "main"
}
}
}
},
所以有两种方法可以解决这个问题。在这两种情况下,您都可以从 elasticsearch.yml
中删除以下设置,因为它没用:
node.attr.rack_id: main
选项A:
您需要删除以下群集设置,因为它对单节点设置没有意义。只是 运行:
PUT /_cluster/settings
{
"persistent" : {
"cluster.routing.allocation.awareness.attributes" : null
}
}
选项B:
保留集群设置并将以下节点属性添加到 elasticsearch.yml
以便集群设置(按原样)有意义:
node.attr.main: whatever
此外,如果您阅读更多有关 cluster allocation awareness 的内容,将会有所帮助,因为对于单个节点设置,设置它并没有什么意义。
我正在使用 ELK 堆栈,但我的名为 metricbeat-7.4.0-000001
的 metricbeat 索引没有分配分片。
关于我的 ELK 栈的信息:
- Elastic、Logstask、Kibana 版本:7.4.0(我确实打算在一切顺利 运行 之后更新)
- Ubuntu 18.04 LTS 上的单节点(我也打算尽快升级 - 我在 20.04 之前就开始了这个项目)
- 2 x Xeon E5-2620(6 核,12 线程 @ 2GHz),64GB RAM
- 系统平均负载为 0.03,RAM 消耗略低于 7GB,所以我很难认为服务器的性能不够好。
- 1TB 磁盘 space,正在使用 147 GB,所以我也看不出它是磁盘消耗
几周来我一直在努力解决这个问题,遵循了无数的教程和支持页面,但都无济于事。据我所知,如果没有磁盘 space,或者服务器没有可用的内存/处理资源,这是一个常见问题。
除了从头开始重新创建我的集群,我觉得我什么都试过了。删除索引、重新导入所有 metricbeat 配置(索引模板、生命周期策略)、重新路由(并且 w/out 重试失败)的次数多得我数不过来。 ILM 策略似乎 link 已启动,但未分配分片。
在重新创建索引模板时,我停止了 logstash(以防止创建任何不需要的索引),导出 json 然后在 Kibana 开发工具中重新导入它。然后,我只修改索引模板以更改索引模式以匹配我的索引,从默认的 metricbeat-*
到 metricbeat-7.4.0-*
。我的索引是使用模式 beatname-version-autoincrement 创建的,例如 metricbeat-7.4.0-000001
这并不是唯一让我感到悲伤的指标。我在 winlogbeat 索引和 heartbeat 索引方面遇到了同样的问题,但是我怀疑我已经设法用它们解决了这个特定问题。
当我运行解释这个索引的分配时,它告诉我以下内容:
{
"index" : "metricbeat-7.4.0-000001",
"shard" : 0,
"primary" : true,
"current_state" : "unassigned",
"unassigned_info" : {
"reason" : "INDEX_CREATED",
"at" : "2020-06-03T04:23:31.865Z",
"last_allocation_status" : "no"
},
"can_allocate" : "no",
"allocate_explanation" : "cannot allocate because allocation is not permitted to any of the nodes",
"node_allocation_decisions" : [
{
"node_id" : "OQ3AFLyhRcao1z2es2p79w",
"node_name" : "server.network.local",
"transport_address" : "ipaddress:9300",
"node_attributes" : {
"rack_id" : "main",
"ml.machine_memory" : "67501658112",
"xpack.installed" : "true",
"ml.max_open_jobs" : "20"
},
"node_decision" : "no",
"weight_ranking" : 1,
"deciders" : [
{
"decider" : "awareness",
"decision" : "NO",
"explanation" : "node does not contain the awareness attribute [main]; required attributes cluster setting [cluster.routing.allocation.awareness.attributes=main]"
}
]
}
]
}
但是,我已经在 elasticsearch.yml node.attr.rack_id: main
中分配了,这没有区别。然而,由于这是一个单一的节点,我不明白为什么它很难确定将它分配到哪里,因为没有选项。
我的下一个怀疑是它可能只需要一点时间来弄清楚。我在某处读到 Elasticsearch 运行 的生命周期策略每 15 分钟一次,我想知道这是否与分配分片有关?然而,鉴于世界上所有的耐心(或者至少值得几个小时),我发现没有任何变化 - 我什至重新启动并等到第二天,仍然无济于事。
最近,我重新创建了索引(多次)。当前的这个只有几个小时的历史并且有一个新的索引,仍然存在同样的问题。
当我收集我的碎片时,我得到了包含以下内容的东西。我可以看到我对 heartbeat 的期望,但 metricbeat 主索引显示没有分片。
heartbeat-7.4.0-000001 0 p STARTED 0 283b ipaddress server.network.locak
heartbeat-7.4.0-000001 0 r UNASSIGNED
metricbeat-7.4.0-000001 0 p UNASSIGNED
metricbeat-7.4.0-000001 0 r UNASSIGNED
下面是我的 elasticsearch.yml 的评论删除版本:
node.name: auditsvr.ctperth.local
node.attr.rack_id: main
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: ipaddress
discovery.seed_hosts: ["ipaddress"]
discovery.type: single-node
xpack.monitoring.collection.enabled: true
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.key: cert.key
xpack.security.transport.ssl.certificate: cert.crt
xpack.security.transport.ssl.certificate_authorities: ca-cert.crt
xpack.security.transport.ssl.verification_mode: none
metricbeat 也一样:
metricbeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
index.codec: best_compression
setup.kibana:
host: "http://server.network.local:80"
output.logstash:
hosts: ["ipaddress:5044"]
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
logging.level: info
logging.to_files: true
logging.files:
path: /var/log/metricbeat
name: metricbeat
keepfiles: 7
permissions: 0644
setup.ilm.enabled: auto
setup.ilm.rollover_alias: "metricbeat"
setup.ilm.pattern: "{now/d}-000001"
我的下一步是重新开始,但我只能想象这是一个配置问题,这意味着我需要重新开始。我觉得这需要比我更熟悉 Elastic 的人,我通常可以解决这些问题,但需要一些指导。
提前欣赏
更新
应 Val 的要求,请在此处找到 metricbeat 索引模板:
https://sandbox.michael-thompson.net/Whosebug/62169773/metricbeat-7.4.0%20Index%20Template.json
这里的集群设置:
https://sandbox.michael-thompson.net/Whosebug/62169773/clustersettingsincludedefaultstrue.json
不幸的是,它们对于 pastebin 来说太大了。
谢谢
有问题的集群设置如下,知道它是怎么弄到那里的吗?
"persistent" : {
"cluster" : {
"routing" : {
"allocation" : {
"awareness" : {
"attributes" : "main"
}
}
}
},
所以有两种方法可以解决这个问题。在这两种情况下,您都可以从 elasticsearch.yml
中删除以下设置,因为它没用:
node.attr.rack_id: main
选项A:
您需要删除以下群集设置,因为它对单节点设置没有意义。只是 运行:
PUT /_cluster/settings
{
"persistent" : {
"cluster.routing.allocation.awareness.attributes" : null
}
}
选项B:
保留集群设置并将以下节点属性添加到 elasticsearch.yml
以便集群设置(按原样)有意义:
node.attr.main: whatever
此外,如果您阅读更多有关 cluster allocation awareness 的内容,将会有所帮助,因为对于单个节点设置,设置它并没有什么意义。