ES的基本概念
一、文档
1.1 文档相关概念
- ES是面向文档的,文档是所有可搜索数据的最小单位,可以对比理解为关系型数据库中的一条数据
- 日志文件中的一条日志信息
- 一本电影的具体信息/一张唱片的详细信息
- 文档会被序列化成JSON格式保存在ES中
- JSON对象由字段组成
- 每个字段都有对应的字段类型
- 格式比较灵活,不需要预先定义
- 字段的类型可以指定(在索引中的Mapping中指定),也可通过ES自动推算
- 支持数组和嵌套
- 每个文档都有一个Unique ID
- 可以自定义ID
- 也可以通过ES自动生成
1.2 文档的元数据
-
元数据,用于标注文档的相关信息
- _index:文档所属的索引名
- _type:文档所属的类型名,7.0开始每个索引只能创建一个type
- _id:文档的唯一ID
- _source:文档原始的JSON数据
- _all:整合所有的字段内容,7.0以后已经废除
- _version:文档的版本信息,在高并发的情况下会判断文档版本后再进行写入
- _score:相关性打分
{"_index" : "movies","_type" : "doc","_id" : "1","_score" : 14.69302,"_source" : {"year" : 1995,"@version" : "1","genre":["Adventure","Animation","Children","Comedy","Fantasy"],"id":"1","title":"Toy Story"} }
二、索引
2.1 索引的基本概念
- 索引是文档的容器,是一类文档的集合(可以理解为关系型数据库中的表)
- 索引(index)体现了逻辑空间的概念:每个索引都有自己的mapping定义,用于定义包含的文档的字段名和字段类型
- 索引的Mapping定于文档字段的类型
- Setting定义不同的数据分布
- 分片(shard)体现了物理空间的概念:索引中的数据分散在Shard上
- 索引(index)体现了逻辑空间的概念:每个索引都有自己的mapping定义,用于定义包含的文档的字段名和字段类型
2.2 与关系型数据库对比
关系型数据库 | ES |
---|---|
Table | Index |
Row | Document |
Column | Field |
Schema | Mapping |
SQL | DSL |
三、节点
3.1 节点的基本概念
ES支持分布式部署,其分布式架构支持存储的水平扩容,并且提高了系统的可用性,部分节点停止服务,整个集群的服务不受影响。
ES的分布式架构,不通的集群通过不通的名字来区分,默认集群的名称为elasticsearch,通过配置文件的修改或者直接在启动命令中指定 -E cluster.name=mymain进行设定,一个集群支持一个到多个节点。
-
节点就是一个ES的实例
- 本质上就是一个Java进程
- 一台机器上可以运行多个ES进程
-
每个节点都有一个名字,通过配置文件配置或者启动的时候通过-E node.name=node1指定
-
每个节点在启动以后都会分配一个UUID,保存到data目录下
-
Master节点的概念
- 每个节点启动后,默认就是一个Master-eligible节点,可以通过node.master:false禁止
- Master-eligible节点可以参加选主流程,成为Master节点
- 当第一个节点启动的时候,它会将自己选举成Master节点
- 每个节点上都保存了集群的状态,只有Master节点才能修改集群的状态信息
- 集群状态,维护了一个集群中必要的信息:
- 所有的节点信息
- 所有的索引和其相关的Mapping和Setting信息
- 分片的路由信息
- 如果任意节点都能修改信息会导致数据的不一致性
- 集群状态,维护了一个集群中必要的信息:
-
Data节点
- 可以保存数据的节点叫做Data节点。负责保存分片数据,在数据扩展上起到了至关重要的作用
-
Coordinating节点
-
负责接受Client的请求,将请求分发到合适的节点,最终把结果汇集到一起
-
每个节点都默认起到Coodinating节点的职责
问题:当一个机器上启动多个实例的时候,谁是Master节点,谁是Data节点,谁是Coordinating节点,谁提供的9200端口
-
-
Ingest节点
-
主要用于对数据进行预处理。Ingest节点类似于Logstash中的Filter,可以对数据进行解析、转换和过滤等操作。当数据到达Ingest节点时,它会先对数据进行预处理,然后再将数据发送到Elasticsearch的Data节点进行索引和存储。
-
Hot&Warm节点
- 不通硬件配置的Data Node,用来实现Host & Warm架构,降低集群部署的成本
- Hot节点:这些节点通常用于存储和处理最新的、访问频率最高的数据,也就是所谓的“热”数据。Hot节点通常配置有高性能的硬件(如SSD固态硬盘),以确保快速的数据写入和检索速度。由于这些数据是最常被访问的,因此将它们存储在高性能的节点上可以确保最佳的用户体验。
- Warm节点:与Hot节点相比,Warm节点用于存储那些访问频率较低但仍然需要保留的数据。这些数据可能不再是最新的,但仍然具有一定的价值,需要被检索和分析。Warm节点通常配置有较低性能的硬件(如HDD机械硬盘),以降低存储成本。通过将不常访问的数据迁移到Warm节点,可以释放Hot节点的存储空间,使其能够更高效地处理新的、热门的数据。
-
Machine Learning 节点
- 负责跑机器学习的Job,做数据的异常检测
-
Tribe节点
- 5.3 开始使用Cross Cluster Search
- Tribr Node连接到不通的ES集群并支持将这些集群当成一个单独的集群处理
3.2 配置节点类型
-
开发环境中一个节点可以承担多种角色
-
生产环境中,应该设置单一的角色
节点类型 配置参数 默认值 master eligible node.master true data node.data true hot&warm node.attr.box_type 无 ingest node.ingest true coordinating only 无 每个节点默认都是coordinating节点,设置其他类型全部为false machine learning node.ml true
四、分片
4.1 分片的基本概念
-
在Elasticsearch中,分片(Shard)是数据的基本单位,每个索引在创建时都会被分成多个分片。这些分片是数据的容器,用于存储索引中的数据。每个分片实际上是一个独立的索引实例,包含了数据的一个完全独立的物理副本,这意味着每个分片都包含了数据的一个完整复制集。
-
分片的主要目的是为了在Elasticsearch集群中分发数据,以提供高可用性和负载均衡。通过将数据分散到不同的分片上,Elasticsearch可以在多个节点上并行处理数据,从而提高性能和可扩展性。每个分片都可以独立扩展,而不会影响其他分片的性能。此外,Elasticsearch还支持动态分片分配,这意味着可以自动将新的索引或文档分配到最合适的分片上。
-
在Elasticsearch中,分片可以跨多个节点分布,以提高数据的可用性和可扩展性。当集群扩容或缩小时,Elasticsearch会自动在节点间迁移分片,以使集群保持平衡。分片可以是主分片(primary shard)或者是复制分片(replica shard),主分片用于存储实际数据,而复制分片则是主分片的副本,用于提高数据的可靠性和可用性。
-
我们举例来说明分片的概念与作用:
- 分片是把一个索引分成多个小部分的过程。还是用图书馆作为例子,想象图书馆里的书太多了,一个书架放不下,于是你决定把书分散到多个书架上。每个书架就相当于一个分片。这样,当你想要找书时,你可以同时搜索多个书架,从而加快搜索速度。
4.2 分片的规划
在Elasticsearch中,分片的规划是非常重要的,因为它直接影响到集群的性能、扩展性和数据安全性。以下是一些建议,帮助你规划Elasticsearch中的分片:
- 考虑数据量:首先,你需要估计索引的总数据量。这将帮助你决定需要多少个分片来存储这些数据。每个分片的大小应该控制在一定的范围内,以避免过大或过小的分片导致性能问题。
- 节点和分片的关系:分片数应该与集群中的节点数相匹配。通常,建议将分片数设置为节点数的2-3倍,这样可以在节点故障时提供一定的容错能力。但是,也要避免分片数过多,以免给集群带来过大的压力。
- 主分片和副本:每个索引都应该有一个或多个主分片,以及零个或多个副本分片。主分片用于存储实际数据,而副本分片则是主分片的复制品,用于提高数据的可靠性和查询性能。副本分片的数量可以根据你的需求进行调整,通常建议设置为1-2个副本。
- 动态调整:随着数据量的增长和集群规模的变化,你可能需要动态地调整分片数。Elasticsearch提供了重新索引和分片调整的功能,允许你在不中断服务的情况下调整分片配置。
- 监控和调优:定期监控集群的健康状况、分片分布和性能指标是非常重要的。通过使用Elasticsearch提供的监控工具和API,你可以了解集群的实时状态,并根据需要进行调优。
- 考虑分片键:在创建索引时,你需要选择一个合适的分片键。分片键的选择将决定数据如何被分配到不同的分片中。选择一个合适的分片键可以确保数据的均匀分布和查询性能的优化。
五、倒排索引
在了解倒排索引之前我们先讲解一下什么是正排索引,正排索引就是根据ID查询具体的数据,可以类比于一本书的目录,我们可以快速的根据目录中的页码快速找到对应的内容,而假如现在我们有一个关键词,需要知道关键词所在页码,那么就需要一个关键词和页码的一个索引来帮助我们根据关键词找到对应的页码,这个索引就叫做倒排索引。
概念 | 图书 | 搜索引擎 |
---|---|---|
正排索引 | 目录 | 文档ID到文档内容和单词的关联 |
倒排索引 | 索引页 | 单词到文档ID的关联 |
我们来举个正排索引和倒排索引的例子:
-
正排索引
文档ID 文档内容 1 Mastering ElasticSearch 2 ElasticSearch Server 3 ElasticSearch Client -
倒排索引
关键词 计数 文档ID:位置 Mastering 1 1:1 ElasticSearch 3 1:2,2:1,3:1 Server 1 2:2 Client 1 3:2
倒排索引的组成:
- 单词词典,记录所有文档的单词,记录单词到倒排列表的关联关系
- 单词词典一般比较大,可以通过B+树或者哈希链算法来实现,以满足高性能的插入和查询
- 倒排列表,记录单词对应的文档组合,由倒排索引项组成
- 倒排索引项
- 文档ID
- 词频TF,该单词在文档中出现的次数,用于相关性打分
- 位置,该单词在文档分词中的位置,用于语句搜索
- 偏移,记录单词的开始结束位置,用于高亮显示
- 倒排索引项