ElasticSearch 集群架构与搜索深入理解(上)

简介: ElasticSearch 集群架构与搜索深入理解

一. Elasticsearch架构原理

1、Elasticsearch的节点类型


在Elasticsearch主要分成两类节点,一类是Master,一类是DataNode。


1.1 Master节点


在Elasticsearch启动时,会选举出来一个Master节点。当某个节点启动后,然后

使用Zen Discovery机制找到集群中的其他节点,并建立连接。


discovery.seed_hosts: ["192.168.21.130", "192.168.21.131", "192.168.21.132"] 


并从候选主节点中选举出一个主节点。


cluster.initial_master_nodes: ["node1", "node2","node3"] 


Master节点主要负责:


管理索引(创建索引、删除索引)、分配分片

维护元数据

管理集群节点状态

不负责数据写入和查询,比较轻量级

一个Elasticsearch集群中,只有一个Master节点。在生产环境中,内存可以相对

小一点,但机器要稳定。


1.2 DataNode节点


在Elasticsearch集群中,会有N个DataNode节点。DataNode节点主要负责:

数据写入、数据检索,大部分Elasticsearch的压力都在DataNode节点上

在生产环境中,内存最好配置大一些


二 、分片和副本机制

2.1 分片(Shard)


Elasticsearch是一个分布式的搜索引擎,索引的数据也是分成若干部分,分布在不同的服务器节点中


分布在不同服务器节点中的索引数据,就是分片(Shard)。Elasticsearch会自动管理分片,如果发现分片分布不均衡,就会自动迁移


一个索引(index)由多个shard(分片)组成,而分片是分布在不同的服务器上的


2.2 副本


为了对Elasticsearch的分片进行容错,假设某个节点不可用,会导致整个索引库

都将不可用。所以,需要对分片进行副本容错。每一个分片都会有对应的副本。在Elasticsearch中,默认创建的索引为1个分片、每个分片有1个主分片和1个副本

分片。


每个分片都会有一个Primary Shard(主分片),也会有若干个Replica Shard(副

本分片)


Primary Shard和Replica Shard不在同一个节点上


2.3 指定分片、副本数量


// 创建指定分片数量、副本数量的索引 
PUT /job_idx_shard_temp 
{ 
"mappings":{ 
"properties":{ 
"id":{"type":"long","store":true}, 
"area":{"type":"keyword","store":true}, 
"exp":{"type":"keyword","store":true},  
"edu":{"type":"keyword","store":true}, 
"salary":{"type":"keyword","store":true}, 
"job_type":{"type":"keyword","store":true}, 
"cmp":{"type":"keyword","store":true}, 
"pv":{"type":"keyword","store":true}, 
"title":{"type":"text","store":true}, 
"jd":{"type":"text"} 
} 
}, 
"settings":{ 
"number_of_shards":3, 
"number_of_replicas":2 
} 
} 
// 查看分片、主分片、副本分片 
GET /_cat/indices?v 

三、Elasticsearch重要工作流程

3.1 Elasticsearch文档写入原理


image.png


1.选择任意一个DataNode发送请求,例如:node2。此时,node2就成为一个

coordinating node(协调节点)


2.计算得到文档要写入的分片


shard = hash(routing) % number_of_primary_shards

routing 是一个可变值,默认是文档的 _id


3.coordinating node会进行路由,将请求转发给对应的primary shard所在的

DataNode(假设primary shard在node1、replica shard在node2)


4.node1节点上的Primary Shard处理请求,写入数据到索引库中,并将数据同步到

Replica shard


5.Primary Shard和Replica Shard都保存好了文档,返回client


3.2 Elasticsearch检索原理


image.png


client发起查询请求,某个DataNode接收到请求,该DataNode就会成为协调节点 (Coordinating Node)


协调节点(Coordinating Node)将查询请求广播到每一个数据节点,这些数据节点的分片会处理该查询请求


每个分片进行数据查询,将符合条件的数据放在一个优先队列中,并将这些数据的文档ID、节点信息、分片信息返回给协调节点


协调节点将所有的结果进行汇总,并进行全局排序


协调节点向包含这些文档ID的分片发送get请求,对应的分片将文档数据返回给协调节点,最后协调节点将数据返回给客户端


四、Elasticsearch准实时索引实现

4.1 溢写到文件系统缓存


**当数据写入到ES分片时,会首先写入到内存中,然后通过内存的buffer生成一个 segment,并刷到文件系统缓存中,数据可以被检索(注意不是直接刷到磁盘) ES中默认1秒,refresh一次 **


4.2 写translog保障容错


在写入到内存中的同时,也会记录translog日志,在refresh期间出现异常,会根据translog来进行数据恢复


等到文件系统缓存中的segment数据都刷到磁盘中,清空translog文件


4.3 flush到磁盘


ES默认每隔30分钟会将文件系统缓存的数据刷入到磁盘


4.4 segment合并


Segment太多时,ES定期会将多个segment合并成为大的segment,减少索引查询时IO开销,此阶段ES会真正的物理删除(之前执行过的delete的数据)


image.png


五.手工控制搜索结果精准度

5.1、下述搜索中,如果document中的remark字段包含java 或 developer 词组,都符合搜索条件。


GET /es_db/_search 
{ 
"query": { 
"match": { 
"remark": "java developer" 
} 
} 
} 


如果需要搜索的document中的remark字段,包含java和developer词组,则需要使

用下述语法:


GET /es_db/_search 
{ 
"query": { 
"match": { 
"remark": { 
"query": "java developer", 
"operator": "and" 
} 
} 
} 
} 


上述语法中,如果将operator的值改为or。则与第一个案例搜索语法效果一致。默认的ES执行搜索的时候,operator就是or。


如果在搜索的结果document中,需要remark字段中包含多个搜索词条中的一定比例,可以使用下述语法实现搜索。其中minimum_should_match可以使用百分比或固定数字。百分比代表query搜索条件中词条百分比,如果无法整除,向下匹配(如,query条件有3个单词,如果使用百分比提供精准度计算,那么是无法除尽的,如果需要至少匹配两个单词,则需要用67%来进行描述。如果使用66%描述,ES 则认为匹配一个单词即可。)。固定数字代表query搜索条件中的词条,至少需要 匹配多少个。


GET /es_db/_search 
{ 
 "query": { 
 "match": { 
 "remark": { 
 "query": "java architect assistant", 
 "minimum_should_match": "68%" 
 } 
} 
} 
}


如果使用should+bool搜索的话,也可以控制搜索条件的匹配度。具体如下:下述

案例代表搜索的document中的remark字段中,必须匹配java、developer、 assistant三个词条中的至少2个。


GET /es_db/_search 
{ "query": { 
 "bool": { 
 "should": [ 
   { 
   "match": { 
   "remark": "java" 
   } 
   }, 
   { 
   "match": { 
   "remark": "developer" 
   } 
   }, 
   { 
   "match": { 
   "remark": "assistant" 
   } 
   } 
 ], 
 "minimum_should_match": 2 
 } 
 } 
} 

5.2、match 的底层转换


其实在ES中,执行match搜索的时候,ES底层通常都会对搜索条件进行底层转换,

来实现最终的搜索结果。如:


GET /es_db/_search 
{ 
"query": { 
"match": { 
"remark": "java developer" 
} 
} 
} 
# 转换后是: 
GET /es_db/_search 
{ 
"query": { "bool": { 
"should": [ 
{ 
"term": { 
"remark": "java" 
} 
}, 
{ 
"term": { 
"remark": { 
"value": "developer" 
} 
} 
} 
] 
} 
} 
} 
# 完全匹配
GET /es_db/_search 
{ 
"query": { 
"match": { 
"remark": { 
"query": "java developer", 
"operator": "and" 
} 
} 
} 
} 
# 转换后是: 
GET /es_db/_search 
{ 
"query": { 
"bool": { 
"must": [ 
{ 
"term": { 
"remark": "java" 
} }, 
{ 
"term": { 
"remark": { 
"value": "developer" 
} 
} 
} 
] 
} 
} 
} 
# 匹配度
GET /es_db/_search 
{ 
"query": { 
"match": { 
"remark": { 
"query": "java architect assistant", 
"minimum_should_match": "68%" 
} 
} 
} 
}
# 转换后为: 
GET /es_db/_search 
{ 
"query": { 
"bool": { 
"should": [ 
{ 
"term": { 
"remark": "java" 
} 
}, 
{ 
"term": { 
"remark": "architect" 
} 
}, { 
"term": { 
"remark": "assistant" 
} 
} 
], 
"minimum_should_match": 2 
} 
} 
} 


**建议,如果不怕麻烦,尽量使用转换后的语法执行搜索,效率更高。 **


**如果开发周期短,工作量大,使用简化的写法。 **


相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
6月前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
7月前
|
算法 关系型数据库 文件存储
ProxylessNAS:直接在目标任务和硬件上进行神经架构搜索——论文解读
ProxylessNAS是一种直接在目标任务和硬件上进行神经架构搜索的方法,有效降低了传统NAS的计算成本。通过路径二值化和两路径采样策略,减少内存占用并提升搜索效率。相比代理任务方法,ProxylessNAS在ImageNet等大规模任务中展现出更优性能,兼顾准确率与延迟,支持针对不同硬件(如GPU、CPU、移动端)定制高效网络架构。
406 126
ProxylessNAS:直接在目标任务和硬件上进行神经架构搜索——论文解读
|
7月前
|
机器学习/深度学习 算法 物联网
μNAS:面向微控制器的约束神经架构搜索——论文解读
μNAS是一种专为微控制器设计的神经架构搜索方法,旨在解决物联网设备中资源受限的挑战。通过多目标优化框架,μNAS能够在有限的内存和计算能力下,自动搜索出高效的神经网络结构。该方法结合了老化进化算法与贝叶斯优化,并引入结构化剪枝技术,实现模型压缩。实验表明,μNAS在多个数据集上均取得了优异的精度与资源使用平衡,显著优于现有方法,为边缘计算设备的智能化提供了可行路径。
552 129
|
11月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
9月前
|
消息中间件 负载均衡 中间件
⚡ 构建真正的高性能即时通讯服务:基于 Netty 集群的架构设计与实现
本文介绍了如何基于 Netty 构建分布式即时通讯集群。随着用户量增长,单体架构面临性能瓶颈,文章对比了三种集群方案:Nginx 负载均衡、注册中心服务发现与基于 ZooKeeper 的消息路由架构。最终选择第三种方案,通过 ZooKeeper 实现服务注册发现与消息路由,并结合 RabbitMQ 支持跨服务器消息广播。文中还详细讲解了 ZooKeeper 搭建、Netty 集群改造、动态端口分配、服务注册、负载均衡及消息广播的实现,构建了一个高可用、可水平扩展的即时通讯系统。
1006 0
|
7月前
|
机器学习/深度学习 人工智能 资源调度
MicroNAS:面向MCU的零样本神经架构搜索——论文阅读
MicroNAS是一种专为微控制器单元(MCU)设计的零样本神经架构搜索(NAS)框架,无需训练即可通过理论驱动的性能指标评估网络架构。相比传统NAS方法,其搜索效率提升高达1104倍,同时兼顾精度与硬件效率,适用于边缘计算场景。该框架结合神经切线核(NTK)条件数、线性区域计数及硬件感知延迟模型,实现快速、高效的架构搜索,为资源受限设备上的AI部署提供了新思路。
436 2
MicroNAS:面向MCU的零样本神经架构搜索——论文阅读
|
7月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
7月前
|
机器学习/深度学习 人工智能 vr&ar
H4H:面向AR/VR应用的NPU-CIM异构系统混合卷积-Transformer架构搜索——论文阅读
H4H是一种面向AR/VR应用的混合卷积-Transformer架构,基于NPU-CIM异构系统,通过神经架构搜索实现高效模型设计。该架构结合卷积神经网络(CNN)的局部特征提取与视觉Transformer(ViT)的全局信息处理能力,提升模型性能与效率。通过两阶段增量训练策略,缓解混合模型训练中的梯度冲突问题,并利用异构计算资源优化推理延迟与能耗。实验表明,H4H在相同准确率下显著降低延迟和功耗,为AR/VR设备上的边缘AI推理提供了高效解决方案。
1318 0
|
6月前
|
存储 Linux iOS开发
Elasticsearch Enterprise 9.1.5 发布 - 分布式搜索和分析引擎
Elasticsearch Enterprise 9.1.5 (macOS, Linux, Windows) - 分布式搜索和分析引擎
494 0