架构和概念
架构
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)