ElasticSearch是一个散布式、基于RESTful气概的数据搜刮和阐发引擎。ElasticSearch的底层全文检索基于Lucene实现,其灵敏的数据存取和阐发体例、优良的性能和不变性使其在大数据存储和阐发范畴被普遍利用。
ElasticSearch的概念和原理
Lucene
ElasticSearch的底层存储基于Lucene实现,Lucene是Apache软件基金的一个开源子项目,是一套全文检索引擎架构,供给了完好的文天职析引擎、数据查询引擎和数据索引引擎。Lucene的目标是为软件开发人员供给一个简单易用的东西包,以便在目的系统中实现全文检索的功用,或者以Lucene为根底成立一套完好的全文检索引擎。
倒排索引-Inverted Index
倒排索引表中的每一项都包罗一个属性值和具有该属性值对应记录的地址。因为不是根据记录来确定属性值的,而是由属性值来确定记录的位置的,因而被称为倒排索引。
带有倒排索引的文件被称为倒排索引文件(Inverted File)。倒排索引的索引对象是文档或者文档集合中的单词,倒排索引文件被用来存储那些单词在一个文档或者一组文档中的位置。
Lucene的架构
Lucene是一个高并发、高吞吐、可扩展的全文检索库。它基于Java实现,利用便利。Lucene内部的数据构造叫做文档(Document),当应用层的数据(例如,FileSystem、Web Data、DataBase等)进入Lucene时,起首会停止索引文档(Index Document)操做,根据索引规则创建倒排索引;在应用法式查询数据的时候,间接查询提早建好的倒排索引,因而其效率非常高。
Lucene的全文检索流程
创建索引:获取文档、构建文档对象、文档分词和创建索引;
查询索引:挪用查询接口、创建查询、施行查询和成果返回。
创建索引流程:
(1)获取文档:获取文档的过程即数据收罗的过程。Lucene中的文档指要索引和搜刮的原始内容。文档内容能够是互联网上的网页、数据库中的数据、磁盘上的日记文件等。
(2)构建文档对象:当获取文档内容后,需要按照文档内容构建文档(Document)对象,每个文档对象都包罗一个独一的文档id和多个Field,每个Field中都存储着差别的文档内容。例如,将磁盘上一个包罗一篇文章的TXT文件当成一个Document,则Document中包罗多个Field。每个Field都包罗差别的内容,好比file_name(文件名称)、file_path(文件途径)、file_size(文件大小)、file_content(文件内容)。
(3)阐发文档:阐发文档的过程是将原始内容创建为包罗Field的文档(Document)并对Field的内容停止阐发的过程。阐发文档的过程需要对原始文档施行提取单词、大小写转换、去除标点符号、去除停用词等操做,然后生成最末的语汇单位。语汇单位中的每个单词都被叫做一个Term,差别的Field拆分出来的不异单词是差别的Term。Term中包罗两部门:一部门是文档的Field名称,另一部门是单词的内容。
4)创建索引:创建索引指对所有文档阐发得出的Term都停止索引并记录该Term在每个Document中呈现的次数的过程。
查询索引流程:
查询索引即按照用户输入的关键字,从索引(Index)中停止搜刮的过程。查询索引的详细过程为:按照关键字搜刮索引,按照索引找到对应的文档,从而找到要搜刮的内容。
(1)用户查询接口:全文检索系统供给的用户搜刮界面,实现用户搜刮关键字或关键词的提交,以及搜刮完成后搜刮成果的展现。
(2)创建查询对象:用户在输入关键字施行搜刮之前,需要先构建一个查询对象。查询对象中能够指定要搜刮的文档Field、关键字等。
(3)施行查询:按照查询语法在倒排索引词典表平分别找出对应搜刮词的索引,从而找到索引对应的文档链表。搜刮过程为在索引中查找Field为fileName且关键字为Lucene的Term,然后按照Term找到对应的文档id列表。
(4)返回查询成果:将查询的文档id列表返回到用户查询接口。
ElasticSearch的特点
(1)高容量:ElasticSearch集群撑持PB级数据的存储和查询。
(2)高吞吐:ElasticSearch撑持对海量数据近实时的数据处置。
(3)高可用:ElasticSearch基于副本机造撑持部门办事宕机后仍可一般运行和利用。
(4)撑持多维度数据阐发和处置:除了撑持全文检索,ElasticSearch还撑持基于单字段切确查询和多字段结合查询等复杂的数据查询操做。
(5)API简单易用:ElasticSearch API简单易用,除了撑持REST API,还撑持Java、Python等多种客户端形式,且查询体例简单灵敏。
(6)撑持插件机造:ElasticSearch撑持插件式开发,基于ElasticSearch能够开发本身的分词插件、同步插件、Hadoop插件、可视化插件等。
ElasticSearch的应用场景
(1)全文检索
(2)散布式数据库
(3)日记阐发:通过Logstash等日记收罗组件,ElasticSearch可实现复杂的日记数据存储阐发和查询,最常用的组合是ELK(ElasticSearch+Logstash+Kibana)手艺组合。
(4)运维监控:运维平台能够基于ElasticSearch实现大规模办事的监控和办理。(5)BI系统:ElasticSearch普遍应用于BI(Business Intelligence,贸易智能)系统,例如根据区域统计用户的操做习惯等。
ElasticSearch的数据模子
ElasticSearch的数据模子由Index(索引)、TyPE(类型)和Document(文档)构成。索引是一组具有配合特征的文档集合。每个索引都包罗多个类型,每个类型都包罗多个文档,每个文档都包罗多个Field。
ElasticSearch散布式架构
ElasticSearch基于散布式的架构可以支持PB级数据的搜刮和阐发。ElasticSearch散布式架构的核心内容包罗集群节点角色、集群选举原理、集群形态、数据路由规则、数据分片和副本战略等。
集群节点角色
ElasticSearch集群节点角色包罗:
MasterNode(主节点):次要负责集群节点形态的维护、索引的创建删除、数据的Rebalance、分片的分配等工做。MasterNode不负责详细数据的索引和检索,因而其负载较低,办事比力不变。当MasterNode宕机时,ElasticSearch集群会主动从其他MasterNode中选举出一个Leader继续为集群供给办事。为了避免在选举过程中呈现脑裂现象,常常需要设置discovery.zen.minimum_master_nodes=N/2+1,此中N为集群中MasterNode的个数。建议集群中MasterNode的个数为奇数,如3个或者5个。一个节点只包罗MasterNode角色的设置装备摆设如下。
在一般消费情况中,为了保障MasterNode的不变运行,不建议在MasterNode上设置装备摆设数据节点。
DataNode(数据节点):DataNode是集群的数据节点,次要负责集群中数据的索引创建和检索,详细操做包罗数据的索引、搜刮、聚合等。DataNode属于I/O、内存和CPU密集型操做,需要的计算资本较大,若是资本允许,则建议利用SSD以加快数据读写的效率。
设置一个节点为DataNode的设置装备摆设如下。
IngestNode(提取节点):IngestNode是施行数据预处置的管道,它在索引之前预处置文档。通过拦截文档的Bulk和Index恳求,然后加以转换,最末将文档传回Bulk和Index API,用户能够定义一个管道,指定一系列预处置器。若是集群有复杂的数据预处置逻辑,则该节点属于高负载节点,建议利用公用办事器。
CoordinatingNode(协调理点):CoordinatingNode用于领受客户端恳求,并将恳求转发到各个DataNode上。各个DataNode在收到恳求后,在当地施行恳求操做,并将恳求成果反应给CoordinatingNode,CoordinatingNode在收到所有DataNode的反应后,停止成果合并,然后将成果返回客户端。
TribeNode(部落节点):允许TribeNode在多个集群之间充任结合客户端,用于实现跨集群拜候。在5.4.0版本以后,TribeNode已经被烧毁,其实不建议利用,其替代计划为cross-cluster Search。
数据路由规则
ElasticSearch的数据路由(Routing)规则用于确定文档存储在哪个索引(Index)的哪个分片(Shard)上。按照路由规则,ElasticSearch将差别文档索引到差别索引的差别分片上。在查询文档的时候,ElasticSearch按照路由规则找到该索引及其对应的分片并查询该文档。
上述公式简述为文档所在分片等于routing的Hash值除以主分片数量(number_of_PRimary_shards)的余数。那也是为什么ElasticSearch索引的主分片数量在确定后就不克不及再修改的原因,因为若是主分片数量发作变革,则之前路由的所有分片城市失效。在利用时,所有API(get、index、delete、bulk、update以及mget)都领受一个叫做routing的路由参数,通过那个参数应用法式能够自定义文档到分片的映射。一个自定义的路由参数能够用来确保所有相关的文档(例如所有属于统一个用户的文档)都被存储到统一个分片中。
文档分片和副本战略
ElasticSearch文档分片的原则如下。
(1)ElasticSearch中的每个索引都由一个或多个分片构成,文档按照路由规则分配到差别分片上。
(2)每个分片都对应一个Lucene实例,一个分片只能存放Integer.MAX_VALUE-128=2147483519个文档。
(3)分片次要用于数据的横向散布,ElasticSearch中的分片会被尽可能均匀地分配到差别节点上,当有新的节点参加时,ElasticSearch会主动感知并对数据停止relocation操做(例如,有2个节点,4个主分片,那么每个节点都将会分到2个分片,当再增加2个节点后,ElasticSearch会主动施行relocation操做,那时每个节点都将会分到1个分片),relocation保障了集群内数据的平衡散布。
ElasticSearch文档副本的战略如下。
(1)ElasticSearch的副本即主分片(Primary Shard)对应数据的副天职片(Replica Shard)。
(2)为了避免单节点办事器毛病,ElasticSearch会将主分片和副天职片分配在差别节点上。ElasticSearch的默认设置装备摆设是一个索引包罗5个分片,每个分片都有1个副本(即5 Primary+5 Replica=10个分片)。
ElasticSearch的写操做流程
ElasticSearch的写操做
ElasticSearch的写操做次要包罗索引的创建和删除,以及文档的创建、删除、更新等操做。ElasticSearch起首会在主分片上施行写操做,当主分片上施行胜利时,按照集群的数据一致性要求,将在其他副天职片上施行写操做,只要到达一致性要求的节点都施行胜利后才向客户端发送胜利响应。
(1)客户端向Node-1发送新建、查询或者删除文档的恳求。节点按照文档的_id为1确定文档属于分片1。
(2)因为分片1的主分片P-1被分配在Node-3上,所以恳求会被转发到Node-3。
(3)在Node-3的主分片上施行恳求,若是施行胜利,则将恳求同时转发到Node-1和Node-2的副天职片R-1上施行。
(4)当所有副天职片都陈述施行胜利时,Node-3才向协调理点陈述施行胜利。
(5)协调理点向客户端陈述胜利。当客户端收到胜利响应时,文档更新已经在主分片和所有副天职片上都施行胜利。
ElasticSearch的读操做流程
ElasticSearch在处置读取恳求时,协调理点在每次收到客户端恳求的时候城市通过轮询所有副天职片来到达负载平衡。当检索时,被索引的文档可能已经在主分片上,但是还没有同步到副天职片。在那种情况下,副天职片可能会陈述文档不存在,但是主分片可能会胜利返回文档。一旦索引恳求胜利返回用户,文档在主分片和副天职片上都是可用的。
(1)客户端向Node-1发送文档读取恳求。
(2)协调理点Node-1按照文档的_id来确定文档属于分片1。分片1的文档数据存在所有3个节点上。在那种情况下,它将恳求转发到Node-2。
(3)Node-2在当地施行查询操做并将查询成果返回到Node-1。
(4)Node-1(此时Node-1为CoordinatingNode角色)领受Node-2的查询成果,若是查询到恳求对应的文档,则将该文档返回客户端。若是在Node-2上未查询到对应的文档数据,则Node-1会继续向其他节点发送文档读取恳求,曲到查询到文档对应的数据后才返回。若是要读取的文档在所有节点上都不存在,则向客户端陈述文档不存在。
ElasticSearch的应用
ElasticSearch普遍应用于大数据存储、日记阐发、运维监控等多种场景,撑持单机摆设和集群摆设两种体例。在API利用层面,ElasticSearch撑持Java API和REST API两种体例。下面将对集群摆设和API利用停止介绍。
ElasticSearch的安拆
(1)安拆Java情况,ElasticSearch建议JDK版本大于1.8。
(2)各办事器之间互信设置装备摆设。
(3)到官网下载安拆包,ElasticSearch官网的下载。
(4)施行以下号令修改集群设置装备摆设文件elasticsearch.yml。
需要修改的核心设置装备摆设如下
(5)施行以下号令启动ElasticSearch。
(6)在号令行输入curl http://localhost:9200查看ElasticSearch集群的形态,返回成果如下。
通过上述接口的查询成果能够看到,ElasticSearch集群名称为elasticsearch,集群id为383fPBn4R12SR_4msaqaeQ,集群版本为7.4.2,对应的Lucene版本为8.2.0。
ElasticSearch的设置装备摆设和性能调优
JVM性能调优
ElasticSearch基于Java实现,默认利用的堆内存为1GB,关于消费情况需要按照系统资本对堆内存停止合理的设置以到达优良的性能表示。施行以下号令对JVM堆内存停止设置。
若是操做系统有32GB内存,则建议将JVM堆内存的最小值和更大值都设置为16GB。
那里将堆内存最小值(Xms)与更大值(Xmx)设置不异,避免在ElasticSearch运行过程中JVM改动堆内存大小,引起JVM内存震荡。
需要留意的是,ElasticSearch除了利用JVM堆内存,其内部Lucene还需要利用大量非堆内存。ElasticSearch内部利用Lucene实现全文检索。Lucene的段别离存储在单个文件中,因为段是不成变的,对缓存友好的,所以在利用段数据时操做系统会把那些段文件缓存起来,以便更快地拜候。同时,Lucene能够操纵操做系统底层机造来缓存内存数据,加速查询效率。
Lucene的性能取决于与操做系统交互的速度,而那些交互都需要大量的内存资本(非JVM堆内存),若是把全数内存都分配给JVM堆内存,则将招致Lucene在运行过程中因资本不敷而性能下降。一般建议将系统的一半内存分配给JVM堆内存,别的一半内存预留给Lucene和操做系统。好比有32GB内存,能够把16GB分配给JVM堆内存,剩余的16GB预留给Lucene和操做系统。
操做系统的性能调优
(1)设置文件句柄:Linux中的每个历程默认翻开的更大文件句柄数都是1024,关于办事器历程来说该值太小,能够通过修改/etc/security/limits.conf来增大翻开的更大文件句柄数,一般建议设置为65535。
(2)设置虚拟内存:max_map_count定义了历程能拥有的最多内存区域,一般建议设置为102400。
(3)封闭Swap:Swap空间是一块磁盘空间,操做系统利用那块空间保留从内存中交互换出的操做系统不常用的Page数据,如许能够分配出更多的内存做Page Cache。通过Swap能够提拔系统的吞吐量和I/O性能,但ElasticSearch需要一个所有内存操做都可以被快速施行的情况,办事一旦利用到了Swap内存,就会大大降低数据的存取效率,严峻影响性能。
(4)开启mlockall:翻开设置装备摆设文件中的mlockall开关。它的感化是允许JVM锁住内存,制止操做系统将内存交换进来。elasticsearch.yml文件中的设置如下
ElasticSearch API的利用
ElasticSearch撑持Java API和REST API两种体例,下面以Java API为根底介绍ElasticSearch API的根本用法。
基于Spring Boot成立ElasticSearch项目标步调如下。
(1)添加pom.xml依赖:新建Spring Boot项目,并在pom.xml中添加如下ElasticSearch依赖。
(2)application.yml设置装备摆设:在项目中添加application.yml设置装备摆设文件,并在文件中设置装备摆设ElasticSearch的办事地址和端口
(3)创建索引:定义BaseElasticService类,并在类中定义创建索引的办法createIndex。详细代码如下
上述代码中依赖的是RestHighLevelClient实例,Spring Boot会按照设置装备摆设文件停止主动拆配,应用法式只要在需要的时候依赖注入即可。上述代码定义了索引的创建办法createIndex,详细步调为:定义CreateIndexRequest对象,设置索引的分片数量和副本数量,挪用restHighLevelClient.indices().create()创建索引。
(4)查询索引:在BaseElasticService类中根据如下代码定义查询索引的办法getIndex。
(5)删除索引:在BaseElasticService类中根据如下代码定义删除索引的办法deleteIndex。
(6)利用索引API:创建测试类ElasticsearchTest,并在类中添加测试用例IndexAPITest,测试上述(3)~(5)的代码定义的createIndex、getIndex和deleteIndex办法。
上述代码在测试类ElasticsearchTest中依赖注入BaseElasticService,并挪用createIndex、getIndex和deleteIndex办法实现索引的创建、查询和删除。
(7)新增文档:在BaseElasticService中添加如下新增文档的办法。
上述代码定义了向ElasticSearch中添加文档的办法add,详细步调为:定义IndexRequest对象,设置文档id,设置文档数据,施行创建索引操做,返回创建成果。
(8)批量新增文档:在BaseElasticService中添加批量新增文档的办法。
上述代码定义了批量新增文档办法batchAdd,详细步调为:定义BulkRequest对象;遍历List,将文档id和文档内容封拆到BulkRequest;批量提交插入操做;返回插入成果。
(9)查询文档:在BaseElasticService中添加如下查询文档的办法。
上述代码定义了文档查询办法search,详细步调为:定义SearchRequest对象,设置SearchSourceBuilder,施行查询,获取查询成果,将查询成果的数据存入List,返回查询成果。
(10)删除文档:在BaseElasticService中添加如下删除文档的办法。
上述代码定义了deleteBatch办法用于按照文档id批量删除文档,详细步调为:定义BulkRequest对象;遍历List,将Index和待删除文档id封拆到BulkRequest;施行批量删除操做。
(11)施行文档的新增操做测试:在DocumentAPITest中添加文档的新增测试用例,并根据如下代码测试文档的新增操做。
上述代码定义了添加文档测试用例AddAPITest,添加文档分为单个文档添加和批量文档添加。需要留意的是,上述代码将Map的数据构造转换为JSON字符串后做为文档内容添加到ElasticSearch。
(12)施行文档的查询操做测试:在DocumentAPITest中添加文档的查询测试用例,并根据如下代码测试文档的查询操做。
(13)施行文档的删除操做测试:当文档不再被需要时,应用法式能够施行如下代码按照文档id删除文档。
发表评论