暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ElasticSearch简介

IT那活儿 2023-02-27
408
点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!



Elasticsearch介绍



ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。

设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便

我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的。

我们希望搜索解决方案要运行速度快;
我们希望能有一个零配置和一个完全免费的搜索模式;
我们希望能够简单地使用JSON通过HTTP来索引数据;
我们希望我们的搜索服务器始终可用;
我们希望能够从一台开始并扩展到数百台,我们要实时搜索,我们要简单的多租户;
我们希望建立一个云的解决方案;
因此我们利用Elasticsearch来解决所有这些问题及可能出现的更多其它问题



ES架构原理



1. 整体架构

--Transport Client/Node Client/REST API:三种访问es集群的方式;

--Transport(Netty):通信模块,数据传输,底层采用netty框架;

--Index、Search…:支持搜索,索引等常用操作;

--Discovery:节点发现,集群之间通信的基石;

--Plugins:很多服务以插件形式提供,官方和社区支持的ik、head、river、discovery gce…;

--Script:提供脚本支持,内置painless,groovy等,默认painless性能还可以;

--Store/Snapshot:文件存储与访问,快照创建和恢复;

--translog、cluster state、segments:es主要文件类型,其中translog、cluster state是es添加的数据,多个segments段组成一个完整的lucene索引;

--Monitor:监控模块,监控jvm,文件系统,操作系统等运行情况;

--File System:es支持可以在多种文件系统上运行,本地、共享型、HDFS、亚马逊云平台等。

2. 基本概念

elasticsearch中必须掌握的几个基本概念:

--集群(Cluster)一组拥有共同的 cluster name 的节点。

--节点(Node) 集群中的一个 Elasticearch 实例。

--索引(Index) 相当于关系数据库中的database概念,一个集群中可以包含多个索引。这个是个逻辑概念。

--主分片(Primary shard) 索引的子集,索引可以切分成多个分片,分布到不同的集群节点上。分片对应的是 Lucene 中的索引。

--副本分片(Replica shard)每个主分片可以有一个或者多个副本。

--类型(Type)相当于数据库中的table概念,mapping是针对 Type 的。同一个索引里可以包含多个 Type。

--Mapping 相当于数据库中的schema,用来约束字段的类型,不过 Elasticsearch 的 mapping 可以自动根据数据创建。

--文档(Document) 相当于数据库中的row。

--字段(Field)相当于数据库中的column。

--分配(Allocation) 将分片分配给某个节点的过程,包括分配主分片或者副本。如果是副本,还包含从主分片复制数据的过程。

3. 详细过程

3.1 启动过程

这里只做简单介绍具体源码实现参考:https://www.cnblogs.com/Neeo/articles/10945722.html
1)获取集群node列表
在UnicastZenPing构造函数中,向discovery.zen.ping.unicast.hosts配置的节点列表发送请求,获取到DiscoveryNode列表。
2)选主流程
通过UnicastZenPing发送ping,从response信息中找到master,如果没有master,进入选主流程。
具体选主流程可参考:https://blog.csdn.net/wenjianfeng/article/details/93000269
3)启动任务
选为master节点后,会启动计划任务。

3.2 ElasticSearch读写原理

写操作原理:


1)Coordinating Node

协调节点默认使用文档ID参与计算(也支持通过routing),以便为路由提供合适的分片。
shard = hash(document_id) % (num_of_primary_shards)
2)Shard
当分片所在的节点接收到来自协调节点的请求后,会将请求写入到Memory Buffer,然后定时(默认是每隔1秒)写入到Filesystem Cache,这个从Momery Buffer到Filesystem Cache的过程就叫做refresh。
3)Memory Buffer | Filesystem Cache
当然在某些情况下,存在Momery Buffer和Filesystem Cache的数据可能会丢失,ES是通过translog的机制来保证数据的可靠性的。其实现机制是接收到请求后,同时也会写入到translog中,当Filesystem cache中的数据写入到磁盘中时,才会清除掉,这个过程叫做flush。
4)Transaction Log
在flush过程中,内存中的缓冲将被清除,内容被写入一个新段,段的fsync将创建一个新的提交点,并将内容刷新到磁盘,旧的translog将被删除并开始一个新的translog。
flush触发的时机是定时触发(默认30分钟)或者translog变得太大(默认为512M)时。

读操作原理:

搜索被执行成一个两阶段过程,我们称之为 Query Then Fetch
1)Coordinating Node
在初始查询阶段时,查询会广播到索引中每一个分片拷贝(主分片或者副本分片)。
每个分片在本地执行搜索并构建一个匹配文档的大小为 from + size 的优先队列。
PS:在搜索的时候是会查询Filesystem Cache的,但是有部分数据还在Memory Buffer,所以搜索是近实时的。
2)Shard
每个分片返回各自优先队列中 所有文档的 ID 和排序值 给协调节点,它合并这些值到自己的优先队列中来产生一个全局排序后的结果列表。
3)Coordinating Node
接下来就是 取回阶段,协调节点辨别出哪些文档需要被取回并向相关的分片提交多个 GET 请求。每个分片加载并 丰富 文档,如果有需要的话,接着返回文档给协调节点。一旦所有的文档都被取回了,协调节点返回结果给客户端。


END


本文作者:潘宗昊(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论