Elastic Search 特点
Elastic Search 可能是是当下最火的搜索引擎中间件了。为什么这么火呢?主要是因为他有几大绝艺:
- 快速。无论什么时候,你需要向 ES 查询你的数据,都能够在你还没有反应过来的时候,把查询的结果送到你面前。堪称一个快如闪电。
- 灵活。ES 就像一个大胃王,不管是数字、文本、地理信息类型数据,也不管是结构化的还是非结构化的数据,ES 统统都不在话下,都能够索引并进行查询分析。并且依赖 ES 强大的查询语言,灵活性完全可以和 SQL 相提并论。
- 稳定。通过一台机器处理 1T 的数据和通过 200 台机器处理
100T 的数据在效率上没有大的差别。当你的数据快速增长的时候,加服务器就好了。隔端时间挂掉一台服务器对 ES 来说根本就像挠痒痒,数据完整性,处理的效率用户不会有不同感受。如果服务器全挂了?呃,那你应该换个好运维了。 - 简单。ES 架构简单,无论是部署一个单节点的 ES 还是几百台机器的一个集群,都可以很容易的完成。除了 要求 JDK 以外,没有什么其他的依赖,同学们能够快速的在单机上就搭建一个实验环境,试用 ES 的全部功能。
Elastic Search 概念
在学习和使用 ES 之前,有一些 ES 的核心概念需要先了解。了解这些概念有助于你对 ES 的理解。
准实时(Near Realtime)
和关系数据库这类系统不一样。在关系型数据库中,对数据的修改马上就反应在查询结果中了,但是在 ES 系统中,对数据进行索引后,这个结果要反应到你的查询结果,可能有一个小的延迟。这个延迟通常在一秒以内。这是因为在 ES 在索引文档的时候,是先将数据写入 Member Cache 中,然后系统每隔一秒钟将 Member Cache 中的数据写入到 FileSystem Cache 中。只有写入到 FileSystem Cache 中的数据才会被查询到。所以会有这个延迟。这也是 ES 被称为准实时系统的原因。
集群(Cluster)
一台或者多台 ES 服务器组成一个集群。没错,一台服务器也被称为集群。集群中所有的节点一起来保存你的数据,共同提供给客户端索引、查询数据的能力。一个集群会有一个唯一的集群名称,这个名称默认是 “elasticsearch” ,也可以通过配置修改。ES 的节点通过这个唯一的名字加入集群,并成为集群的一部分。
节点(Node)
节点是一个单独的 ES 服务器,他作为 ES 集群的一部分,和其他节点一起协同完成 ES 集群的文档索引,文档查询的能力。节点在集群中也有一个唯一的名字。默认情况下在节点启动的时候自动生成一个随机的唯一标识符来指定节点的名字,你也可以通过配置来指定。这个名字用来标识节点在集群中的身份。
索引(Index)
文档是有相似特性的文档的集合。概念上类似关系数据的表(Table)。索引在集群中用唯一的名称来标识,这个名称的字母必须都是小写。执行索引、查询、修改、删除文档的操作时候,都需要通过名称指明是在哪个索引上进行的。在一个集群中,我们可以创建任意多个索引。
类型(Type)
这个是一个在 ES 6.0 开始后被定义为不推荐使用的特性。原本的目的是为了让用户在同一个索引中保存不同类型数据文档。例如在同一个索引中既保存用户信息,又保存订单信息。现在推荐在同一个索引中只保存一类数据。例如一个索引保存用户信息,另一个索引保存订单数据。预计这个特性将在 ES 7.0 版本中被删除,所以大家就不要在用这个特性了。
文档(Document)
文档是 ES 中被索引的基本单位。概念上类似关系数据库中的一条记录。形式上,一个文档是一个 JSON 格式的数据。一个索引中可以存储任意多数量的文档。
分片(Shards)
分片是 ES 中非常重要的概念。一个索引可能会存储大量的数据。这些数据存储所需要的空间可能会超出一个单独服务器存储空间的限制。或者说大量的数据都存储在一个单独的服务器上,会导致在索引中查询数据的性能太差。
为了解决这个问题,ES 将索引的数据分割成多份,称为分片。当你创建一个索引的时候,可以简单的通过一个数字来指定分片的数量。默认情况下 ES 会为每个索引分片5个分片。每个分片存储索引的一部分数据。每个分片能够针对自己存储的这部分数据,提供全部的功能。分片的数量在创建索引的时候可以指定,索引数据之后,分片数量不能改变。
切片为 ES 提供了两个好处:
- 他能够方便的水平分割和扩展你的索引存储的数据量。当数据量很大的时候,用更多的索引分片来保存数据。
- 多个分片能够让你的索引的操作并行化。让一次操作分布在多个不同节点的多个分片上,提高系统的吞吐量。
这种分布式和并行化都在 ES 的后台进行,对用户来说是透明的。
ES 的每一个分片都是一个独立的 Lunce 的索引。这也是为什么说 ES 是一个基于 Lunce 的分布式搜索引擎的原因。基于 Lunce 索引的限制,一个 ES 的分片存储的文档的数量最大是
2,147,483,519 条。这个数值是Integer.MAX_VALUE - 128 计算得到的。
副本(Relicas)
在一个大规模的集群中,集群中的节点随时随地都可能会发生故障。一旦某个节点因为网络、存储或者其他的原因失效的时候,存储在改节点上的分片的数据就丢失了。为了应对这种问题, ES 允许你为索引的每个分片建立一个或者多个复制品,称为副本。这样,索引的每个分片就有一个主分片和多个副本分片。
副本机制也为 ES 带来两大好处
- 首先,他在 ES 的集群中的某些节点因为各种原因导致故障的时候,提供了高可用性。不会因为部分节点的失效导致整个 ES 集群不可用。当然,首先索引分片的主分片和副本分片不能存储在一个服务器上,否则一个服务器故障了,会导致整个分片不可用。
- 同分片一样,多个副本同样能够将你的查询分布到不同的节点上,让查询操作并行化,从而提高查询的吞吐量。
默认情况下,ES 会为索引分配一个副本。所以一个ES 集群你应该提供两个以上的节点。来获得高可用性。