Skip to content
📖0 阅读·🤍0 点赞

Elasticsearch健康值检查

命令:GET _cat/health?v

好的,我们来用大白话和比喻解释一下 GET _cat/health?v 这个命令和它返回的结果,特别是那个 epoch

想象一下 Elasticsearch 集群就像一个大型超市:

  1. 集群 (elasticsearch):就是整个超市本身。
  2. 节点 (node.total, node.data):就像超市里的收银台。node.total 是所有收银台的数量,node.data 是真正负责处理顾客购物(存储和处理数据)的收银台数量(有些可能是管理用的)。
  3. 分片 (shards, pri):超市太大了,商品不能全堆在一个地方。所以超市把商品分门别类放在不同的货架上。分片 (shards) 就是这些货架的总数。主分片 (pri) 是存放“原始正品”的货架。
  4. 副本分片 (隐含在 shardspri 中):为了防止某个货架坏了(比如被撞倒),超市会在其他地方设置一模一样的备份货架,这就是副本分片shards 的总数 = pri (主货架) + 副本货架。
  5. 状态 (status):超市的整体运营状况。
    • 绿灯 (green):所有货架(主货架和备份货架)都完好无损,摆放整齐,超市运转完美!
    • 黄灯 (yellow):所有存放“原始正品”的主货架 (pri) 都完好可用,顾客能买到所有商品。但是!有些备份货架可能还没摆好 (unassign) 或者正在布置中 (init)。超市能正常营业,但备份保护不够,如果主货架再出问题就麻烦了。
    • 红灯 (red):有些存放“原始正品”的主货架 (pri) 坏了或者找不到了!这意味着有些商品顾客暂时买不到了!超市部分区域瘫痪了。

现在来看这个命令:GET _cat/health?v

  • GET: 就像你向超市经理问:“嗨,经理,咱们超市现在整体运营状况怎么样啊?”
  • _cat/health: 这是 Elasticsearch 提供的一个专门用来回答“集群健康状况怎么样?”的接口。相当于经理手里的“超市运营健康检查表”。
  • ?v: 意思是“请把检查表上的标题也给我看看”。不加 ?v 的话,只给你一堆数字,你不知道哪个数字代表什么。加了 ?v,第一行就有标题(epoch, timestamp, cluster, status 等),下面一行是对应的值,看起来清清楚楚。

命令返回的结果解释:

epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1759818802 06:33:22  elasticsearch yellow          1         1     43  43    0    0        3             0                  -                 93.5%

我们一行一行看,结合超市比喻:

  1. 标题行 (因为有 ?v)

    • epoch: 检查报告生成的时间戳(用一种特殊的秒数表示)。
    • timestamp: 检查报告生成的时间(人类可读的格式)。
    • cluster: 集群的名字(超市的名字)。
    • status: 集群状态(超市运营灯:绿/黄/红)。
    • node.total: 总节点数(总收银台数)。
    • node.data: 数据节点数(真正干活的收银台数)。
    • shards: 总分片数(总货架数 = 主货架 + 备份货架)。
    • pri: 主分片数(存放原始正品的主货架数)。
    • relo: 正在搬迁的分片数(正在把货架从一个地方搬到另一个地方的货架数)。
    • init: 正在初始化的分片数(新货架刚搬进来,还在拆包装、摆商品的货架数)。
    • unassign: 未分配的分片数(应该摆好的备份货架,但现在还堆在仓库角落里没摆出来的数量)。
    • pending_tasks: 等待执行的任务数(经理待办事项清单上的任务数)。
    • max_task_wait_time: 最久等待任务的时间(待办清单上最老的任务等了多久)。
    • active_shards_percent: 活跃分片百分比(正常使用的货架占总货架数的比例)。
  2. 数据行

    • 1759818802: 这是 epoch 时间戳。它表示从 1970年1月1日 00:00:00 UTC (可以想象成计算机世界的“创世时刻”) 到现在,一共过去了多少秒。简单比喻: 这就是超市经理在检查报告上盖的一个“秒数戳”,精确记录检查发生的时刻(1759818802秒)。
    • 06:33:22: 这是 timestamp。它是上面那个 epoch 秒数转换成我们平常看的时钟时间(06点33分22秒)。比喻: 经理在秒数戳旁边又写了一个我们看得懂的时间。
    • elasticsearch: 集群的名字叫 “elasticsearch”。比喻: 超市名叫“Elastic超市”。
    • yellow: 集群状态是黄色。比喻: 超市挂黄灯了!根据上面解释,意味着所有主货架(pri=43)都正常,但有些备份货架(unassign=3)没准备好。
    • node.total 1: 总共有 1 个节点。比喻: 超市只有 1 个收银台(这个超市很小)。
    • node.data 1: 有 1 个数据节点。比喻: 这 1 个收银台是负责处理顾客购物的(数据节点)。
    • shards 43: 总共有 43 个分片(货架)。
    • pri 43: 有 43 个主分片(主货架)。这说明副本数设置的是 0 (因为 shards = pri + 副本,43=43+0)。这通常是导致 yellow 的常见原因! 因为只有一个节点,副本无法分配到其他节点上(没有其他节点),所以副本状态就是 unassign (未分配)。
    • relo 0: 没有分片在搬迁。比喻: 没有货架正在搬运中。
    • init 0: 没有分片在初始化。比喻: 没有新货架正在拆包布置。
    • unassign 3: 有 3 个分片未分配。比喻: 有 3 个本该摆出来的备份货架,现在还堆在仓库角落里。结合 pri=43shards=43,这 3 个未分配的就是副本分片。因为只有一个节点,副本无法分配。
    • pending_tasks 0: 没有等待执行的任务。比喻: 经理的待办事项清单是空的。
    • max_task_wait_time -: 没有等待任务,所以这个时间是 - (无)。
    • active_shards_percent 93.5%: 活跃分片比例是 93.5%。比喻: 超市里 93.5% 的货架是正常使用的。剩下 6.5% 就是那 3 个未分配的副本分片 (3 / (43 + 3) ≈ 6.5%)。主分片都是活跃的,所以服务是正常的。

总结一下这个命令和结果:

你问 Elasticsearch 集群:“嗨,你身体怎么样啊?” (GET _cat/health?v)

它回答:“我在 1759818802 秒(也就是 06:33:22)检查了一下自己。我叫 elasticsearch,现在感觉是 yellow(有点小毛病)。我有 1 个收银台(节点),它负责干活。总共有 43 个货架(分片),都是主货架(pri)。没有货架在搬动(relo)或新布置(init),但是有 3 个备份货架(unassign)因为没地方(只有一个节点)摆不出来。经理现在没事干(pending_tasks 0)。目前 93.5% 的货架是好的在用的。”

核心要点:

  • GET _cat/health?v 是快速查看 Elasticsearch 集群整体健康状态的命令。
  • epoch 是一个从 1970 年开始计算的秒数,表示事件发生的精确时刻。timestamp 是它的可读版本。
  • status 是最关键的指标:green (健康), yellow (警告,主分片正常但副本可能缺失), red (严重故障,数据丢失)。
  • 在这个例子中,状态是 yellow 的主要原因是只有一个节点,导致配置的副本无法分配 (unassign)。添加更多节点通常可以解决这个问题并变成 green