本文系本人根据官方文档的翻译,能力有限、水平一般,如果对想学习Elasticsearch的朋友有帮助,将是本人的莫大荣幸。
原文出处:https://www.elastic.co/guide/en/elasticsearch/reference/current/_basic_concepts.html
ElasticSearch有几个核心概念,了解它们将有助于我们的整个学习过程。
近乎实时(NRT)
Elasticsearch是一个近乎实时的搜索平台。这意味着从你为一个文档建立索引到该文档可被检索只有很小的时间差(通常是1秒)。
集群(Cluster)
群集是一个或多个节点(服务器)的集合,它们一起保存整个数据,并在所有节点上提供联合索引和搜索功能。一个集群由唯一的名称加以识别,默认为“elasticsearch”。此名称非常重要,因为一个节点(服务器)只能按(集群)的唯一名称加入集群。
请确保不要在不同的环境中使用相同的集群名称,否则节点可能会加入错误的集群。举例来讲,你可以使用 logging-dev, logging-stage, 以及logging-prod 分别作为开发,测试和生产环境的集群名称。
一个集群可以仅包含一个节点。而且你也可以设置多个不同的集群,每个集群都有自己唯一的名称。
节点(Node)
节点是作为集群的一台服务器,存储数据并参与集群的索引和搜索功能。和集群相似,节点是由名称标识的,在节点启动时被默认分配为随机的UUID(Universally Unique Identifier)。如果不想要默认名称,你可以给任意节点定义名称。该名称在管理你网络中的服务器对应哪个节点时起到很重要的作用。
一个节点可以被配置为加入带有特定名称的集群。默认情况下,每个节点都会加入名为elasticsearch的集群。也就是说,如果你启动了多个节点,并且假设它们之间是网络连通的,那么它们将自动组一个名为elasticsearch的集群。
在单一集群中,你可以拥有任意数量的节点。而且,如果当前没有其他ElasticSearch节点运行与你的网络,启动一个新节点将组建一个新的名为elasticsearch的单节点集群。
索引(Index)
索引是具有相似特性的文档集合。例如,可以为客户数据建立一个索引,产品目录用另一个索引,以及订单数据再建立一个索引。索引由名称(必须全部为小写)标识,该名称用于在对其中的文档执行索引、搜索、更新和删除操作时引用索引。
在一个集群中,你可以定义任意数量的索引。
类型(Type)
在索引中,你可以定义一或者多个类型。类型是索引的逻辑类别/分区,其语义完全取决于你。一般来说,类型定义为具有公共字段集的文档。例如,假设你运营一个博客平台,并将所有数据存储在一个索引中。在这个索引中,您可以定义用户数据的类型,博客数据的类型,以及注释数据的类型。
文档(Document)
文档是可被索引的最小单元。举例,你可以为一个客户创建一个文档,为一个产品创建另一个文档,为一个订单再创建一个文档。这个文档用JSON(JavaScript对象标记语言)表示,它是一种无处不在的Internet数据交换格式。
在一个索引或者类型中,你可以存储任意数量的文档。注意,一个文档物理上长存于索引中,而事实上也同时必须被指定一个索引中的类型。
碎片和复制品(Shards & Replicas)
索引可以存储大量的数据,这些数据可能超过单个节点的硬件限制。例如,占用磁盘空间1TB的含有十亿个文件的单个索引,可能不适合放单个节点的磁盘上。因为那将拖慢服务本身以至于无法响应外部的搜索请求。
为了解决这一问题,Elasticsearch提供了将索引分成多个块(称之为碎片)的能力。创建索引时,可以简单地定义你所需的碎片数。每个碎片本身是一个全功能的、独立的“索引”,可以被托管在集群中的任意节点。
分片之所以重要是因为两大原因:
1. 它允许你水平拆分/缩放内容卷
2. 它允许你跨分片地并行操作(可能在多个节点上)从而提高性能/吞吐量
分片的分布机制、以及分片上文档聚合后返回给检索请求完全由Elasticsearch管理,对于作为用户的你来说是完全透明的。
在网络/云计算环境中失败时有发生,分片/节点意外导致不可用时,拥有故障转移机制是非常有帮助且被告诉推崇的。为此,Elasticsearch可以将一或者多个所以的分片拷贝转化为副本分片,简称副本(replicas)。
副本的重要性主要有两大原因:
1. 它提高了分片/节点故障时的可用性。需要注意的是,副本分片永远不会和那个被它复制的原始/主分片分配在同一个节点上。(译者注:如果和主分片在同一个节点,当该节点故障副本节点也将不可用,便失去了副本的意义)
2. 它增大了搜索量/吞吐量,因为搜索可以在所有副本上并行执行。
总结:每个索引可以被拆分为多个分片。一个索引可以被复制0次(不复制)或者多次。一旦被复制,每个索引将会拥有主分片(原始的被复制的分片)和副本分片(从主分片复制而来的分片)。主分片及副本分片的数量可以在创建索引的时候指定。索引被创建后,你可以动态改变副本分片的数量,但是主分片的数量则不允许修改。
每个Elasticsearch中的每个索引被默认分配了5个主分片和一个副本(节点),也就是说如果在你的集群中有两个节点,那么你的索引将会有5个主分片和5个副本分片(一个完整副本)共计10个分片。
每个Elasticsearch分片是一个Lucene索引。 每个Lucene索引有个允许的包含的文档数量上限。截止
LUCENE-5843, 上限为 2,147,483,519 (= Integer.MAX_VALUE - 128) 。你可以使用_cat/shards
api来监视分片大小。
了解了基础概念之后,让我们开始接触有趣的部分吧…