一、简介
Elasticsearch 是一个开源的搜索引擎,建立在全文搜索引擎库 Apache Lucene 基础之上
用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。
Elasticsearch 不仅仅只是一个全文搜索引擎。
它可以被下面这样准确的形容:
一个分布式的实时文档存储,每个字段可以被索引与搜索——作数据库用
一个分布式实时分析搜索引擎
能胜任上百个服务节点的扩展,并支持 TB 级别的结构化或者非结构化数据
二、ES的诞生
三、ES的应用
Elasticsearch 后来作为一家公司(Elastic公司)进行运作,定位为数据搜索和分析平台。
ES现在可以与Java、Ruby、Python、PHP、Perl、.NET等多种客户端集成。也可与Hadoop、Spark等大数据分析平台进行集成,功能十分强大。
基于Elasticsearch衍生出了一系列开源软件,统称为 Elatic Stack
四、ES的核心概念
1.Near Realtime
接近实时的查询,通常情况下,延迟在1s以内
2.Cluster
一个集群由1个或者多个节点组成,这些节点提供整个数据和索引,性能来源于每个节点。一个集群有一个唯一的名字,默认为“elasticsearch”,
3.Node
一个node启动的时候分配一个唯一的id(UUID),自动会加入名为“elasticsearch”的cluster,前提是网络没有问题,一个node只能加入一个集群。
4.Index
一个index是一些有相似特征的documents集合,比如有一个顾客类的index,一个生产类的index,有一个订单类的index。index必须都是小写的
5.Type
一个index可以定义出多个type,一个type是一个逻辑的类别或者分区,并且其语义完全取决于自己,一般而言一个type定义了包含多个fields的documents。
6.Document
一个document是可以被索引信息的基础单元,尽管一个document在物理上是属于index的,但事实上,一个document必须被索引或者分配到一个index里的type。
7.Shard & Replicas
一个index可以存储大量的数据,并且超过单节点的限制。例如,单个index可能含有几十亿个documents,占据了1TB的磁盘空间,这就可能导致单个node可能没有这么大的空间,或者在查询的时候会很慢。
为了解决这个问题,es给出了shard的概念,将一个index拆分成多个部分。创建的index就可以申明shard的数量,每个shard都是拥有完整和独立的index。
(1)Sharding的两个重要点:
1.shard允许你对大量数据做横向切分
2.shard允许通过多个shards分布式并发的操作,从而提升性能和吞吐量
Shard是如何分布的以及多个它们的documents是如何被合并都由es管理,这些对使用者都是透明的。
关于容错,es通过replica来解决,replica是index下的shard的副本。
(2)Replicaing的两个重要点:
1.提供了HA(High available)高可用性。需要提醒的是,replica和shard不应该在同一个node
2.搜索可以在所有的replica并发处理
你可以在创建的时候设置index的shard和replica数量,但是之后,你只能更改replica的数量,而不能更改shard的数量.
Es的默认配置为,5个shards和1个replica,如果你的cluster有两个及以上的node,则一共有10个shards(5 primary shards,5 replica shards)
逻辑上,index、type、documents作为namespace的存在,可以充分表现Restful风格的接口
物理上,index可以看做是数据库中的库,通过shard(类似partition)做HA:(High available)高可用性和高并发。
五、ES和数据库关系对比
六、ES的优势
速度快、易扩展、弹性、灵活、操作简单、多语言客户端、X-Pack、hadoop/spark强强联手、开箱即用。
分布式:横向扩展非常灵活
全文检索:基于lucene的强大的全文检索能力;
近实时搜索和分析:数据进入ES,可达到近实时搜索,还可进行聚合分析
高可用:容错机制,自动发现新的或失败的节点,重组和重新平衡数据
模式自由:ES的动态mapping机制可以自动检测数据的结构和类型,创建索引并使数据可搜索。
RESTful API:JSON + HTTP