ElasticSearch之概念、api、集群状态
一、基本概念
官网文档:
Elasticsearch Guide [8.13] | Elastic
1、类比数据库的概念
- 索引(Index): 类似于数据库中的“数据库”,是某类文档的集合。
- 类型(Type): 类似于数据库中的“表”,是索引中的一个逻辑分区。
- 文档(Document): 类似于数据库中的“记录”,是一个可被索引的信息载体。
- 分片(Shard): Elasticsearch会将索引数据细分为多个分片以便跨节点分布数据。
- 副本(Replica): 是分片的备份,用于防止数据丢失和提高查询效率。
- 映射(Mapping): 类似于数据库的schema,用于定义文档和它所包含的字段的类型、包含的字段等。
2、核心配置(config/elasticsearch.yml)
- cluster.name: 集群名称,唯一确定一个集群。
- node.name:节点名称,一个集群中的节点名称是唯一固定的,不同节点不能同名。
- node.master: 主节点属性值
- node.data: 数据节点属性值
- network.host:本节点的绑定ip,及提供服务的ip地址
- http.port: 本节点的http端口
- transport.tcp.port:9300——集群之间通信的端口,若不指定默认:9300
- discovery.seed_hosts: 节点发现需要配置一些种子节点,与7.X之前老版本:disvoery.zen.ping.unicast.hosts类似,一般配置集群中的全部节点
- cluster.initial_master_nodes:指定集群初次选举中用到的具有主节点资格的节点,称为集群引导,只在第一次形成集群时需要。
3、引导检查—Bootstrap Checks
在启用生产模式时,节点启动之前ES会自动对节点的相关配置逐项检查,目的是避免开发者在对其配置项不了解的前提下做出不合理的配置。如果配置不符合性能或者兼容性要求,ES会阻止服务启动以保证服务的性能和可用性。
检查项:
- 堆大小检查
- 文件描述符检查
- 内存锁检查
- 最大线程数检查
- 最大文件大小检查
- 虚拟内存检查
- 文件系统映射数检查
- 客户端JVM检查
- 串行收集器检查
- 系统调用过滤器检查
- OnError和OnOOMError检查
- 早期访问检查
- 所有权限检查
- 发现配置检查
4、主从模式
Elasticsearch为什么使用主从模式(Leader/Follower)?Elasticsearch使用的主从架构模式,其实除此之外,还可以使用分布式哈希表(DHT),其区别在于:
- 主从模式适合节点数量不多,并且节点的状态改变(加入集群或者离开集群)不频繁的情况。
- 分布式哈希表支持每小时数千个节点的加入或离开,响应约为4-10跳。
ES的应用场景一般来说单个集群中一般不会有太多节点(一般来说不超过一千个),节点的数量远远小于单个节点(只的是主节点)所能维护的连接数。并且通常主节点不必经常处理节点的加入和离开,处于相对稳定的对等网络中,因此使用主从模式。
5、节点
候选节点/投票节点(master-eligible,有时候也叫master节点)
默认情况下,master-eligible节点是那些在集群状态发布期间参与选举并执行某些任务的节点,配置了master角色的节点都是有效的投票节点,可以参与选举也可以投票
仅投票节点
配置了master和voting_only角色的节点将成为仅投票节点,仅投票节点虽然也是候选节点,但是在选举过程中仅可以投票而不参与竞选。不过仅投票节点可以同时也是数据节点,这样的话,其不具备被选举为Master的资格,但是参与投票,可以在选举过程中发挥关键票的作用。
主节点(active master)
- 避免重负载:主节点负责轻量级集群范围的操作,例如创建或删除索引、跟踪哪些节点是集群的一部分以及决定将哪些分片分配给哪些节点。拥有一个稳定的主节点对于集群健康很重要。当选的主节点拥有履行其职责所需的资源,这对于集群的健康非常重要。如果所选的主节点承载了其他任务,那么集群将不能很好地运行。避免 master 被其他任务超载的最可靠方法是将所有符合 master 的节点配置为仅具有 master 角色的专用 master 节点,使它们能够专注于管理集群。专用master节点仍将充当协调节点,将请求从客户端路由到集群中的其他节点,但是不要以负载均衡器的目的而设置候选节点。
- 一般来说,如果小型或轻负载集群的主节点具有其他角色和职责,则其可能运行良好,但是一旦您的集群包含多个节点,使用专用的主节点通常是有意义的。
- 任何不是
voting-only
的master-eligible
节点都可以被选举为active master
。 - 主节点必须有一个
path.data
目录,其内容在重启后仍然存在,就像数据节点一样,因为这是存储集群元数据的地方。集群元数据描述了如何读取存储在数据节点上的数据,因此如果丢失,则无法读取存储在数据节点上的数据。 - 高可用性 (HA) 集群需要至少三个候选节点,其中至少两个不是仅投票节点。这样即使其中一个节点发生故障,也可以保证剩下的节点能够选举出一个主节点。
数据节点
数据节点保存包含已编入索引的文档的分片。数据节点处理数据相关操作,如 CRUD、搜索和聚合。这些操作是 I/O 密集型、内存密集型和 CPU 密集型的。监控这些资源并在它们过载时添加更多数据节点非常重要。
协调节点
- 如果主动关闭了master、data和ingest的角色配置,当前节点就剩下一个只能路由请求、处理搜索减少阶段和分发批量索引功能的仅协调节点。
- 本质上,仅协调节点的就相当于一个智能负载均衡器。换句话说,你是没有办法配置一个不具备协调转发能力的节点的。
- 仅协调节点过多会增加集群负担,因为主节更新集群状态必须等待每个节点的确认,而仅协调节点从这个角度上讲纯粹是一种负担。数据节点可以愉快地完成转发任务。
6、ES常见模块:Mudules
Cluster
Cluster模块是Master节点执行集群管理的封装实现,管理集群状态,维护集群级(除了集群级,还有索引级分片级等级别)的配置信息。其主要功能包括:
- 管理集群状态,将新生成的集群状态发布到集群的所有节点
- 调用allocation模块执行分片分配感知,决策分片分配行为
- 在集群各个节点直接迁移分片,保证数据平衡,shard rebalance
Allocation
此模块是实现了对节点分片的分配感知策略,新节点加入离开、动态扩容都需要分片分配感知,此模块由主节点调用,常见的使用场景如:跨机架强制感知实现高可用,冷热集群架构设计等。
Bootstrap
引导检查模块,不再赘述
Ingest
预处理模块负责数据索引之前的一些预操作,比如数据类型处理、数据的结构转换等,很多场景下课替代logstash处理管道消息,Elastic认证考试考点之一。
Monitor
监控功能提供了一种方式来了解 Elasticsearch 集群的运行状况和性能
Discovery
发现模块负责管理如发现集群中新加入的节点,或者节点退出之后将状态信息移除,起作用类似于ZooKeeper。发现木块是用于elasticsearch和的内置发现模块 默认值。它提供单播发现,但可以扩展到 支持云环境和其他形式的发现
Gateway
负责说对收到Master广播下来的集群状态数据的持久化存储,并在集群完全重启时恢复他们
Indices
索引模块管理全局级索引配置,不包括索引级及索引以下级。集群启动阶段需要主副本分片恢复就是在这个模块完成的
HTTP
HTTP模块允许通过JSON over HTTP的方式访问ES的API,HTTP模块本质上是完全异步的,这一位置没有阻塞线程等待响应。使用异步通信进行HTTP的好处是解决了C10k的问题。
Transport
传输模块用于集群内部节点通信。传输模块使用TCP协议,每个节点都与其他节点维持若干个TCP长连接,通信本质也是完全异步的。
分片:Shard
Shard即数据分片,是ES的数据载体。在ES中数据分为primary shard(主分片)和replica shard(副本分片),每一个primary承载单个索引的一部分数据,分布于各个节点,replica为某个primary的副本,
即备份。分片分配的原则是尽量均匀的分配在集群中的各个节点,以最大程度降低部分shard在出现意外时对整个集群乃至服务造成的影响。每个分片就是一个Lucene的实例,具有完整的功能。
7、docker 安装es
Install Elasticsearch with Docker | Elasticsearch Guide [8.12] | Elastic
二、查询接口
1、官网所有的api接口介绍
REST APIs | Elasticsearch Guide [8.12] | Elastic
2、常见接口
**分类API(Cat API)**:这是Elasticsearch中用于获取集群、索引等信息的命令行接口。例如获取所有节点信息、查看所有索引等。
ip:9200/_cat/ 查看所有可以查询的对象
=^.^= /_cat/allocation /_cat/shards /_cat/shards/{index} /_cat/master /_cat/nodes /_cat/tasks /_cat/indices /_cat/indices/{index} /_cat/segments /_cat/segments/{index} /_cat/count /_cat/count/{index} /_cat/recovery /_cat/recovery/{index} /_cat/health /_cat/pending_tasks /_cat/aliases /_cat/aliases/{alias} /_cat/thread_pool /_cat/thread_pool/{thread_pools} /_cat/plugins /_cat/fielddata /_cat/fielddata/{fields} /_cat/nodeattrs /_cat/repositories /_cat/snapshots/{repository} /_cat/templates
linux 中查看信息
# 检查集群的健康状态 curl -X GET "localhost:9200/_cat/health?v" # 检查集群未分配的分片 curl -X GET "localhost:9200/_cat/shards?h=index,shard,prirep,state,unassigned.reason"| grep UNASSIGNED # 查看所有的索引列表 curl -X GET "localhost:9200/_cat/indices?v"
?v 的作用:
?v
是一个查询参数,它的作用是以表格形式更易读的展示返回结果,并且会显示列名。
**索引API(Indices API)**:用于管理(创建、删除、重新分配等)索引的接口。
**文档API(Document API)**:这是Elasticsearch的核心接口,用于在索引中增加、更新、删除或获取文档。
**搜索API(Search API)**:用于在索引中执行查询并获取结果。
**聚合API(Aggregations API)**:用于执行高级搜索查询,比如最大值、最小值、平均值等统计信息。
**映射API(Mapping API)**:用于定义索引中字段的数据类型,比如整数、字符串、日期等。
**分析API(Analyze API)**:用于预分析文本,查看文本在索引之前或之后是如何被分析和标记为索引的。
?v&format=json 定制返回的格式
三、集群状态异常(Red、Yellow)原因分析
一、颜值表示状态
Green - 所有数据都可用,主副分片都已经分配好
Yellow - 所有数据都可用,但尚未分配一些副本,不影响查询,可能影响恢复。如果集群中的某个节点发生故障,则在修复该节点之前,某些数据可能不可用。
Red - 某些数据由于某种原因 存在主分片未分配,对查询会有影响
二、查询索引Yellow状态原因
1、查看集群的健康并显示索引状态
GET /_cluster/health?level=indices { "cluster_name" : "elasticsearch-1", "status" : "green", "timed_out" : false, "number_of_nodes" : 3, "number_of_data_nodes" : 3, #活动主分区数量 "active_primary_shards" : 28, #活动主分区和副本分区的总数 "active_shards" : 55, #正在重定位的分片数量 "relocating_shards" : 0, #正在初始化的分片数量 "initializing_shards" : 0, #未分配的分片数 "unassigned_shards" : 3, #其分配因超时设置而延迟的分片数 "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" : { "elasticsearch-1" : { "status" : "green", "number_of_shards" : 3, "number_of_replicas" : 3, "active_primary_shards" : 5, "active_shards" : 10, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 3 } } }
2、查看集群中每个节点的分片分配情况
GET /_cat/allocation?v shards disk.indices disk.used disk.avail disk.total disk.percent host ip node 19 86.7kb 36.9gb 95.2gb 132.2gb 27 127.0.0.1 127.0.0.1 master 18 73.1kb 36.9gb 95.2gb 132.2gb 27 127.0.0.1 127.0.0.1 node-003 18 67.8kb 36.9gb 95.2gb 132.2gb 27 127.0.0.1 127.0.0.1 node-002 3 UNASSIGNED #unassigned_shards=3,确定是副本分片未分配,导致集群状态Yellow
3、查看unassigned的原因
GET /_cluster/allocation/explain?pretty { "index" : "elasticsearch-1", "shard" : 3, "primary" : false, "current_state" : "unassigned", "unassigned_info" : { "reason" : "CLUSTER_RECOVERED", "at" : "2022-04-20T11:01:43.051Z", "last_allocation_status" : "no_attempt" }, "can_allocate" : "no", #异常原因 "allocate_explanation" : "cannot allocate because allocation is not permitted to any of the nodes", "node_allocation_decisions" : [ { "node_id" : "NfmBH4nSSpGmtf7aPNuvXQ", "node_name" : "master", "transport_address" : "127.0.0.1:9300", "node_decision" : "no", "deciders" : [{ "decider" : "same_shard", "decision" : "NO", "explanation" : "the same cannot be allocate to the same node no which a copy of the shard already exists " }] }] }
查看每个节点原因说有同样的数据,不能分配
4、查看所有的分片
GET _cat/shards?h=index,shard,prirep,state,unassigned.reason
5、修改索引副本数
PUT /elasticsearch-1/_settings { "number_of_replicas": 2 }
6、更新完后查询
GET /_cluster/health?level=indices "unassigned_shards" : 0
三、总结(Red、Yellow)
遇到集群Red、Yellow时,我们可以从如下方法排查 :
集群层面:curl -s 172.31.30.28:9200/_cat/nodes 或者 GET /_cluster/health
索引层面:GET /_cluster/health?pretty&level=indices
分片层面:GET /_cluster/health?pretty&level=shards
恢复情况:GET /_recovery?pretty
1、有unassigned分片的排查思路 :
先诊断:GET /_cluster/allocation/explain #重新分配: /_cluster/reroute 实在无法分配,索引重建: 1.1、新建备份索引: curl -XPUT ‘http://xxxx:9200/a_index_copy/‘ -d ‘{ “settings”:{ “index”:{ “number_of_shards”:3, “number_of_replicas”:1 } } } 1.2、通过reindex api将a_index数据copy到a_index_copy: POST _reindex { "source": { "index": "a_index" }, "dest": { "index": "a_index_copy", "op_type": "create" } } 1.3、删除a_index索引,这个必须要先做,否则别名无法添加 curl -XDELETE 'http://xxxx:9200/a_index' 1.4、给a_index_copy添加别名a_index curl -XPOST 'http://xxxx:9200/_aliases' -d ' { "actions": [ {"add": {"index": "a_index_copy", "alias": "a_index"}} ] }'