ElasticSearch定义
Elaticsearch,简称为ES, 是一款大数据场景下的分布式全文搜索引擎,是建立在全文搜索引擎 Apache Lucene基础上的搜索引擎。
Elaticsearch是ELK生态中的的一个产品,ELK代表的是:E就是ElasticSearch,L就是Logstach,K就是kibana。
ElasticSearch特点
ElasticSearch的特点有:
- 搜索结果速度非常快;
- 支持分布式;
- 支持多语种:
- 索引自动分片;
- 索引副本机制;
- restful风格接口等。
ElasticSearch应用场景
ElasticSearch应用场景主要包含如下:
1.搜索引擎
ElasticSearch为搜索而生,用于搭建全文搜索系统是自然而然的事情,它能够提供快速的索引和搜索功能。
在这类场景中较典型的应用领域是,
- 电商搜索;
- 地图搜索;
- 新闻搜索;
- 等各类站内搜索。
举个简单的例子,比如:要买手机,你登陆淘宝后,在搜索框搜索”手机“,会出现N个手机和手机周边的搜索数据。
再比如:类似百度,在网站的站内搜索,IT系统的检索等等,都是典型的搜索应用场景。
2.日志分析
ElasticSearch官方提供的ELK,也就是Elasticsearch+Logstash+Kibana全家桶简称,可以完成日志采集再到可视化的数据分析工作。
日志分析整体架构,如下图所示:
Logstash主要用于:采集日志,作为日志的搜集、分析、过滤日志等的工具,支持大量的数据获取方式。
日志主要包括:系统日志、应用程序日志、以及安全日志等。
日志的作用:系统运维和开发人员可以通过日志了解服务器软硬件信息,经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
日志采集之后,我们可以使用ElasticSearch来作为数据存储,以及搜索使用,暴露出具体的API等接口(基于RESTful web接口),然后使用Kibana来展示界面。
这里的Kibana的主要作用:Kibana为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
3.海量数据查询
目前大量的系统用MySQL作为数据库,但随着业务的开展数据量会越来越大,而MySQL的性能会越来越差。
虽然可以通过分库分表的方案进行解决,但是操作比较复杂,而且往往每隔一段时间就需要进行扩展,这种情况下可以将数据从MySQL同步到Elasticsearch。
改进后,整体架构如下图所示:
针对实时性要求不太高,或者主要查询历史数据且数据量比较大的场景:使用ElasticSearch提供查询。
而对需要事务实时控制的即时数据还是通过MySQL存储和查询。
ElasticSearch系统架构
ElasticSearch整体架构,如下图所示:
- 一个 ElasticSearch Index 在集群模式下,有多个 Node (节点)组成;
- 每个节点就是 ES 的Instance (实例),每个节点上会有多个 shard (分片),每个分片又分为:主分片与副本分片;
- 每个分片上对应着就是一个 Lucene Index底层索引文件;
- Lucene Index 是一个统称由多个 Segment 段文件,就是倒排索引组成,每个段文件存储着就是 Doc 文档;
ElasticSearch基本原理
谈到ElasticSearch原理,就会涉及到6大核心设计:
1.index 索引
索引是具有相似特征的文档的集合,类似于关系数据库中mysql的索引 ,包括:配置信息mapping和倒排索引数据文件。
一个索引的数据文件可能会分布于一台机器,也有可能分布于多台机器。
2.Mapping映射
Mapping:相当于数据库中的 schema,用来约束字段的类型,不过 Elasticsearch 的 mapping 可以自动根据数据创建。
3.type 类型
type:表示一类相似的文档,作为一个元数据来实现逻辑划分,类比传统的关系型数据库领域来说,类型相当于“表”。
4.document 文档
document:是在ElasticSearch中可以被索引的基本单位,以JSON表示,类似于关系数据库中的一行。
5.Field 字段
Field是Elasticsearch的最小单位,一个document里面有多个field,这个与MySQL表中的字段类似的作用。
6.shard 分片
单台机器无法存储大量数据,为了支持更大量的数据,ElasticSearch可以将一个索引中的数据切分为多个shard分片。
ElasticSearch的分片(shard)机制:将一个索引内部的数据分布地存储于多个节点。
将一个索引切分为多个底层物理的 Lucene 索引,完成索引数据的分割存储功能,这每一个物理的 Lucene 索引称为一个分片(shard)。
分片有两种:
- 主分片(Primary Shard);
- 副本分片(Replica Shard);
有了shard分片就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,从而提升吞吐量和性能。
7.replica副本
任何一个服务器随时可能故障或宕机,此时 shard 分片可能会丢失,因此可以为每个shard 需要创建多个 replica 副本。
副本就是对分片的 Copy,每个主分片都有一个或多个副本分片,当主分片异常时,副本可以提供数据的查询等操作,保证数据不丢失。
ElasticSearch下载
下载地址:https://www.elastic.co/downloads/past-releases#elasticsearch
选择上面的操作系统,下载自己需要的版本即可。
ElasticSearch安装
ElasticSearch下载后,解压后。
ElasticSearch目录结构如下:
- bin :脚本文件,包括 ES 启动 、安装插件等等;
- config : elasticsearch.yml(ES 配置文件)、jvm.options(JVM 配置文件)、日志配置文件等等;
- JDK : 内置的 JDK,JAVA_VERSION=“12.0.1”;
- lib : 类库;
- logs : 日志文件;
- modules : ElasticSearch所有模块等;
- plugins : ElasticSearch已经安装的插件,默认没有插件 ,也是放ik分词器目录;
- data : ElasticSearch启动的时候,会有该目录,用来存储文档数据。该目录可以设置;
ElasticSearch启动
1.进入bin目录启动
双击执行elasticsearch.bat,如下图所示:
显示start字样,说明启动成功了:
2.检测ElasticSearch启动成功
看到started说明启动成功,打开浏览器测试,输入地址:
http://localhost:9200:
出现以上内容,说明ElasticSearch启动成功了。
ElasticSearch使用示例
方式一:基于 最常用DSL 检索
Elasticsearch提供基于JSON的完整查询DSL来定义查询,比如:
GET /shirts/_search { "query": { "bool": { "filter": [ { "term": { "color": "red" }}, { "term": { "brand": "gucci" }} ] } } }
方式二:基于 URL 检索
GET /my_index/_search?q=user:seina
方式三:类SQL 检索
POST /_sql?format=txt { "query": "SELECT * FROM uint-2020-08-17 ORDER BY itemid DESC LIMIT 5" }
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》