一、引入
首先,ES它不是一款单一的软件,它是ELK中其中的一部分,分别有Elasticsearch(搜索引擎)、Logstash(日志的搜集,分析,过滤)、Kibana(提供Web页面)。
像淘宝、京东这样的购物商城,用户访问商城的首页,一般都会直接搜索来寻找自己想要购买的商品。而商品的数量非常多,而且分类繁杂。如果能正确显示出用户想要的商品,并进行合理的过滤,尽快促成交易,是搜索系统要研究的核心。面对这样复杂的搜索业务和数据量,使用传统数据库搜索就显得力不从心,一般我们都会使用全文检索技术,比如Elasticsearch。那我今天主要来聊一聊ES搜索引擎。
二、概念
Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎基础上的搜索引擎。它不仅包括了全文搜索功能,还可以进行以下工作:
(1)分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
(2)实时分析的分布式搜索引擎。
可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。
三、Elasticsearch架构图与介绍
1、Gateway代表ElasticSearch索引的持久化存储方式。在Gateway中,ElasticSearch默认先把索引存储在内存中,然后当内存满的时候,再持久化到Gateway里。当ES集群关闭或重启的时候,它就会从Gateway里去读取索引数据。比如LocalFileSystem和HDFS、AS3等。
2、DistributedLucene Directory,它是Lucene里的一些列索引文件组成的目录。它负责管理这些索引文件。包括数据的读取、写入,以及索引的添加和合并等。
3、River,代表是数据源。是以插件的形式存在于ElasticSearch中。
4、Mapping,映射的意思,非常类似于静态语言中的数据类型。比如我们声明一个int类型的变量,那以后这个变量只能存储int类型的数据。比如我们声明一个double类型的mapping字段,则只能存储double类型的数据。Mapping不仅是告诉ElasticSearch,哪个字段是哪种类型。还能告诉ElasticSearch如何来索引数据,以及数据是否被索引到等。
5、Index Moudle,Elasticsearch里的索引概念是名词而不是动词,在elasticsearch里它支持多个索引。优点类似于关系数据库里面每一个服务器可以支持多个数据库是一个道理,在每一索引下面又可以支持多种类型,这又类似于关系数据库里面的一个数据库可以有多张表一样。但是本质上和关系数据库还是有很大的区别,我们这里暂时可以这么理解
6、Search Module,搜索查询模块。
Disvcovery,主要是负责集群的master节点发现。比如某个节点突然离开或进来的情况,进行一个分片重新分片等。这里有个发现机制。发现机制默认的实现方式是单播和多播的形式,即Zen,同时也支持点对点的实现。另外一种是以插件的形式,即EC2。
7、Scripting,即脚本语言。包括很多,这里不多赘述。如mvel、js、python等。
8、Transport,代表ElasticSearch内部节点,代表跟集群的客户端交互。包括Thrift、Memcached、Http等协议
9、RESTful Style API,通过RESTful方式来实现API编程。
3rd plugins,代表第三方插件。
10、Java(Netty),是开发框架。
11、JMX,是监控。
四、 Elasticsearch核心概念
1、索引
IndexES中的索引类似关系型数据库中的数据库,里面存放用户文档数据。因为ES是封装的Lucene,所以底层还是有Lucene的一个或者多个索引组成,数据的增删改查也是有底层的Lucene完成,ES中的分片或副本实际上就是一个Lucene索引。
2、文档
Document文档是ES中存储数据的主体,ES中所有的操作都是建立在文档的基础上的,每个文档都是由各种Field组成,每个Field有一个名称和一个或多个值构成。文档展示给用户就是一个JSON对象。
3、类型
TypeES中Type是一种逻辑上的概念,类似关系型数据库中的表,每个文档都属于某一种类型,如果没有定义,会有默认值,这里的类型相当于数据库当中的表,ES的每个索引可以包含多种类型。
4、映射
Mapping映射类似关系型数据库中的schema,用于定义field的属性,如字段类型,是否分词等。这里有一点和关系型数据库不同的是ES会在用户没有定义字段属性的情况下,自动嗅探该字段的类型进行自动识别。
5、集群
Cluster多个ES节点工作在一起组成一个集群。ES对于集群的支持几乎是无缝的,这也是ES重要的竞争优点之一。
6、节点
Node一个ES实例就是一个节点,说的再简单点,一台部署了ES服务的机器就是一个节点,同时,一台机器如果硬件资源允许也可以同时启动多个ES实例。ES中每个节点都和集群(如果是多个节点的集群)中的其他节点相互通信,了解所有文档的存储位置并能转发用户的请求到对应的数据节点上。
7、分片
Shard因为ES是分布式架构,类似于HDFS的存储方式,所以数据被打散存储在集群的多个节点上,一个分片实际上就是底层Lucene的一个索引,这里说的分片指的是ES中的主分片(因为还有副本分片一说),分片的方式是ES自动完成,用户可以指定分片的数量,主分片一旦指定就不能修改,因为ES打散数据的方式是和索引创建时指定的主分片数量有关(参考公式:shard = hash(routting) % number_of_primary_shards进行文档分配),后期改变会导致分片中的数据不可搜索。
8、副本
Replia副本就是分片的一个拷贝,不仅能提高自身容灾,另外,请求量很大的情况下,副本可以分担主Shard压力,承担查询功能。副本个数还以在创建完索引后灵活调整