基本概念
有一些Elasticsearch的核心概念,在开始的时候理解这些概念将对我们的学习非常有帮助。
近乎实时(NRT)
Elasticsearch 是一个近乎实时的搜索平台。这意味着从开始索引一个文档到它成为能被搜索到的,之间有一个轻微的延迟(通常是一秒)。
集群
一个集群是一个或多个节点的集合。这些节点保存全部的数据,并横跨所有的节点提供联合索引和搜索能力。一个集群被一个唯一的名称来标志,默认名称是“elasticsearch”。这个名称非常重要,在节点启动的时候只有根据名称来加入集群,这个节点才能成为集群的一部分。
在不同的环境下,确保你没有重复使用相同的集群名字,否则节点可能会加入错误的集群而结束。例如你可以使用logging-dev、logging-stage、logging-prod来分别用于开发、 staging 和生产的集群。
注意只有一个单独节点的集群是合法的 。此外,你可能有许多个独立的集群,每个集群都有一个唯一的名称。
节点
节点是一个单独服务,这个服务是集群的一部分,这个节点存储数据,并参与集群的索引和搜索能力。就像一个集群,一个节点也是由有一个名称来标识。这个名称默认是一个随机的 Marvel字符名称,当节点启动的时候,会被分配一个名称。如果你不想要默认的名称,你也可以定义你想要的名称。出于管理的目的,当你在网络中想要辨别出哪个服务符合于Elasticsearch 集群中的节点的时候,这个名称非常重要。
根据集群名称,可以配置一个节点加入一个指定的集群。默认情况下,每个节点在启动的时候加入一个名为slasticsearch 的集群,这意味着如果你启动一堆节点——假设它们能互相发现——它们将自动形成和加入一个单独的集群,这个集群名称为elasticsearch 。
在一个单独的集群中,你可以拥有任意个你想要的节点。此外,如果在你的网络中没有别的Elasticsearch 节点正在运行。启动一个单独的节点将形成一个单独节点的集群,这个集群名称为elasticsearch 。
索引(Index)
一个索引是有相同特征的文档的集合。比如说,顾客数据可以有一个索引,一个产品目录有一个另外的索引,订单数据也可以有一个索引。一个索引也是由一个名称(必须全部是小写)来标识,当执行索引、搜索、更新和删除操作的时候,这个名称就用来指向这个索引。
在一个单独的集群中,你可以定义若干个索引。
类型(Type)
在一个索引中,你可以定义一个或多个类型。一个类型是你的索引的一个逻辑分类/分区,这个类型的语义由你决定。通常,给文档定义的一个类型有一组通用字段。比如说,假设你运行着一个博客平台并把所有的数据存在一个单独的索引中。在这个索引中,你可以把用户数据定义为一个类型、博客数据为另一个类型、评论数据也为一个类型。
文档(Document)
一个文档是能被索引的一个基本的信息单元。比如说,可以为一个单独的客户建立一个文档,一个单独的产品建立一个文档,一个单独的订单一个文档。文档使用json来表示,这是一个普遍存在的内部数据格式。
在一个索引/类型中,可以存储许多个文档。注意,虽然一个文档存在一个索引中,实际上在一个索引中一个文档必须被索引/分配一个类型。
分片和副本(Shards & Replicas)
一个索引可能存储大量的数据,这个数据量可能超过一个单独节点的硬盘大小。比如说,十亿个文档的索引可能会占用1TB大小的磁盘空间,可能就不适合一个单独节点的磁盘,也可能会导致这个节点处理查询请求非常缓慢。
为了解决这个问题,Elasticsearch提供一种能力,这种能力可以把索引细分到多个称为分片的地方中去。当你创建索引的时候,你可以定义你想要的分片的数量。每个分片对于它自己都是全功能和独立索引的。
由于两种原因,分片非常重要:
它允许你水平地切分、规划你的内容
它允许你在分片间水平地、分散地操作,因此提高了性能、吞吐量。
分片结构是分布式的,并且搜索请求背后的文档聚合也是由Elasticsearch 来完全管理的,对用户来说是透明的。
在一个网络、云环境中,任何时候都有可能失败,万一 一个分片、节点以某种方式下线或者消失,有一个故障恢复机制是非常有用并被建议的。在这边文章的末尾,Elasticsearch允许索引的分片有一个或多个副本,这个副本我们称为复制分片,·或直接叫做副本。
由于两种原因,副本也非常重要:
当一个分片、节点失败的时候,它提供了高可用性。由于这个原因,一个副本分片永远不要被允许分配在同一个节点上是非常重要的。
它允许你扩展你的搜索容量、吞吐量,因为搜索可以在所有的副本上平行进行。
来做一个总结,每个索引能被切分到多个分片上。一个索引可以被复制多份。一旦有了副本,每个索引将有一个主分片和副本分片,分片和副本的数量可以在索引创建的时候被定义。当索引创建,你也可以动态的改变副本的数量,但是不能改变既有的分片数量。
默认情况下,每个索引允许有五个主分片和一个副本。这意味着如果在集群中至少有两个节点,对于每个索引的10个分片来说,你的索引将会有五个主分片和另外五个副本分片。