想要用好 ElasticSearch,首先要了解其核心概念、名词和属性。这就好比想要看懂地图,首先要知道地图里常用的标记符号一样。
Elasticsearch 的核心概念有 Node、Cluster、Shards、Replicas、Index、Type、DocumerSettings、Mapping 和 Analyzer,这里总结了最全最详细的名词介绍,对 ElasticSearch 一知半解的读者来说,还是值得学习的。
1. Node
即节点。节点是组成 Elasticsearch 集群的基本服务单元,集群中的每个运行中的 Elasticsearch 服务器都可称之为节点。
2. Cluster
即集群。Elasticsearch 的集群是由具有相同 cluster.name (默认值为elasticsearch)的一个或多个 Elasticsearch 节点组成的,各个节点协同工作,共享数据。
同一个集群内节点的名字不能重复,但集群名称一定要相同。在实际使用 Elasticsearch 集群时,一般需要给集群起一个合适的名字来替代 cluster.name 的默认值。
自定义集群名称的好处是,可以防止一个新启动的节点加入相同网络中的另一个同名的集群中。
在 Elasticsearch 集群中,**节点的状态有 Green、Yellow 和 Red 三种,**分别如下所述。
① Green:绿色,表示节点运行状态为健康状态。所有的主分片和副本分片都可以正常工作,集群100%健康。
② Yellow:黄色,表示节点的运行状态为预警状态。**所有的主分片都可以正常工作,但至少有一个副本分片是不能正常工作的。**此时集群依然可以正常工作,但集群的高可用性在某种程度上被弱化。
③ Red:红色,表示集群无法正常使用。此时,集群中至少有一个分片的主分片及它的全部副本分片都不可正常工作。虽然集群的查询操作还可以进行,但是也只能返回部分数据(其他正常分片的数据可以返回),而分配到这个有问题分片上的写入请求将会报错,最终导致数据丢失。
3. Shards
即分片。当索引的数据量太大时,受限于单个节点的内存、磁盘处理能力等,节点无法足够快地响应客户端的请求,此时需要将一个索引上的数据进行水平拆分。拆分出来的每个数据部分称之为一个分片。
一般来说,每个分片都会放到不同的服务器上。进行分片操作之后,索引在规模上进行扩大,性能上也随之水涨船高的有了提升。Elasticsearch 依赖 Lucene,Elasticsearch 中的每个分片其实都是 Lucene 中的一个索引文件,因此每个分片必须有一个主分片和零到多个副本分片。
当软件开发人员在一个设置有多分片的索引中写入数据时,是通过路由来确定具体写入哪个分片中的,因此在创建索引时需要指定分片的数量,并且分片的数量一旦确定就不能更改。
当软件开发人员在查询索引时,需要在索引对应的多个分片上进行查询。Elasticsearch会把查询发送给每个相关的分片,并汇总各个分片的查询结果。对上层的应用程序而言,分片是透明的,即应用程序并不知道分片的存在。
在 Elasticsearch 中,默认为一个索引创建5个主分片,并分别为每个主分片创建一个副本。
4. Replicas
即备份,也可称之为副本。副本指的是对主分片的备份,这种备份是精确复制模式。每个主分片可以有零个或多个副本,主分片和备份分片都可以对外提供数据查询服务。
当构建索引进行写入操作时,首先在主分片上完成数据的索引,然后数据会从主分片分发到备份分片上进行索引。
当主分片不可用时,Elasticsearch会在备份分片中选举出一个分片作为主分片, 从而避免数据丢失。
一方面,备份分片既可以提升Elasticsearch系统的高可用性能,又可以提升搜索时的并发性能;另一方面,备份分片也是一把双刃剑,即如果备份分片数量设置得太多,则在写操作时会增加数据同步的负担。
5. Index
即索引。Elasticsearch中,索引由一个和多个分片组成。在使用索引时,需要通过索引名称在集群内进行唯一标识。
6. Type
即类别。类别指的是索引内部的逻辑分区,通过Type的名字在索引内进行唯一标识。在查询时如果没有该值,则表示需要在整个索引中查询。
7. Document
即文档。索引中的每一条数据叫作一个文档,与关系数据库的使用方法类似,一条文档数据通过id在Type内进行唯一标识。
8. Settings
Settings是对集群中索引的定义信息,比如一个索引默认的分片数、副本数等。
9. Mapping
Mapping 表示中保存了定义索引中字段(Field)的存储类型、分词方式等、是否存储等信息,有点类似于关系数据库(如MySQL)中的表结构信息。
在 Elasticsearch 中,Mapping 是可以动态识别的。如果没有特殊需求,则不需要手动建Mapping,因为 Elasticsearch 会根据数据格式自动识别它的类型。
当需要对某些字段添特殊属性时,如定义使用其他分词器、是否分词、是否存储等,就需要手动设置 Mapping 了。
一个索引的Mapping一旦创建,若已经存储了数据,就不可修改了。
10. Analyzer
Analyzer 表示的是字段分词方式的定义。一个 Analyzer 通常由一个 Tokenizer 和零到多个 Filter 组成。
在 Elasticsearch 中,默认的标准 Analyzer 包含一个标准 Tokenizer 和三个 Filter,即
- Standard Token Filter
- Lower Case Token Filter
- Stop Token Filter
写在最后
分别从物理和逻辑的角度来看,这些概念从大到小的关联关系是:
物理概念:集群 > 节点 逻辑概念:索引 > 分片/副本 > 类别 > 文档
对于这些 ElasticSearch 的名词解释,对新手来说,还是要基本了解。对齐概念之后,学习 ES 就不会一头雾水了。