elasticsearch如何定位红色或黄色的索引

集群健康状态的解读

  • 分片健康
    • 红:至少有一个主分片没有分配
    • 黄:至少有一个副本没有分配
    • 绿:主副本分片全部正常分配
  • 索引健康:最差的分片的状态
  • 集群健康:最差的索引的状态

如何定位黄色的索引

确定我们所能知道的主要问题

例如节点宕机、磁盘空间(磁盘使用逼近或超过警戒水位线,磁盘使用率达到85%、90%甚至95%)等问题,这些问题很可能会造成集群状态的变化。这些外部表现明显的问题便于我们追溯问题,形成针对性的解决方案。

面对这种场景,我们有时只需要耐心等待,因为系统通常会通过移动数据来自我修复。

❑举例1:重新启动则会经历集群由红色变为黄色,再由黄色变为绿色的过程。

❑举例2:一个节点的主分片出了问题,系统会将副本分片升级为主分片,然后重新创建新副本,但这需要几分钟到更长的时间,具体取决于分片数量、大小、集群负载、磁盘速度等。

# 检查集群状态,查看是否有节点丢失,有多少分片无法分配
GET /_cluster/health/

确定哪些索引有问题,多少索引有问题

通过_cat API的返回结果,我们可以知道这一点。

GET cat/indices?v&health=red
GET cat/indices?v&health=yellow
GET cat/indices?v&health=green

其中黄色索引如图14-4所示。
在这里插入图片描述

查看有问题的分片及其原因

为此我们应该使用_cat API。该API用于查询集群中的所有分片信息,包括节点名称、索引名、分片编号、是否为主分片、分片状态、存储方式、分片大小、未分配原因和详细信息,并按照存储方式和索引名称进行排序。

GET /_cat/shards?v&h=n,index,shard,prirep,state,sto,sc,unassigned.reason, unassigned.details&s=sto,index

上述API各个细分参数的含义如下。

❑v:显示表头。

❑h:指定要在结果中显示的列。在这个例子中,它被设置为n(节点名称)、index(索引名)、shard(分片编号)、prirep(是否为主分片)、state(分片状态)、sto(存储方式)、sc(分片大小)、unassigned.reason(未分配原因)和unassigned.details(未分配详细信息)。

❑s:指定对结果进行排序的列。在这个例子中,它被设置为sto(存储方式)和index(索引名称)。

执行结果如图

在这里插入图片描述
其中,unassigned.reason字段表示未分配分片的原因,返回值如表

在这里插入图片描述
虽然未分配原因已经很详细了,但是有时候我们需要更多细节,特别是当我们有节点路由或遇到其他更复杂的问题时。

进一步定位未分配的原因

我们继续探究集群为什么不分配分片。为此,让集群进一步返回给定分片的当前分配情况和逻辑。这需要结合上一步的返回结果,对_cluster/allocation/explain API进行修改。

GET /_cluster/allocation/explain
{
  "index": "my_index_0602",
  "shard": 0,
  "primary": false
}

GET /_cluster/allocation/explain
{
  "index": "my_index_0517",
  "shard": 0,
  "primary": false
}

以上3个参数都是可选参数,含义分别如下。

❑index:索引名称。

❑Shard:分片数。

❑Primary:是否是主分片。

在这里插入图片描述
在单节点集群上为新建的索引my_index_0602设置了副本分片,导致副本分片无法分配,所以分片状态呈现黄色。

current_state字段表示数据分片在Elasticsearch集群中的当前状态。unassigned是其中一种状态,表示该分片当前未被分配到任何节点。除此之外,还有以下可能的状态。

❑initializing:分片正在初始化,但尚未开始提供服务。

❑started:分片已经成功初始化并且正在提供服务。

❑relocating:分片正在从一个节点迁移到另一个节点。

对症下药,解决问题

修补方法分为几类。

1)等待Elasticsearch集群自行修复。这种方式适用于临时状况、集群启动阶段。操作方法是节点重启。

2)将副本设置为0,即删除所有副本。针对场景是既无法修复副本,也无法手动移动或分配副本的情况。在这种情况下,只要拥有主分片(健康状态为黄色,而不是红色),就可以始终使用以下命令将副本数设置为0,等待给定响应时间,再将其设置为1或任意一个业务场景需要的值。

PUT my_index_0517/_settings
{
  "index": {
    "number_of_replicas": 0
  }
}

3)借助reroute API手动分配分片。举例如下,该代码共做了移动分片(move)和分配副本(allocate_replica)两个操作。

POST /_cluster/reroute
{
  "commands": [
    {
      "move": {
        "index": "test",
        "shard": 0,
        "from_node": "nodel",
        "to node": "node2"
      }
    },
    {
      "allocate replica": {
        "index": "test",
        "shard": 1,
        "node": "node3"
      }
    }
  ]
}
  1. 检查路由、分配规则。许多高可用或复杂的系统使用路由或分配规则来控制分片分配,随着情况的变化,可能会出现无法分配的分片。这个时候,可以使用explain API帮助排查问题。

如何定位红色的索引

模拟场景使集群变红色

DELETE mytest
PUT mytest
{
  "settings":{
    "number_of_shards":1,
    "number_of_replicas":0,
    "index.routing.allocation.require.box_type":"hot"
  }
}

在这里插入图片描述

定位是哪个索引、哪个分片

GET cat/indices?v&health=red

在这里插入图片描述

GET /_cat/shards?v&h=n,index,shard,prirep,state,sto,sc,unassigned.reason, unassigned.details&s=sto,index

在这里插入图片描述

GET /_cluster/allocation/explain
{
  "index": "mytest",
  "shard": 0,
  "primary": true
}

在这里插入图片描述

意思是主分片没有办法分配,是应为没有hot属性的节点

解决问题

DELETE mytest

PUT mytest
{
  "settings":{
    "number_of_shards":1,
    "number_of_replicas":0
  }
}


GET /_cluster/health/

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值