1.什么是ElasticSearchElaticsearch,简称ES,ES是一个开源的、高度可扩展的、分布式的全文搜索引擎,可以近实时地存储和检索数据;具有很好的扩展性,可以扩展到上百台服务器,处理PB级数据。ES也是用Java开发的,以Lucene为核心实现所有的索引和搜索功能,但其目的是通过简单的RESTfulAPI隐藏Lucene的复杂性,从而使全文搜索变得简单。2.ElasticSearch用例2013年初,GitHub放弃了Solr,采用ElasticSearch做PB级别的搜索。“GitHub使用ElasticSearch搜索了20TB的数据,包括13亿个文件和1300亿行代码”。Wikipedia:推出基于ElasticSearch的核心搜索架构。SoundCloud:“SoundCloud使用ElasticSearch为1.8亿用户提供即时准确的音乐搜索服务”。百度:百度目前广泛使用ElasticSearch进行文本数据分析,收集百度所有服务器上的各种索引数据和用户自定义数据,对各种数据进行多维分析和展示,辅助定位和分析实例异常或业务级异常.目前覆盖百度内部20多个业务线(包括卡西欧、云分析、网盟、预测、图书馆、直属账户、钱包、风控等),单个集群最大100台机器,200个ES节点,每天导入30TB+数据。新浪使用ES分析处理32亿条实时日志。阿里使用ES搭建了自己的日志收集和分析系统。3、ElasticSearchvs.SolrSolr使用Zookeeper进行分布式管理,而Elasticsearch本身具有分布式协调管理功能;Solr支持更多格式的数据,而Elasticsearch只支持json文件格式;Solr官方提供的功能更多,而Elasticsearch更侧重于核心功能,大部分高级功能由第三方插件提供;Solr在传统搜索应用中的性能优于Elasticsearch,但在实时搜索应用中效率明显低于Elasticsearch。4.ElasticSearch架构及基本概念1.ES概述Elasticsearch是面向文档的,也就是说它可以存储整个对象或文档。但是,它不仅存储,而且索引(index)每个文档的内容,以便于搜索。在Elasticsearch中,您可以索引、搜索、排序和过滤文档(而不是数据的行和列)。2.ES架构模块这张图从下往上看:最底层的Gateway是ES用来存储索引的文件系统,支持多种类型。Gateway的上层是一个分布式的lucene框架。Lucene之上是ES模块,包括:索引模块、搜索模块、映射分析模块等。ES模块之上是Discovery、Scripting和第三方插件。Discovery是ES的节点发现模块。不同机器上的ES节点需要相互通信组成集群,集群内需要选举master节点。这些任务都是由Discovery模块完成的。支持Zen、EC2、gce、Azure等多种发现机制。Scripting用于支持在查询语句中插入javascript、python等脚本语言。脚本模块负责解析这些脚本,使用脚本语句性能略低。ES还支持多种第三方插件。上层是ES的传输模块和JMX。传输模块支持多种传输协议,如Thrift、memecached、http,默认使用http。JMX是一个java管理框架,用于管理ES应用。最上层是ES提供给用户的接口,可以通过RESTful接口与ES集群进行交互。三、Elasticsearch核心概念1.索引index索引是具有某种相似特征的文档的集合。例如,您可以有一个客户数据索引、另一个产品目录索引和另一个订单数据索引。一个索引由一个名称来标识(必须全是小写字母),当我们要对这个索引对应的文档进行索引、查找、更新、删除等操作时,就必须使用这个名称。在集群中,可以定义任意数量的索引。2.类型type在一个索引中,可以定义一种或多种类型。类型是索引的逻辑分类/分区,其语义完全取决于您。通常,类型是为具有一组公共字段的文档定义的。例如,假设您运行一个博客平台并将所有数据存储在一个索引中。在这个索引中,你可以定义一种类型的用户数据,另一种类型的博客数据,当然还有另一种类型的评论数据。3.字段Field相当于数据表的字段,按照不同的属性对文档数据进行分类标识4.Mapping映射是对处理数据的方式和规则做一些限制,比如数据类型,默认值,以及一个字段的分析器,是否被索引等这些都是可以在映射中设置的设置。还有一些是ES中处理数据的一些使用规则设置,也叫作映射。按照最优规则处理数据会大大提高性能,所以需要建立映射,并且需要思考如何建立映射才能更好地提高性能。5.文档文档是可以被索引的基本信息单元。例如,您可以有某个客户的文档、某个产品的文档,当然还有某个订单的文档。文档以JSON(JavascriptObjectNotation)格式表示,JSON是一种无处不在的互联网数据交互格式。在索引/类型中,您可以存储任意数量的文档。请注意,尽管文档物理上存在于索引中,但文档必须被索引/分配索引类型。6.Cluster集群一个集群是由一个或多个节点组织起来的,它们共同持有整个数据,并共同提供索引和搜索功能。集群由唯一名称标识,默认情况下为“elasticsearch”。这个名字很重要,因为一个节点只能通过指定它的名字来加入集群。7.节点节点是集群中的服务器。作为集群的一部分,它存储数据并参与集群的索引和搜索功能。与集群类似,节点也由名称标识。默认情况下,此名称是在启动时分配给节点的随机漫威漫画角色的名称。这个名字对于管理工作非常重要,因为在这个管理过程中,你会决定网络中的哪些服务器对应Elasticsearch集群中的哪些节点。节点可以通过配置集群名称加入指定的集群。默认情况下,每个节点都被安排加入一个名为“elasticsearch”的集群,这意味着如果您在网络中启动多个节点并假设它们可以相互发现,它们将自动形成并加入一个名为“elasticsearch”的集群。在集群中,您可以拥有任意数量的节点。此外,如果您当前没有任何Elasticsearch节点在您的网络中运行,此时启动一个节点将默认创建并加入一个名为“elasticsearch”的集群。8.分片和复制shards&replicas一个索引可以存储大量数据,超出单个节点的硬件限制。例如,10亿条文档的索引占用1TB的磁盘空间,没有节点有这么大的磁盘空间;或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch提供了将索引分成多个部分的能力,这些部分称为分片。创建索引时,您可以指定所需的分片数。每个分片本身就是一个功能完备且独立的“索引”,可以放置在集群中的任何节点上。分片之所以重要,主要有两个原因:1)允许您水平拆分/扩展内容容量。2)允许您对分片(位于多个节点)执行分布式并行操作,从而提高性能/吞吐量。至于分片是如何分布的,它的文档是如何聚合回搜索请求的,完全由Elasticsearch来管理,对作为用户的你来说是透明的。在随时可能发生故障的网络/云环境中,分片/节点不知何故离线,或因任何原因消失,拥有故障转移机制是非常有用的,并且强烈推荐。为此,Elasticsearch允许您创建分片的一个或多个副本。这些副本称为复制分片,或简称为副本。复制之所以重要,主要有两个原因:它在分片/节点故障的情况下提供高可用性。出于这个原因,非常重要的是要注意复制的分片永远不会与原始/主分片放在同一个节点上。扩展您的搜索量/吞吐量,因为搜索可以在所有副本上并行运行。简而言之,每个索引可以分为多个分片。索引也可以被复制0次(意味着没有复制)或多次。复制后,每个索引都有一个主分片(从中复制的原始分片)和一个复制分片(主分片的副本)。分片和副本的数量可以在索引创建时指定。创建索引后可以随时动态更改副本数,但之后不能更改分片数。默认情况下,Elasticsearch中的每个索引都由5个主分片和1个副本分片,这意味着,如果您的集群中至少有两个节点,您的索引将有5个主分片和另外5个复制分片(1个完整副本),对于每个索引总共10个分片。
