文章目录
前言
作为程序猿,概念这玩意儿既飘渺又无用,概念背的再顺嘴也不及流利的敲代码,但概念这玩意儿却对理解框架和面试作用很大,总不能面试官让你现场写代码(大部分不会), 所以必要的概念还是要理解、背诵的
简介
ES简介
Elasticsearch is a real-time, distributed storage, search, and analytics engine
ElasticSearch是一个实时的分布式存储、搜索、分析的引擎Elasticsearch是面向文档型数据库,一条数据就是一个文档,用JSON作为文档序列化的格式
Elasticsearch是基于Lucene的搜索服务器, 它提供了一个开源的高拓展的分布式全文检索引擎,可以近乎实时的存储、检索数据!
- 分布式文档存储引擎、搜索引擎、分析引擎
- 数据以文档形式存储,使用JSON作为序列化格式
- 近乎实时,索引一个文档直到这个文档能够被搜索到有一个很小的延迟(通常1s)
概念
集群概念
集群
集群是一组具有相同cluster.name的节点集合,集群中的这些节点相互协同工作、共享数据,并提供故障转移和拓展功能,当然一个节点也可以组成一个集合, 如:
集群由唯一名称作为表示,默认为“elasticsearch”,根据个人需要可以更改,如果存在多个集群名称,则会出现多个集群,如果在相同网段中,尽量确保不同环境的集群名称不同,否则会导致节点加入错误的集群!
集群的状态通过绿、黄、红标识:
- 绿色,集群功能一切都很好
- 黄色,所有数据均可使用,但副本数据未齐全
- 红色,某些数据不可用
当集群出现红色时,应尽快修复,因为存在未分配分片,但它依然可以提供部分搜索请求
# 检查集群健康
[root@Genterator opt]# curl -XGET http://localhost:9200/_cat/health?v -u elastic:Admin\!123
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1685283013 14:10:13 es-cluster green 1 1 11 11 0 0 0 0 - 100.0%
节点
单个的ES服务实例成为节点(node), 一个节点是集群中的一个服务器,作为集群的一部分,可以管理索引、搜索索引、存储数据等,根据自身类型决定它的功能!
主节点(Master Node)
一个节点启动后,它会去寻找集群中的其他节点,并与之建立连接,集群会从候选主节点中选出一个主节点,它将负责管理集群范畴的变更,如创建、删除索引,添加、删除节点,以及决定将哪些分片分配给哪些节点等工作,Elasticsearch中的主节点的工作量相对较轻,主节点并不参与文档层面的变更和搜索,这意味着仅有一个master节点,并不会因流量增长而成为瓶颈
# 设置主节点
cluster.master: true
候选主节点(Master-eligible Node)
候选主节点具有成为主节点的资格,但它们尚未被选中。当主节点失效时,候选主节点将参与竞选新的主节点。
- 主节点和候选节点的身份是一样的,唯一区别是有没有被竞选成主节点
- 主节点在管理集群后,会将信息同步到候选节点,当主节点宕机后,候选节点则会推选出新的主节点用于管理集群
主节点 和 候选主节点 其实是一类的,主节点是候选主节点中选择出来的一个节点,所以每个候选主节点都有成为主节点的机会。
elasticsearch.yml文件中设置node.master:true
, 则该节点就会成为(候选)主节点。默认情况下,node.master的值都为true
, 即该节点既可以做主节点,也可以做候选节点。但由于数据节点承载了数据的操作,负载通常都很高,所以随着集群的扩大,建议二者分离,设置专用的候选主节点,当设置node.data为false,就将节点设置为专用候选主节点了
node.master: true
node.data: false
脑裂现象
主节点发生网络故障或其它原因导致主节点与数据节点之间失去联系时,可能出现多个主节点的情况,从而导致集群不一致的问题。这种情况下每个主节点都会认为自己是唯一的主节点,从而导致数据冲突和分裂。
为了避免脑裂,可以采取以下措施:
-
配置Quorum:在构建Elasticsearch集群时,应该设置奇数个主节点,例如3、5或7个。这样设置有助于确定一个“多数派”,即需要超过半数的主节点达成共识才能进行集群管理操作。这样,当一个主节点失效时,剩余的主节点仍然可以继续工作,并保证集群的稳定性。
-
配置ping_timeout参数:在Elasticsearch中,配置ping_timeout参数可以确保集群节点及时检测到其他节点的状态,以避免网络问题导致的集群不一致问题。默认情况下,ping_timeout设置为1秒钟,可以根据实际情况适当调整这个值。
-
启用Unicast模式:在Elasticsearch中,默认使用Multicast模式来发现集群中的节点。但是,由于Multicast网络不受可靠性保证,因此可能会导致节点无法及时发现彼此。为了解决这个问题,可以尝试启用Unicast模式,在配置文件中手动指定每个节点的地址。
-
配置quorum_override参数:在Elasticsearch 7.x版本中,引入了一个名为quorum_override的新参数,它允许用户配置集群管理操作所需的最小主节点数。这样可以避免错误地执行集群管理操作,并提高集群的稳定性。
数据节点(Data node)
数据节点持有数据和倒排索引,负责数据的存储和相关具体操作,比如CRUD、搜索、聚合。所以,数据节点对机器配置要求较高,首先需要足够空间存储数据,其次数据操作对系统CPU、Memory和IO的性能消耗都很大。通常随着集群的扩大,需要增加更多的数据节点来提高可用性。
默认情况下,每个节点都可以通过设定配置文件elasticsearch.yml中的node.data属性为true(默认)成为数据节点。如果需要一个专门的主节点,应将其node.master属性设置为false:
node.master = false
node.data = true
客户端节点(Client Nodes)
客户端节(Client node)就是既不做候选主节点也不做数据节点的节点,只负责请求的分发、汇总等等,也就是下面要说到的协调节点的角色。这样的工作,其实任何一个节点都可以完成,单独增加这样的节点更多是为了负载均衡。
node.master = false
node.data = false
协调节点(Coordination Nodes)
是一种角色,而不是真实的Elasticsearch的节点,集群中的任何节点都可以充当协调节点。
当一个节点收到客户端请求后,它会根据规则分发到其他节点,其他节点处理后会将结果返回到此节点,此节点会合并各个节点返回的结果,并返回一个完整的数据集给用户。这个过程中,此节点就扮演的协调节点角色。
分片(Shard)
我们都知道单台服务器的容量有限,在这个信息爆炸的年代,PB级别的数据随处可见,所以大数据框架中,很多框架开始采用分片存储,一方面可以将容量做到水平拓展,容量不再局限于单台服务器;另一方面,如果巨量数据操作(搜索等)给服务器的压力也很大,导致操作延迟甚至超时,而分片可以有效的将数据操作分配给各个分片,在通过聚合返回给客户端,这样可以提高系统吞吐和性能
ES中可以将一个索引中的数据切分成多个shard分片,分部在多台服务器上存储,这样可以横向拓展存储更多数据,让搜索、分析分部到多台服务器去执行,增大存储量的同时也提高了吞吐量和性能
- primary shard 建立索引时一次设置,不能修改,默认5个
- 条件允许的情况下,单个节点只保存一份索引的分片
- 分片的分布方式和数据的聚合操作完全由elasticsearch管理
副本(Replica)
副本,说直接点就是对分片的备份,副本的数据和分片同步,当我们操作分片后,分片会将操作后的数据同步到副本,其目的也是为了当分片或者节点发生故障时提供高可用,可以在shard故障时提供备用服务,保证数据不丢失,其次多个副本可以提升搜索操作的吞吐量和性能
- replica shard 默认1个,随时可以修改
- 副本同分片数据一致,且分部在不同节点上,一般相同分片的副本不会存在同一个node节点上
- 副本可以提供搜索功能,es会自动对搜索请求进行负载均衡,提高吞吐量和性能
数据概念
Elastic 和 关系型数据库 概念对比:
ElasticSearch | RDBMS |
---|---|
索引(index) | 数据库(DataBase) |
类型(type)---- 7.x已被弃用 | 表(table) |
文档(doucument) | 行(row) |
字段(field) | 列(column) |
映射(mapping) | 表结构(schema) |
查询DSL | SQL |
GET | select |
PUT/POST | update |
DELETE | delete |
(1)关系型数据库中的数据库(DataBase),等价于ES中的索引(Index)
(2)一个数据库下面有N张表(Table),等价于1个索引Index下面有N多类型(Type),
(3)一个数据库表(Table)下的数据由多行(ROW)多列(column,属性)组成,等价于1个Type由多个文档(Document)和多Field组成。
(4)在一个关系型数据库里面,schema定义了表、每个表的字段,还有表和字段之间的关系。 与之对应的,在ES中:Mapping定义索引下的Type的字段处理规则,即索引如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等。
(5)在数据库中的增insert、删delete、改update、查search操作等价于ES中的增PUT/POST、删Delete、改_update、查GET.
索引(Index)
在 Elasticsearch 中,索引是一个包含一定类型文档的逻辑容器。它类似于关系型数据库中的库
,但具有更大的灵活性和可扩展性。每个索引都有自己的配置和映射,以确定存储其中的文档的结构和属性。
在索引中存储的文档可以使用其唯一标识符进行检索。Elasticsearch 会将每个文档分配一个唯一的 ID,或者您也可以指定自己的 ID。您还可以针对特定字段创建索引,以便快速搜索匹配项。这些索引可以是全文本、数字、日期等类型。
类型(Type)
一个类型过去是索引的逻辑类别/分区,允许你在同一索引中存储不同类型的文档, 类似于关系型数据库中的表
在索引中创建多个类型不再可能,类型的整个概念将在稍后的版本中删除。相当于sql领域中表的概念。
在 5.X 版本中,一个 index 下可以创建多个 type;
在 6.X 版本中,一个 index 下只能存在一个 type;
在 7.X 版本中,直接去除了 type 的概念,就是说 index 不再会有 type。
文档(Document)
一个文档是一个可以建立索引的基本单元。文档是用JSON表示的,这是一种无处不在的互联网数据交换格式。类比关系数据库里的一行记录(record),document 是 Elasticsearch 里的一个 JSON 对象,包括零个或多个field。 文档是信息的基本单元,可以被索引的。文档是以JSON格式表现的。
在类型中,可以根据需求存储多个文档。
虽然一个文档在物理上位于一个索引,实际上一个文档必须在一个索引内被索引和分配一个类型。
文档相对于关系型数据库的列。
映射(Mapping)
类比关系型数据库中的 schema 概念,mapping 定义了 index 中字段的 type。mapping 可以显示的定义,也可以在 document 被索引时自动生成,如果有新的 field,Elasticsearch 会自动推测出 field 的type并加到mapping中。
一个mapping属于一个索引的type(类型),每个文档都属于一个type,一个type有一个mapping定义,但7.0开始,不需要在mapping定义指定type类型(7.0以后,type被弃用)
映射是创建索引的时候,可以预先定义字段的类型以及相关属性。
ElasticSearch会根据json源数据的基础类型去猜测你想要的的字段映射,将输入的数据变成可搜索的索引项。Mapping就是我们自己定义字段的数据类型,同事告诉ElasticSearch如果索引数据以及是否可以被搜索到
作用:
- 预先定义索引中的字段名称
- 预先定义字段的数据类型
- 字段,倒排索引相关配置,(Analyzed or NOT Analyzed)
映射方式
静态映射
静态映射:手动进行类型配置
动态映射
动态映射: 不需要提前创建index、定义mapping信息和type类型, 你可以 直接向ES中插入文档数据时, ES会根据每个新field可能的数据类型, 自动为其配置type等mapping信息, 这个过程就是动态映射(dynamic mapping)
ES根据文档类型动态生成mapping后,就不再支持修改字段类型, Luene 实现的倒排索引,一旦生成后,就不允许修改!
- 如果修改了字段的数据类型,会导致已被索引的属于无法被搜索
- 但是如果是增加新的字段,就不会有这样的影响
如果希望改变字段类型,必须 Reindex API
,重建索引
-
动态映射配置
# 设置动态映射类型 PUT {index}/_mapping { # dynamic默认为true "dynamic":false }
- Dynamic 设置为 true 时,一定有新增字段的文档写入,Mapping 也同时被更新
- Dynamic 设为 false,Mapping 不会被更新,自增字段的数据无法被索引,但是信息会出现在_source 中
- Dynamic 设置成 Strict 文档写入失败
true false strict 文档可索引 YES YES NO 字段可索引 YES NO NO Mapping 被更新 YES NO NO -
类型识别
ES会根据新field可能的数据类型自动为其配置mapping类型,通过json类型自己配置ES支持的类型
JSON 类型 ElasticSearch 类型 字符串 匹配日期格式设置成 Date 设置数字设置为 float 或者 long,该选项默认关闭 设置为 Text, 并增加 keyword 子字段 浮点数 float 整数 long 布尔值 boolean 对象 Object 数组 由第一个非空数值的类型所决定 空值 忽略
数据类型
-
简单类型
-
Text / Keyword
-
Date
-
long,integer,short,byte,double,float
-
date
-
Boolean
-
-
专业类型
- ipv4 & ipv6
-
复杂类型
- 对象类型 / 嵌套类型
-
特殊类型
- geo_point & geo_shape / percolator
如图所示:
源类型 | ES支持类型 |
---|---|
String类型 | text,keywork(string类型在es已经被弃用) |
数字类型 | long,integer,short,byte,double,float |
日期类型 | date |
bool类型 | boolean |
binary类型 | binary类型 |
复杂类型 | object,nested |
geo类型 | point,geo-shape |
专业类型 | ip,competion |