Elasticsearch状态API接口排障总结
- ES的Restful API,共四类API:
- 1. 检查集群、节点、索引等健康与否,以及获取其相应状态。
- 2. 管理集群、节点、索引及元数据
- 3. 执行CRUB操作(即:增删查改)
- 4. 执行高级操作,如:paging,filtering等。
- ES API的访问接口: TCP:9200,并且ES是基于HTTP协议工作的.
- curl -X <Verb> '<Protocol>://Host:Port/<Path>?<Query_String>' -d '<Body>'
- 注:
- Verb: 即HTTP的操作,GET, PUT, DELETE等.
- Protocol: http,https
- Path: 访问路径.
- Query_String:查询参数,如: '?pretty':表示使用容易读的JSON格式显示输出.
- Body:请求的主体。
- 如查看node1的状态:
- curl -X GET 'http://1.1.1.1:9200/?pretty'
- ES的API接口:
- _cat API:
- 查看ES集群的状态:
- curl -X GET 'http://1.1.1.1:9200/_cat/nodes?v'
- 注:
- _cat: 这是ES的API接口名,一般ES的API接口名使用下划线开头.
- 此接口的功能是输出显示的。
- ?v: 问号v,是修饰符,v:是verbose,显示详情。
- ?help: 可显示帮助信息。
- ?h=name,ip,port,uptime,heap.current :可定义显示那些列.
- curl -XGET 'http://1.1.1.1:9200/_cat/indices' #查看ES集群中所有的索引信息
- curl localhost:9200/_cat/indices?s #默认可省略s,s: status
- curl localhost:9200/_cat/indices?help #可查看支持的查询关键字
- _cluster APIs:
- 查看ES集群健康状态详情:
- curl -X GET 'http://1.1.1.1:9200/_cluster/health?pretty'
- 查看索引的健康状态:
- health
- curl -X GET 'http://1.1.1.1:9200/_cluster/health/索引名1,索引名2,...'
- curl -X GET 'http://1.1.1.1:9200/_cluster/health/索引名1?level=Level'
- 注:
- cluster:显示到集群级别
- indices:显示到索引级别
- shards:分片级别
- 查看集群的状态信息:
- state:
- curl -X GET 'http://1.1.1.1:9200/_cluster/state/version'
- curl -X GET 'http://1.1.1.1:9200/_cluster/state/master_node?pretty'
- curl -X GET 'http://1.1.1.1:9200/_cluster/state/nodes?pretty'
- 查看集群的统计数据:
- stats:
- curl -X GET 'http://1.1.1.1:9200/_cluster/stats?pretty'
- 查看集群节点状态信息:
- # curl 192.168.10.80:9200/_cat/nodes?v
- 堆内存% 总内存% CPU 1分钟 5分钟 15分钟 角色 *:主节点 节点名
- ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
- 10.2.2.81 14 87 0 0.14 0.12 0.11 mdi - node81
- 10.2.2.80 27 95 0 0.02 0.02 0.00 mdi * node80
- # curl 192.168.10.80:9200/_cat/health?v
- epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
- 1564141337 11:42:17 myes1 green 2 2 40 20 0 0 0 0 - 100.0%
- # 下面可以看当前所有Index(索引)的状态统计,通过它,可获取当前ES集群中是否有red 或 yellow的Index,若有,
- 则需要通过下面的 _cluster/health?level=indices&pretty 来具体查看该Index分片的详细信息。
- curl 192.168.10.80:9200/_cat/indices?v
- #查看Index分片的状态信息
- # curl "localhost:9200/_cluster/health?level=indices&pretty"
- {
- "cluster_name" : "myes1",
- "status" : "green", #整个ES集群的状态为green,是因为下面所有Index的状态为green,若其中有任何一个Index的状态非Green,则整个ES的状态将会非Green。
- "timed_out" : false,
- "number_of_nodes" : 2,
- "number_of_data_nodes" : 2,
- "active_primary_shards" : 20,
- "active_shards" : 40,
- "relocating_shards" : 0,
- "initializing_shards" : 0,
- "unassigned_shards" : 0,
- "delayed_unassigned_shards" : 0,
- "number_of_pending_tasks" : 0,
- "number_of_in_flight_fetch" : 0,
- "task_max_waiting_in_queue_millis" : 0,
- "active_shards_percent_as_number" : 100.0,
- "indices" : {
- ".kibana_task_manager" : {
- "status" : "green", #当前.kibana_task_manager这个Index的状态为green。
- #通常若Index的分片出现丢失,状态将会是red或yellow:
- #red:则表示有一个主分片丢失! yellow:则表示一个副本分片丢失!!但主分片依然可读
- "number_of_shards" : 1, #shard的数量为1,即分片为1个
- "number_of_replicas" : 1, #副本分片数为1,副本分片数决定了shard的个数,若shard个数与它不相同,则该Index的状态一定不是green:
- "active_primary_shards" : 1, #当前活动的主分片数量
- "active_shards" : 2, #这是当前所有活动的分片数量
- "relocating_shards" : 0, #正在调度分配的分片个数【根据字面理解,不完全正确】
- "initializing_shards" : 0, #正在初始化分片的个数
- "unassigned_shards" : 0 #未分配的分片个数
- },
- ...........................
#查看shard分片中那个分片没有分配,以及它在那个Node上丢失分片了
# curl "localhost:9200/_cat/shards?v&pretty"
# shard: 它表示index的分片编号
# prirep: 这是主分片和副本分片,其中:p: 表示主分片, r:表示副本分片
# state: 这个状态可能有这几种: relocating,initializing ,Started, unassigned ,其中unassigned 这表示未分配,若是这种状态,就需要注意了。
# docs 和 store: 就是此Index下文档数量和该docs所占的磁盘空间大小。
ElasticSearch集群出现Red 和 Yellow状态的原因
参考链接:https://www.jianshu.com/p/74fe89ab4af7
集群 RED 和 YELLOW 是 Elasticsearch 集群最常见的问题之一.
无论 RED 还是 YELLOW,原因只有一个:有部分分片没有分配,而且那怕只有一个也会导致集群故障。
red:则表示有主分片没有分配!
yellow:则表示有副本分片没有分配!!但主分片依然可读
对于集群 RED 或 YELLOW 的问题诊断推荐使用 Cluster Allocation Explain API,该 API 可以给出造成分片未分配的具体原因。
例如,如下请求可以返回第一个未分配的分片的具体原因:
curl -XGET localhost:9200/_cluster/allocation/explain?pretty
集群 RED 或 YELLOW 时,一般我们首先需要看一下是否有节点离线。
但单个的未分配分片也导致集群状态变为 RED 或 YELLOW,一些常见的未分配原因如下:
• 由于配置问题导致的,需要修正相应的配置
• 由于节点离线导致的,需要重启离线的节点
• 由于分片规则限制的,例如 total_shards_per_node,或磁盘剩余空间限制等,需要调整相应的规则
• 分配主分片时,由于找不到最新的分片数据,导致主分片未分配,这种要观察是否有节点离线,
极端情况下只能手工将旧的副本分片修改为主分片,但这会导致丢失一些新入库的数据。
- # curl "localhost:9200/_cat/shards?v&pretty" | grep unassingned
- #若上面查询中出现了 unassingned ,则可通过,下面命令来查看 该index的分片是什么原因导致未分配
- curl -sXGET localhost:9200/_cluster/allocation/explain?pretty -d '{
- "index":"myindex", #可指定index名
- "shard":3, #指定要查看的Shard(分片)编号
- "primary":true
- }'
- #若输出结果为:
- {
- "index" : "myindex",
- "shard" : 0,
- "primary" : true,
- "current_state" : "unassigned",
- ..............
- },
- "can_allocate" : "no_valid_shard_copy",
- "allocate_explanation" : "cannot allocate because all found copies of the shard are either stale or corrupt",
- #无法分配,因为所找到的分片的所有副本都已陈旧或损坏
- ...........................
- #这种错误可理解为:
- Elasticsearch 找到了这个分片在磁盘中的数据,但是由于分片的数据不是最新的,无法将其分配为主分片。
- 分配分片的方法
- 若知道哪个索引的哪个分片丢失或损坏,就开始手动修复,通过reroute的allocate分配
- curl -XPOST '{ESIP}:9200/_cluster/reroute' -H "content-type: application/json" -d '{
- "commands" : [ {
- "allocate" : {
- "index" : "eslog1",
- "shard" : 4,
- "node" : "es1",
- "allow_primary" : true
- }
- }
- ]
- }'
- 分配时可能遇到的坑,需要注意的地方
- 分配副本时必须要带参数"allow_primary" : true, 不然会报错
- 当集群中es版本不同时,如果这个未分配的分片是高版本生成的,不能分配到低版本节点上,反过来低版本的分片可以分配给高版本,
- 如果遇到了,只要升级低版本节点的ES版本即可
- (升级ES版本详见官方详细文档,我是ubuntu系统apt安装的,直接apt-get install elasticsearch升级的,elasticsearch.yml
- 配置文件没变不用修改,但是/usr/share/elasticsearch/bin/elasticsearch文件中有个内存配置ES_HEAP_SIZE=6G需要再手动加一下&重启es)
- 【摘自网络】
#分片没有被分配的最初原因有下列类型:- 1. INDEX_CREATED
- 由于 create index api 创建索引导致,索引创建过程中,把索引的全部分片分配完毕需要一个过程,
- 在全部分片分配完毕之前,该索引会处于短暂的 RED 或 YELLOW 状态。因此监控系统如果发现集群 RED,不一定代表出现了故障。
- 2. CLUSTER_RECOVERED
- 集群完全重启时,所有分片都被标记为未分配状态,因此在集群完全重启时的启动阶段,reason属于此种类型。
- 3. INDEX_REOPENED
- open 一个之前 close 的索引, reopen 操作会将索引分配重新分配。
- 4. DANGLING_INDEX_IMPORTED
- 正在导入一个 dangling index,什么是 dangling index?
- 磁盘中存在,而集群状态中不存在的索引称为 dangling index,例如从别的集群拷贝了一个索引的数据目录到当前集群,
- Elasticsearch 会将这个索引加载到集群中,因此会涉及到为 dangling index 分配分片的过程。
- 5. NEW_INDEX_RESTORED
- 从快照恢复到一个新索引。
- 6. EXISTING_INDEX_RESTORED,
- 从快照恢复到一个关闭状态的索引。
- 7. REPLICA_ADDED
- 增加分片副本。
- 8. ALLOCATION_FAILED
- 由于分配失败导致。
- 9. NODE_LEFT
- 由于节点离线。
- 10. REROUTE_CANCELLED
- 由于显式的cancel reroute命令。
- 11. REINITIALIZED
- 由于分片从 started 状态转换到 initializing 状态。
- 12. REALLOCATED_REPLICA
- 由于迁移分片副本。
- 13. PRIMARY_FAILED
- 初始化副分片时,主分片失效。
- 14. FORCED_EMPTY_PRIMARY
- 强制分配一个空的主分片。
- 15. MANUAL_ALLOCATION
- 手工强制分配分片。
Elasticsearch状态API接口排障总结的更多相关文章
- 搜索引擎Elasticsearch REST API学习
Elasticsearch为开发者提供了一套基于Http协议的Restful接口,只需要构造rest请求并解析请求返回的json即可实现访问Elasticsearch服务器.Elasticsearch ...
- Spring Boot Security 整合 JWT 实现 无状态的分布式API接口
简介 JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案.JSON Web Token 入门教程 - 阮一峰,这篇文章可以帮你了解JWT的概念.本文重点讲解Spring Boo ...
- 从App业务逻辑中提炼API接口
2.1 从App业务逻辑中提炼API接口 业务逻辑思维导图 功能-业务逻辑思维导图 基本功能模块关系 功能模块接口UML(设计出API) 在设计稿标注API 编写API文档 2.2 设计API的要点 ...
- ElasticSearch的API介绍
ElasticSearch的API介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.ES是基于Restful风格 1>ES是基于Restful风格 Elasticsea ...
- 为elasticSearch开发c++接口
一. ElasticSearch是什么 ElasticSearch是目前开源全文搜索引擎的首选,可以快速存储,搜索和分析海量数据.Stack Overflow,Github等都在使用. Elas ...
- IEEP-OSPF域内路由故障-现象与排障思路
OSPF域内路由故障-现象与排障思路 一.故障现象 OSPF的或内路由故障常表现为邻居路由器不通告部分或全部路由,可能的原因通常为: 1).拟通告的接口上未启用OSPF 2).拟通告的接口被关闭 OS ...
- Elasticsearch Java API 很全的整理
Elasticsearch 的API 分为 REST Client API(http请求形式)以及 transportClient API两种.相比来说transportClient API效率更高, ...
- API 接口设计规范
概述 这篇文章分享 API 接口设计规范,目的是提供给研发人员做参考. 规范是死的,人是活的,希望自己定的规范,不要被打脸. 路由命名规范 动作 前缀 备注 获取 get get{XXX} 获取 ge ...
- 干货来袭-整套完整安全的API接口解决方案
在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对 ...
随机推荐
- Flask高级
关于Flask启动,和请求处理 #关于后端服务的启动,无非就是启动实现了WSGI协议的socket #关于flask启动的无非就是下面两段代码 #加载配置,创建Flask对象 app = Flask( ...
- [转帖]springboot+k8s+抛弃springcloud.eureka
springboot+k8s+抛弃springcloud.eureka https://www.cnblogs.com/lori/p/12048743.html springboot开发微服务框架一般 ...
- c、c++ char*和wchar*互相转换
1. 问题描述 编写程序时通常会面对一些不同的编码格式,如Unicode和multibytes.在有关字符串的处理时尤其重要,系统编程时通常会遇到很多这样的问题,例如把wchar*的字符串转换为cha ...
- Python的设计哲学--zen of Python
Python的设计哲学--zen of Python Beautiful is better than ugly. 优美胜于丑陋 Explicit is better than ...
- web api与mvc的区别
MVC主要用来构建网站,既关心数据也关心页面展示,而Web API只关注数据 Web API支持格式协商,客户端可以通过Accept header通知服务器期望的格式 Web API支持Self Ho ...
- input file 保存图片
Request.File["控件名称"].FileName 文件名称(没有路径) Request.File["控件名称"].SaveAs("路径名称& ...
- 2019 多点Dmalljava面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.多点Dmall等公司offer,岗位是Java后端开发,因为发展原因最终选择去了多点Dmall,入职一年时间了 ...
- python数据分析三剑客之: matplotlib绘图模块
matplotlib 一.Matplotlib基础知识 Matplotlib中的基本图表包括的元素 - x轴和y轴 axis 水平和垂直的轴线 - x轴和y轴刻度 tick 刻度标示坐标轴的分隔,包括 ...
- maven 学习---Maven中央存储库
当你建立一个 Maven 的项目,Maven 会检查你的 pom.xml 文件,以确定哪些依赖下载. 首先,Maven 将从本地资源库获得 Maven 的本地资源库依赖资源, 如果没有找到,然后把它会 ...
- 使用gacutil把COM组件注册到全局缓存GAC中
我们在编写软件的时候,有时候需要调用COM组件,那就需要注册了,注册有两种,一种是使用regasm 在程序运行的时候注册,参考“pb调用C#编写的DLL类库“,不过受路径的限制.还有一种注册方式,使用 ...