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-onlymaster-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"}} ] }'

  

 

 

你真的懂Elasticsearch分布式原理和高级聚合查询吗? (qq.com)

如何进行Elasticsearch集群规划及性能优化实践 - 大数据 - 亿速云 (yisu.com)

posted @ 2024-03-08 13:40  凡人半睁眼  阅读(55)  评论(0编辑  收藏  举报