Elasticsearch介绍

1. Elasticsearch概述

1.1 简介

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。

1.2 Lucene简介

简单点来说就是一个jar包,里面封装了全文检索的引擎、搜索的算法代码。开发时,引入lucen的jar包,通过api开发搜索相关业务,底层会在磁盘建立索引库。

1.3 Elasticsearch架构分层

在这里插入图片描述

2.Elasticsearch特点

2.1 全文检索

全文检索是指全文数据中检索单个文档或文档集合的搜索技术,而 Elasticserach 从这个方面来说也可以理解为是一个全文数据库。数据存储时,经行分词建立term索引库。

2.1 倒排索引

倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。
问题简述倒排索引和正排索引的区别?
正排索引:从文档指向关键词,如 在文档中会记录某关键词的位置和次数;
倒排索引:从关键词指向文档,如 某关键词 记录它出现在某些文档中;

3.Elasticsearch功能

  • 分布式的搜索引擎和数据分析引擎
    搜索:互联网搜索、电商网站站内搜索、 OA系统查询;
    数据分析:电商网站查询近一周哪些品类的图书销售前十;
    新闻网站,最近3天阅读量最高的十个关键词,舆情分析。
  • 全文检索,结构化检索,数据分析
    全文检索:搜索商品名称包含java的图书select * from books where book_name like “%java%”。
    结构化检索:搜索商品分类为spring的图书都有哪些, select * from books where category_id=‘spring’
    数据分析:分析每一个分类下有多少种图书, select category_id,count(*) from books group by category_id对海量数据进行近实时的处理
  • 分布式:
    ES自动可以将海量数据分散到多台服务器上去存储和检索,经行并行查询,提高搜索效率。相对的, Lucene是单机应用。
  • 近实时:
    数据库上亿条数据查询,搜索一次耗时几个小时,是批处理(batch-processing)。而es只需秒级即可查询海量数据,所以叫近实时,秒级。

4.Elasticsearch架构

  • 可拓展性:大型分布式集群(数百台服务器)技术,处理PB级数据,大公司可以使用。小公司数据量小,也可以部署在单机。大数据领域使用广泛。
  • 技术整合:将全文检索、数据分析、分布式相关技术整合在一起: lucene(全文检索),商用的数据分析软件(BI软件),分布式数据库(mycat)
  • 部署简单:开箱即用,很多默认配置不需关心,解压完成直接运行即可。拓展时,只需多部署几个实例即可,负载均衡、分片迁移集群内部自己实施。
  • 接口简单:使用restful api经行交互,跨语言。
  • 功能强大: Elasticsearch作为传统数据库的一个补充,提供了数据库所不不能提供的很多功能,如全文检索,同义词处理,相关度排名。

5.Elasticsearch概念

1. Cluster:集群

包含一个或多个启动着es实例的机器群。
通常一台机器起一个es实例。
同一网络下,集名一样的多个es实例自动组成
集群,自动均衡分片等行为。默认集群名为“elasticsearch”。

2. Node:节点

每个es实例称为一个节点。节点名自动分配,也可以手动配置。

3. Index:索引

包含一堆有相似结构的文档数据。
索引创建规则:
仅限小写字母
不能包含\、 /、 *、 ?、 "、 <、 >、 | 、 #以及空格符等特殊符号
从7.0版本开始不再包含冒号
不能以-、 _或+开头
不能超过255个字节(注意它是字节,因此多字节字符将计入255个限制)

4. Document:文档

es中的最小数据单元。一个document就像数据库中的一条记录。通常以json格式显示。多个document存储于一个索引(Index)中。

5. Field:字段

就像数据库中的列(Columns),定义每个document应该有的字段。

6. Type:类型

每个索引里都可以有一个或多个type, type是index中的一个逻辑数据分类,一个type下的document,都有相同的field。
注意: 6.0之前的版本有type(类型)概念, type相当于关系数据库的表, ES官方将在ES9.0版本中彻底删除type。这里type都为_doc。

7. shard:分片

index数据过大时,将index里面的数据,分为多个shard,分布式的存储在各个服务器上面。可以支持海量数据和高并发,提升性能和吞吐量,充分利用多台机器的cpu。

8. replica:副本

在分布式环境下,任何一台机器都会随时宕机,如果宕机, index的一个分片没有,导致此index不能搜索。所以,为了保证数据的安全,我们会将每个index的分片经行备份,存储在另外的机器上。保证少数机器宕机es集群仍可以搜索。
能正常提供查询和插入的分片我们叫做主分片(primary shard),其余的我们就管他们叫做备份的分片(replica shard)。
es6默认新建索引时, 5分片, 2副本,也就是一主一备,共10个分片。所以, es集群最小规模为两台。

6.Elasticsearch集群

6.1 集群架构图

在这里插入图片描述


Master(主节点):维护集群元数据,管理集群节点状态,不负责数据查询和写入,内存资源占用较小;
Data(数据节点) :负责数据查询和写入,压力大,内存资源占用大;
client(客户端节点):负责任务分发和结果汇总,分担数据节点压力,内存资源占用大

6.2 数据写入

在这里插入图片描述


写入过程:
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。

6.2 数据查询

在这里插入图片描述


查询过程:

  1. client选择一个数据节点发送查询请求,则该节点就是协调节点;
  2. 协调节点会进行广播请求给到所有数据节点;
  3. 每个分片返回对应的文档id、节点、分片信息,然后由协调节点进行汇总,并做全局排序;
  4. 协调节点向包含该文档的shard发送请求,然后将结果返回给客户端。

7.准实时索引实现

7.1 溢写到文件系统缓存

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

7.2 写translog保障容错

在写入到内存中的同时,也会记录translog日志,在refresh期间出现异常,会根据translog来进行数据恢复等到文件系统缓存中的segment数据都刷到磁盘中,清空translog文件。

7.3 flush到磁盘

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

7.4 segment合并

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值