跳到主要内容

架构和概念

架构

Elasticsearch(以下简称"ES")基于Apache Lucence,是无模式和面向文档的数据库。ES集群是指一个节点或多个ES节点连接在一起。各个节点有各自的目的和任务,但是每个节点都可以将客户端的请求转发到合适的节点上。

节点种类

  • 主节点(Master):主节点的任务主要是负责轻量级集群范围内的操作,包括创建和删除索引,追踪集群节点,以及确定所分配的分片位置。默认情况下,主节点角色处于启用状态。任何符合主节点资格的节点都可以通过选举过程成为主节点。通过修改elasticsearch.yml文件将node.master: false可以禁用节点成为主节点。
  • 数据节点(Data):包括索引文档的数据,处理相关的操作,例如创建、读取、更新、删除、搜索、聚合。默认情况下,数据节点角色处于启用状态。通过修改elasticsearch.yml文件将node.data: false可以禁用节点成为数据节点。
  • 摄取节点(Injest):在摄取节点中,在文档索引之前,预先处理文档。默认情况下,摄取节点角色处于启用状态。通过修改elasticsearch.yml文件将node.ingest: false可以禁用节点成为摄取节点。
  • 机器学习节点(Machine Learning):提供机器学习功能。默认启用。通过修改elasticsearch.yml文件将node.ml: false可以禁用节点成为机器学习节点。
  • 转换节点:提供索引转换功能。默认启用,集群中至少有一个节点启用转换节点,并且要在所有符合主节点资格和所有数据节点上,将xpack.transform.enabled置为true。通过修改elasticsearch.yml文件将node.transform: false可以禁用节点成为转换节点。
  • 协调节点(Coordinating):如果以上节点功能均被禁用,则该节点仅执行路由请求,处理搜索结果和分发协调工作。

查看节点信息:

curl http://127.0.0.1:9200/_nodes?pretty=true

分片

  • 主分片,用以解决数据水平扩展的问题。通过主分片,可以将数据分布到集群内的所有节点之上。
    • 一个分片是一个运行的lucene的实例
    • 主分片数再索引创建时指定,后续不允许修改,除非reindex。
  • 副本,用以解决数据高可用的问题。分片是主分片的拷贝。
    • 副本分片数,可以动态调整
    • 增加副本数,还可以在一定程度上提高副本的可用性。
# 查看集群健康状况
curl -X GET http://127.0.0.1:9200/_cluster/health | python -m json.tool

# 查看集群节点
curl -X GET http://127.0.0.1:9200/_cat/nodes

# 查看集群分片
curl -X GET http://127.0.0.1:9200/_cat/shards

关键概念

集群(Cluster)

在ES中,集群中包含一组索引。

索引(Index)

索引是ES中最大的数据单位。索引是文档索引的逻辑分区,是搜索查询的目标。

  • Index - 索引是文档的容器,是一类文档的集合
    • Index 体现了逻辑空间的概念:每个索引都有自己的Mapping 定义,用于定义包含的文档的字段名和字段类型
    • Shard 体现了物理空间的概念:索引中的数据分散在 Shard 中
  • 索引中的Mapping 和 Setting
    • Mapping 定义文档字段的类型
    • Setting 定义不同的数据分布

文档(Document)

文档就像是将字段分组的行。一个文档在ES中以JSON对象表达。

  • Elasticsearch 是面向文档的,文档是所有可搜索数据的最小单位
    • 日志文件中的日志项
    • 一本电影的具体信息/一张唱片的详细信息
    • MP3播放器里的一首歌/一篇PDF文档中的具体内容
  • 文档会被序列化为 JSON 格式,保存在ES中
    • JSON对象由字段组成
    • 每个字段都有对应的字段类型
  • 每个文档都有一个Unique ID
    • 可以自行指定 ID
    • 或者通过ES自动生成

字段

字段是ES中最小的数据单位,可以包含相同类型的多个值的数组。

映射(Mapping)

ES是无模式的,无需预先指定模式即可对文档建立索引。索引中创建第一条文档时如果没有指定静态映射,ES会自行决定如何对这文档进行索引,并动态产生一个文档索引映射来进行索引。ES称模式为映射,是描述Lucence如何存储索引文档及其包含的字段。当向文档添加新字段,映射也会自动更新。

每个索引仅允许一种映射类型。映射类型由数据类型和元字段定义的字段组成。

分析器(Analyzer)

ES内置众多分析器,也可以自定义分析器。分析器包含三个模块:

  • 字符过滤器(character filter)
  • 分词器(tokenizer)
  • 词元过滤器(token filter)