2. Elasticsearch基本核心概念
Elasticsearch中具备一些基本的概念,做如下描述:
-
Near Realtime(NRT)
:ES是几乎是一个实时查询平台,从索引文档到可搜索文档有一点延迟,通常是1秒; -
Cluster
:集群是一个或多个节点(服务器)的集合,它们共同保存整个数据,并提供跨所有节点的联合索引和搜索功能,一般一个集群唯一的名字作标识符(默认是"elatsicsearch"),这个名称很重要,因为如果节点设置为按名称加入群集,则该节点只能是群集的一部分,千万不要在不同的环境中用相同的集群名字,否则很容易导致节点加入错误的集群; -
Node
:节点是组成集群的一个单独服务器,用于存储数据、提供集群索引和搜索功能,和集群一样,节点由名称标识,默认情况下,该名称是在启动时分配给节点的随机通用唯一标识符(UUID),当然这个名字是可以自定义的,节点名称对于管理目的非常重要,可以在其中识别网络中哪些服务器与Elasticsearch集群中的哪些节点相对应。可以通过集群的名字将节点配置进去,默认情况下,每个节点都是被设置加入到一个名字为"elatsicsearch"的集群,这就表示在网络上启动一些节点(假设它们之间可以相互发现),那么它们将会自动形成/加入到名字为elasticsearch
的单个集群。在单个群集中,可以拥有任意数量的节点。此外,如果网络上当前没有其他Elasticsearch节点正在运行,则默认情况下,启动单个节点将形成名为elasticsearch的新单节点集群。 -
Index
:索引是具有某些类似特征的文档集合,比如拥有客户数据的索引,产品目录的索引以及订单数据的索引。索引由名称标识(必须全部小写),此名称用于在对其中的文档执行索引、搜索、更新和删除操作时引用索引。在单个群集中,可以根据需要定义任意数量的索引。 -
Document
:文档(在Elasticsearch中使用JSON的形式表示)是可以编制索引的基本信息单元。例如,可以为单个客户提供文档,为单个产品提供另一个文档,为单个订单再提供另一个文档。在索引Index
中,可以根据需要存储任意数量的文档document
。请注意,尽管文档实际上驻留在索引中,但实际上必须将文档编入索引/分配给索引中的类型。 -
Shards
:索引Index
可能存储了超过单个节点的硬件限制的数据。例如,占用1TB磁盘空间的十亿个文档的单个索引可能不适合单个节点的磁盘,或者可能太慢而无法单独从单个节点提供搜索请求。为了解决这样的问题,Elasticsearch提供了将索引细分为多个称为碎片(Shards
)的功能,创建索引的时候就可以自定义碎片shards
的数量,这些碎片shards
本身都是功能齐全、可以托管到集群中任何节点的独立索引(index
)。碎片的分布方式和如何将其文档聚合回搜索请求都是完全由Elasticsearch管理的并且这些都是对用户透明的,分片(将索引分为一些碎片)最主要的原因有两个:- 允许平行拆分/模块化内容容量;
- 允许跨分片(这些碎片可能在多个节点上)分布和并行化操作,从而提高性能/吞吐量;
-
Replicas
:在网络/云端环境中,故障可能随时发生,为了避免某些碎片shards
或者节点node
由于某些原因脱机或者消失,强烈推荐使用故障转移机制。为此,Elasticsearch允许将索引的分片shards
的一个或多个副本制作成所谓的副本分片replica shards
或简称副本replicas
。副本replicas
重要的原因有两个:- 在碎片或节点挂掉时可以提供高度可用性。注意,碎片副本从来都不会被分配在源碎片所在的节点上(要挂一起挂,我还要副本干嘛( ఠൠఠ )ノ);
- 由于搜索可以在所有副本上并行执行,所以它扩展了搜索性能和吞吐量。
描述完,对ES的存储作简单说明,ES中的索引实际上是指向一个或者多个物理分片(即后续中的“碎片”
shards
)的逻辑命名空间,分片是底层的工作单元,每个分片存储了全部数据中的一部分,所以从某种意义上说,分片其实就是数据的容器,然后ES利用分片将数据分发到集群内各个地方,当集群规模扩大或者缩小时,ES会自动在各节点中迁移分片,使得数据仍然均匀分布在集群里,其实每个分片都是一个Lucene的实例,而且每个分片本身就是一个完整的搜索引擎。文档被存储和索引到分片内,但是应用程序是直接与索引交互而不是与分片进行交互的(数据被存储、索引在分片中,而索引仅仅是逻辑上的命名空间,这个命名空间由1个或多个分片组成,但应用程序只需要知道文档在哪个索引中即可)。索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量,一个副本分片只是一个主分片的拷贝。副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务。默认情况下,索引会被分为5个主分片和1个副本分片,但是具体数据量我们可以自己配,如(也可以通过配置更改默认情况):
PUT /blogs
{
// 动态配置索引的分片数量和分片副本数量
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
各个节点上的硬件资源是被分片所共享的,在一定程度上来讲,相同条件下,节点上分派的分片越少,各个分片的性能就越高,主分片的数量(排除硬件、使用场景,这个数量决定了这个索引能够存储的最大数据量,)在索引创建的时候就已经确定下来了,ES中的读操作(即搜索和返回数据)可以同时被主分片或副本分片所处理,所以当拥有越多的副本分片时,也将拥有越高的吞吐量,比如3个节点的集群上,blogs
索引将分片副本的数量调节为2,那就拥有9个分片:3个主分片和6个副本分片,这意味着可以将集群扩容到9个节点,每个节点上一个分片,相比原来3个节点时,集群搜索性能可以提升3倍!当然如果只是在相同节点数目的集群上增加更多副本并不能提高ES的性能,因为每个分片从节点上获取的资源会变少,反而会变慢,这时需要添加更多的资源提升吞吐量。
【总结】
每个索引index
可以分割为许多碎片shards
,当然这些索引可以有0个或多个副本,一旦索引有了副本,那就有了主碎片shards
和副本碎片replica shards
了。这些碎片shards
和副本replicas
的数量在索引被创建时就可以被定义出来,当然副本数量可以在索引创建后动态进行更改。虽然可以通过_shrink
和_split
接口对索引index
的碎片shards
数量进行更改,但是提前计划好碎片shards
的数量是最好的方式,也是非常重要的。默认情况下,Elasticsearch中的每个索引index
都被分了5个主碎片shards
和1个副本replica
,那就表示如果群集中至少有两个节点,则索引将包含5个主分片和另外5个副本分片(1个完整副本),每个索引总共有10个分片。
【注意】 每个Elasticsearch碎片shards
都是Lucene中的一个索引index
,对于一个Lucene索引index
所含的文档documents
数量通常都是有一个最大值,比如LUCENE-5843
,极限值是2,147,483,519 (= Integer.MAX_VALUE - 128)
,另外,可以通过_cat/shards
接口监控碎片shards
的体积。Type
属性在Elasticsearch 6.x.x
已经被弃用,所以这里不提了。
3. 基本操作
Elasticsearch提供强大支持Rest风格的API(顺便熟悉下),可以完成下面的一些操作(仅是部分):
- 检查集群
cluster
、节点node
和索引index
的运行状态和统计信息; - 管理集群、节点和索引数据以及元数据;
- 执行CRUD以及针对索引的搜索操作;
- 执行高级搜索操作,例如分页,排序,过滤,脚本编写,聚合等等;
3.1 Cluster Health
健康检查可以让给我们看到集群当前正在做的事情,正常可以通过curl
来干这事儿,当然可以使用任意工具(只要能执行HTTP/REST
请求即可),命令为curl -X GET "localhost:9200/_cat/health?v"
。使用_cat
API接口进行健康检查,比如:
C:\Users\liuwg-a\Desktop\curl-7.61.0_4-win64-mingw\curl-7.61.0-win64-mingw\bin>curl -X GET "localhost: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
1535783031 14:23:51 elasticsearch green 1 1 0 0 0 0 0 0 - 100.0%
【注意】这里记录一个坑,win10的powershell自带的curl应该是阉割版的,只能进行很简单的访问,没法带参,所以还是自己去下载一个win平台下的curl,配置教程这里就不写了,注意curl
命令是对大小写敏感的!
上面可以看到,“elasticsearch”集群目前是绿色状态,节点node
总共有1个,碎片shards
0个。注意,由于我们使用的是默认群集名称elasticsearch
,并且由于Elasticsearch默认使用单播网络发现来查找同一台计算机上的其他节点,因此可能会意外启动计算机上的多个节点并拥有它们所有都加入一个集群。使用curl -X GET "localhost:9200/_cat/nodes?v"
可以查看所有节点的详细信息,我这里只有一个V8JnETy
节点信息,本地结果为:
C:\Users\liuwg-a>curl -X GET http://localhost:9200/_cat/nodes?v
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
127.0.0.1 30 36 8 mdi * V8JnETy
关于health查询时的颜色说明如下:
- Green:集群
cluster
功能齐全,一切都很好; - Yellow:所有数据都可用,但尚未分配一些副本(群集功能齐全,但节点没有分配到具体合法节点上,单节点集群肯定是黄色,因为默认的副本分片没有节点分配);
- Red:某些数据由于某种原因不可用(群集只有部分功能);
【注意】当群集cluster
为红色时,它将继续提供来自可用分片的搜索请求,但您可能需要尽快修复它,因为存在未分配的分片。