ES总结一:初识ES

诞生过程

Elasticsearch是一个基于Lucene的搜索服务器,釆用Java语言编写,使用Lucene构建索引、提供搜索功能,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。我们知道,Lucene提供的功能已经很强大了,但是Lucene只是一个由Java语言编写的库,对不使用Java语言的开发人员并不友好,Elasticsearch在Lucene的基础上做了更多的改进,提供了多种语言接口。ES和Lucene的关系可以用如下的图来表示:

架构解读

Gateway是Elasticsearch用来存储索引的文件系统,支持多种文件类型,LocalFileSystem是存储在本地的文件系统,SharedFileSystem是共享存储,也可以使用Hadoop的HDFS分布式存储,也可以存储在AmazonS3云服务上。
Gateway的上层是一个分布式的Lucene框架,Elasticsearch的底层API是由Lucene提供的,每一个Elasticsearch节点上都有一个Lucene引擎的支持。
Lucene之上是Elasticsearch的模块,包括索引模块、搜索模块、映射解析模块等。
River相当于第三方插件,用来导入第三方数据源,在2.X之后已经不再使用。
Elasticsearch模块之上是DiscoveryScripting和第三方插件。Discovery是Elasticsearch的节点发现模块,不同机器上的Elasticsearch节点要组成集群需要进行消息通信,集群内部需要选举master节点,这些工作都是由Discovery模块完成的。Scripting用来支持JavaScriptPython等多种语言,可以在查询语句中嵌入,使用Script语句性能稍低。Elasticsearch也支持多种第三方插件。
再上层是Elasticsearch的传输模块和JMX传输模块支持ThriftMemcachedHTTP,默认使用HTTP传输。JMX是Java的管理框架,用来管理Elasticsearch应用。
最上层是Elasticsearch提供给用户的接口,可以通过RESTftilAPI和Elasticsearch集群进行交互。

优点

•分布式:Elasticsearch横向扩展非常灵活,当数据规模比较小的时候可以使用小规模的集群。随着数据的增长,需要更大的容量和更高的性能,此时只需增加更多的节点,Elasticsearch的自动发现机制会识别新增的节点并重新平衡分配数据。
•全文检索:ApacheLucene是一个用Java编写的高性能的功能齐全的信息检索库,Elasticsearch在后台使用Lucene来提供最强大的全文检索,提供任何幵源产品的能力。自带多语言支持、强大的查询语言、地理位置支持、上下文感知的建议、自动完成和搜索片段。
•近实时搜索和分析:数据从进入Elasticsearch可达到近实时搜索。除了搜索,Elasticsearch也可以进行聚合分析操作。
•高可用:高可用主要体现在容错机制上,Elasticsearch集群会自动发现新的或失败的节点,重组和重新平衡数据,确保数据是安全的和可访问的。
•模式自由:Elasticsearch的动态mapping机制可以自动检测数据的结构和类型,创建索引,并使数据可搜索。
•RESTfulAPIElasticsearch是API驱动。几乎任何操作都可以用一个简单的RESTftilAPI使用JSON基于HTTP请求来实现,客户端也可使用多种编程语言。

应用场景

站内搜索,NOSQL数据库,日志分析等等

核心概念

集群

一个或多个安装Elasticsearch的服务器节点组织在一起就是集群,它们共同持有你整个的数据并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,称为clustername,集群名称默认是“elasticsearch”。集群名称非常重要,就像一个组织的名称,具有相同集群名称的节点才会组成一个集群。集群名称可以在配置文件中指定。

节点

一个节点是你集群中的一个服务器,作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个集群名称为“elasticsearch”的集群中,这意味着如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。但是有的时候这种机制并不可靠,会发生脑裂现象,往往不如在每一个节点上配置节点的名字在启动时进行被动发现来的安全稳定

索引

一个索引就是一个拥有几分相似特征的文档的集合,索引的数据结构仍然是倒排索引。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索引。索引做动词来讲的时候表示索引数据和对数据进行索引操作

分片

一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch提供了将索引划分成多份的能力,这些份就叫作分片。当你创建一个索引的时候,可以指定想要的分片的数量,每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。分片之所以重要,主要有以下两方面的原因:(1)允许你水平分割/扩展你的内容容量。(2)允许你在分片(潜在地,位于多个节点上)上进行分布式的、并行的操作,进而提高性能和吞吐量,至于一个分片怎样分布,它的文档怎样聚合回搜索请求,完全由Elasticsearch管理,对于用户来说,这些都是透明的。

副本

在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于某种原因消失了,这种情况下,有一个故障转移机制非常有用,并且也是强烈推荐的。为此,Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫作复制分片,或者直接叫副本。副本之所以重要,有以下两个主要原因:(1)在分片/节点失败的情况下,保证高可用性。因为这个原因,复制分片不与主分片置于同一节点上,这一点非常重要。(2)扩展你的搜索量/吞吐量,因为搜索可以在所有的副本上并行运行。总之,每个索引可以被分成多个分片。一个分片可以有一至多个副本。一旦有了副本,每个索引就有了主分片(作为复制源的原来的分片)和副本分片(主分片的拷贝)之别。分片和副本的数量可以在索引创建的时候指定。在索引创建之后,可以在任何时候动态地改变副本的数量,但是事后不能改变分片的数量。