接近实时 (NRT)
Elasticsearch是一个接近实时的搜索平台,意思是从索引这个文档开始知道它变成饿了可搜索的文档只有轻微的延迟。
集群
一个集群是一个或者多个节点的集合,一起维护你全部的数据并且提供跨所有节点的联合索引和搜索功能,集群通常被唯一的名字标识,通常默认是“elasticsearch”,这个名字是很重要的,因为如果一个节点被设置加入集群需要通过名字才能成为集群的一部分。
不要在不同环境重用相同的集群名字,否则你可能会加入错误的集群,例如,你可以在开发,staging和生产环境使用logging-dev, logging-stage, 和 logging-prod 名字标识。
需要注意的是如果集群中只有一个节点也是完全正常的,此外,你还可以有多个独立的拥有一个节点的集群,每个集群有自己唯一的名字。
节点
每个节点是集群的单个服务器,负责存储数据、集群的索引以及搜索功能,像集群一样,每个节点通过名字唯一标识,默认在启动时分配一个随机的uuid,如果你不像使用默认的名字,也可以自己定义名字,这个名字对于管理目的是很重要的,您可以识别在网络中的哪些服务器与ElasticSearch集群中的哪些节点相对应。
可以为节点配置按集群名称加入集群,默认情况下,每个节点都设置为加入名为elasticSearch的集群,这意味着如果您在网络上启动多个节点,并且假设他们可以彼此发现-他们将自动形成并加入名为elasticSearch的单个集群。
在单个集群里,你可以拥有任意数量的节点,此外,如果您的网络上当前没有其他ElasticSearch节点正在运行,那么默认将名为elasticSearch的新的单个节点集群来启动节点。
索引
索引是一些具有类似特征的文档的集合,例如,你可以有客户端数据的索引,产品目录的索引,也可以有订单数据的索引,索引由名字标识(必须是小写),这个名字用来执行索引,搜索,更新和删除文档的操作。
在单个集群里看,你可以定义你想要的任何数量的索引。
类型
在6.0.0.中弃用
类型用来表示索引的逻辑类别/分区,允许你在同一个索引里存储不同类型的文档,例如一种用户类型,另一种博客帖子的类型,从6.0.0之后不再可能在同一个索引里面创建多个类型,并且在更高版本中删除类型的整个概念,请参阅删除映射类型以获取更多的信息。
主分片 & 副本
索引可以存储大量超过单个节点的硬件限制的数据,例如,占有1TB磁盘空间的十亿个文档的单个索引可能不适合单个节点的磁盘,或者太慢而无法单独从单个节点提供搜索请求。
为了解决问题,Elasticsearch提供将索引细分为多个分片的功能,创建索引时,你可以简单定义你想要的分片数量,每个分片本身都是一个功能齐全并且完全独立的“索引”,可以托管在集群中的任何节点上。
分片很重要,主要有以下两个原因:
- 允许你水平拆分或者缩放内容量
- 允许你跨分片(可能在多个节点上)分布和并行化操作,从而提高性能/吞吐量。
分片如何分发的机制以及如何将文档聚合回搜索请求完全由ElasticSearch管理,对用户来说是透明的。
在可以随时发生故障的网络/云环境中,它是非常有用的,并且强烈建议使用故障转移机制,以防分片/节点以某种方式脱机或任何原因消失。
副本很重要的两个原因:
- 它在分片/节点发生故障时提供高可用性,因此,请一定注意副本分片永远不会在与从中复制的原始/主分片相同的节点上分配。
- 它允许你拓展搜索量/吞吐量,因为可以在所有的副本上并行执行搜索。
总结以上,每个索引都可以拆分成多个分片,索引也可以复制0次(没有副本)或者复制更多次,一旦复制,每个索引都将具有主分片和副本分片。
可以在创建索引时为每个索引定义主分片和副本分片的数量,索引创建成功之后,你也可以动态的更改副本的数量,你可以使用_shrink和_split API更改现有索引的分片数,但这不是一项简单的任务,预先计划正确的分片是最佳方法。
默认情况下,ElasticSearch中的每个索引都分配了5个主分片和1个副本,这意味着如果你的集群中有两个节点,则索引包含包含5个主分片和5个副本分片(1个完整副本),那个索引有10个分片。
每个Elasticsearch分片都是Lucene索引,单个Lucene索引可以包含最大数量的文档,自从LUCENE-5843, 限制为2,147,483,519(= Integer.MAX_VALUE - 128) 个文件,你可以使用_cat/shards API监控分片大小。