一、Cluster集群

Cluster 也就是集群的意思。Elasticsearch 集群由一个或多个节点组成,可通过其集群名称进行标识。通常这个 Cluster 的名字是可以在 Elasticsearch 里的配置文件中设置的。在默认的情况下,如我们的 Elasticsearch 已经开始运行,那么它会自动生成一个叫做 “elasticsearch” 的集群。我们可以在 config/elasticsearch.yml修改集群名称。

#定义集群名称
cluster.name: my-application

二、Node节点

单个 Elasticsearch 实例。 在大多数环境中,每个节点都在单独的盒子或虚拟机上运行。一个集群由一个或多个 node 组成。在测试的环境中,我可以把多个 node 运行在一个 server 上。在实际的部署中,大多数情况还是需要一个 server 上运行一个 node。根据 node 的作用,可以分为如下的几种:

1、master node节点

整个集群的管理者、索引管理、分片管理,以及整个集群的状态的管理,master节点是从master候选节点中选出的,成为master候选节点的方式:node.master:true 默认(true)
data node:数据节点,存储主要数据,负责索引的数据的检索和聚合等操作,设置data node的方式如下:

node.master:true
node.data:false

2、data node节点

该节点和应用创建连接、接收索引请求,会存储分配在该node上的shard的数据并负责这些shard的写入、查询等,ES集群的性能取决于该节点的个数(每个节点最优配置的情况下),data节点会占用大量的CPU、io和内存;data节点的分片执行查询语句、获得查询结果后将结果反馈给Coordinating,此过程较消耗硬件资源;设置成为data节点的方式

node.data:true
node.master:false

3、coordinating node节点

协调节点,所有节点都可以接受来自客户端的请求进行转发,因为每个节点都知道集群的所有索引分片的分布情况,但是别的节点,都还肩负着别的工作,如果请求压力过大,可能会拖垮整个集群的响应速度,所以就专门有了这个协调节点,他什么都不用做,只处理请求和请求结果,这种设计的好处是,如果集群资源不足,被干死的是coordinating node, marster、data节点安全,设置成为coordinating node节点的方式:

node.data:false
node.master:false

4、ingest node节点

预处理节点,主要是对数据进行预处理,比如对字段重命名,分解字段内容,增加字段等,类似于Logstash, 就是对数据进行预处理,ingest里面可以定义pipeline(管道),pipeline可以由很多个processor(官方预定义28个)构成,用来出来预处理数据,使用方式:先定义好预处理pipeline,然后在存储数据的时候指定pipeline,如:成为ingest node的方式

node.ingest:true 默认(true)

5、machine learning (Gold/Platinum License)节点

顾名思义,机器学习节点执行 ML 算法并检测异常。 它是商业许可证的一部分,因此你必须购买 XPack 许可证才能启用机器学习功能。关于 Elastic Stack 的订阅,详细请参阅链接 订阅 | Elastic Stack 产品和支持 | Elastic。

6、Transform node节点

严格地说, transform 节点角色是列表中的最新成员。 它用于数据的汇总。 此节点是执行 transform API 调用所必需的,这将创建(转换)基于现有索引进行透视的新索引。

三、index索引

1、索引设置(Index Settings)

1.1、static设置

只能在创建索引时或关闭的索引上设置

  • index.number_of_shards:主分片数量,默认1
  • index.number_of_routing_shards:拆分索引的路由分片数量,默认值位于2~1024之间,依赖索引主分片数量
  • index.shard.check_on_startup:打开前检查分片是否损坏,默认false
  • index.codec:压缩存储算法,默认LZ4
  • index.routing_partition_size:自定义路由可以到达的分片数量,默认1

1.2、dynamic

可以使用API实时对索引进行操作

  • index.number_of_replicas:主分片的副本数,默认1
  • index.auto_expand_replicas:根据集群中数据节点的数量自动扩展副本的数量,默认false
  • index.search.idle.after:搜索空闲之前不能接收搜索和获取请求的时间,默认30s
  • index.refresh_interval:刷新操作频率,最近对索引的更改既可见,默认1s。-1关闭刷新操作
  • index.max_result_window:查询索引结果的最大数量,默认10000
  • index.max_inner_result_window:内部或聚合命中最大数量,默认100
  • index.max_rescore_window:打分请求的最大索引数量,默认10000(同index.max_result_window)
  • index.max_docvalue_fields_search:查询中允许的最大字段数,默认100
  • index.max_script_fields:查询中允许的最大脚本字段数,默认32
  • index.query.default_field:查询返回的默认字段,默认*(表示所有)

2、索引模板(Index Templates)

索引模板是告诉Elasticsearch在创建索引时如何配置索引的一种方法。对于数据流(data stream),索引模板配置是创建他们的后备索引。在创建索引之前先配置模板,模板设置将用作创建索引的基础。模板有两种类型,索引模板(index templates)和组件模板(component templates)。组件模板是可重用的构建块,用于配置映射(mappings)、设置(settings)和别名(alias)。使用组件模板来构造索引模板,但它们不会直接应用于索引。索引模板可以包含组件模板的集合,也可以直接指定设置,映射和别名。如果匹配多个模板,优先使用优先级最高的模板。可以使用模拟API创建索引,确定最终的索引设置。POST /_index_template/_simulate

注意事项:

  • 如果新数据流或索引与多个索引模板匹配,则使用优先级最高的索引模板。
  • Elasticsearch内置了许多索引模板(如:metrics--,logs-*-*),每个模板的优先级是100。如果不想使用内置模板,请为您的模板分配更高的优先级。
  • 如果显式设置创建索引,并且该索引与索引模板匹配,则创建索引请求中的设置将优先于索引模板中指定的设置。
  • 索引模板仅在创建索引期间应用。索引模板的更改不会影响现有索引。
  • 当可组合模板匹配给定索引时,它始终优先于旧模板。如果没有可组合模板匹配,则旧版模板可能仍匹配并被应用。

3、索引创建

PUT _template/datastream_template
{
  # 1.1 匹配所有"datastream-"开头的索引
  "index_patterns": ["datastream-*"],
  # 2 指定创建数据流索引模板
  "data_stream": {},
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0,
    "refresh_interval": "15s",
    # 指定索引管理策略,索引关联策略
    "index.lifecycle.name": "datastream_policy",
    # 指定滚动写别名
    "index.lifecycle.rollover_alias": "datastream",
    # 满足策略的索引检查频率
    "indices.lifecycle.poll_interval": "10m",
    # 跳过滚动
    "index.lifecycle.indexing_complete": true
  },
  "mappings": {
    "dynamic_date_formats": [
      "yyyy-MM-dd HH:mm:ss",
      "yyyy-MM-dd HH:mm:ss Z",
      "yyyy-MM-dd HH:mm:ss.SSS",
      "yyyy-MM-dd HH:mm:ss.SSS Z"
    ],
    "_default_": {
      "_all": {
        "enabled": false
      }
    }
  },
  # 1.2 非数据流索引是使用
  "aliases": {
    "last_3_months": {} 
  }
}

四、document文档

Elasticsearch是面向文档的,文档是ES的最小单元。文档Elasticsearch 中有一些重要的属性:它是独立的。文档包含字段(名称)及其值,每个文档都有自己的唯一ID,文档可以是最简单的JSON,也可以是嵌套层级很深的JSON。

五、shards分片

每个索引都是由分片组成的,可能是一个可能是多个,每个分片还可能有对应的副本,以便应对硬件故障。Elasticsearch 中存储的最小单元也是分片,一个分片实际上是一个完整的 Lucene 索引。

1、为什么分片

单个节点上可以存储的数据量是有限的,因此可以通过添加节点和增加索引的分片数增加可存储容量。

2、慎重设置分片数

由于分片的数量是一个静态配置项,只可以在创建索引时指定分片数中途不能更改,因此在创建索引前必须小心的做好规划,设置一个合理的分片数。

3、分片设置过多的危害

如果设置过多的分片,在读取的时候,需要从多个分片读取数据,然后在聚合数据。在写入数据时,需要将数据划分到过多的分片,搜索时可能会导致集群对搜索的响应效率较低,在极端情况下甚至可能变得不稳定。

4、分片设置过少的危害

如果设置了过少的分片,可能随着数据量的增加,单个分片过大,在发生故障恢复时,可能会花费更长的时间(还可能导致集群各节点的磁盘占用水平不一致,有的磁盘占用率低,有的占用率高,随着业务发展,后期可能会经常触发分片重分配)。如果查询一点数据命中一个大分片,不利于快速寻找到目标数据。

5、设置分片需要考虑那些问题

分片可以移动但不可分割,数量不可以调整。因此在创建索引时,选择一个合理的分片数是很重要的。除了站在单个索引的角度,还需要站在集群的角度考虑,例如集群的容量,某个节点的容量,单个节点最多可以持有多少个分片.

6、设置分片需要考虑那些问题

6.1、搜索时每个分片一个线程

大部分的搜索都会命中多个分片。每个分片都会一个CPU线程上执行搜索。虽然一个分片上可以运行多个并发的搜索,但跨大量分片的搜索可能会耗尽节点的搜索线程池。这可能导致吞吐量低和搜索速度慢。

6.2、每个索引和分片都有开销

每个索引和分片都会占用一定的内存和CPU资源。大部分情况下,一些大分片比很多小分片占用的资源更少。分片的资源占用主要是其对应的分段。每个分片都对应着一些分段,用于存储索引数据。为了能够更快的检索,Elasticsearch将分段的元数据存储于JVM的堆内存中。随着分片变大,它的分段会合并为更大的分段,分段数量减少,意味着更少的元数据存在于JVM堆中。每个映射的字段也会带来一些内存和磁盘的开销。默认情况下,Elasticsearch会为索引的每个文档的每个字段的创建映射,也可以关闭。

6.3、集群自动平衡分片的存储

集群的节点被到数据层中。Elasticsearch尝试将索引的分片分布在尽可能多的节点上。当添加新节点或节点故障时,Elasticsearch会自动在其余节点上重新平衡索引的分片。

7、分片最佳实践

7.1、分片大小保持在10GB-50GB之间

分片大小保持在10GB-50GB之间,大的分片在故障恢复时会占用较长的时间。当某个节点发生故障时,Elasticsearch会根据剩余节点的数据自动的重新平衡分片。恢复进程通常是在网络之间拷贝分片的内容,因此一个100GB的分片会比50GB的分片花费更多的时间。相比之下,小分片的开销更大,搜索效率也更低。搜索50个1GB分片将比搜索一个包含相同数据的50GB分片占用更多资源。分片的大小并没有强制的限制。但经验值是10-50GB之间的分片通常在日志和时间序列的数据流索引上表现更好。 总结:打分片性能好,故障恢复慢,小分片性能差,故障恢复快。

7.2、每GB堆内存对应少于20个分片

数据节点可以容纳的分片数与节点的堆内存成比例。例如,具有30GB堆内存的节点最多应该有600个分片。越是低于此比例,就越能保持节点性能。如果发现节点超过每GB 20个以上的分片,请考虑添加另一个节点。单节点分片数计算=JVM堆大小*20

7.3、避免节成为热点

如果分配给特定节点的分片太多,该节点可能会成为热点。例如,如果单个节点包含的分片太多,索引量太大,则该节点可能会出现问题。

六、replica副本

每个分片都有1个或者N个副本,副本数目可以动态设置的。副本的作用是容灾备份、提高读性能,同时会降低写性能。

//设置修改副本
PUT http://127.0.0.1:9200/vem_orderinfo_index_2020/_settings
{
    "number_of_replicas": 1
}