基本概念 elasticsearch有几个核心概念。一开始就能理解这些概念对后面的学习会有极大的帮助。 近实时(NRT) Elasticsearch是一个近乎实时的检所平台。意味着从索引一个文档(do
基本概念
elasticsearch有几个核心概念。一开始就能理解这些概念对后面的学习会有极大的帮助。
近实时(NRT)
Elasticsearch是一个近乎实时的检所平台。意味着从索引一个文档(document)到该文档可以被检索之前会稍有延迟。
集群
集群指一个或多个节点的集合,它们可以承载全部数据并提供跨所有节点的联合索引和检索。集群名称由统一的名称来标识,默认集群名称为elasticsearch。这个名称很重要,因为节点加入集群,只通过集群名称进行识别。
确保在不同的环境中使用了不同的集群名称,否则会出现节点加错集群的情况。例如你可以用 logging-dev
, logging-stage
, 和 logging-prod
来区别development、staging和production集群。此外,你可以用各自唯一的集群名称来建立多个互相独立的集群。
集群内只有单个节点也是可以的。
节点
节点是集群内的独立server,用来存储数据,在集群内参与索引和检索。和集群类似,一个节点(node)根据节点名称进行区分,节点名称即在启动时分配的一个随机的UUID。如果不想使用默认的,可以定义节点名称。从管理角度来看,该名称很重要。
一个节点可以通过配置(配置文件中的)集群名称来加入特定集群。默认,每个节点都加入一个名叫elasticsearch的集群,这意味着如果在网络中开启了几个节点(假设他们可以发现彼此),它们会自动通知并且加入一个叫elasticsearch的集群。
在单个集群中,节点可以任意多。另外,如果没有节点运行elasticsearch,此次开启一个es节点会形成一个新的单节点集群,该集群名叫elasticsearch。
索引
索引是具有相似特点的文档(documents)的集合。例如,你可以为用户数据创建一个索引,为产品目录创建一个索引,为订单数据创建另一个索引。索引通过索引名称(必须都是小写字符)来进行区分,当进行索引、检索、更新和删除文档时,涉及到索引名称。
在集群中,你可以定义任意多的索引。
样式
在一个索引中,你可以定义一种或多种样式。一种样式是索引的逻辑分类、分割。通常,具有共有字段的一组文档定义为一个类型。例如,假设你运行一个博客平台,将所有数据存储为一个索引。在这个索引中,你可以给用户数据定义一个样式,可以为博客数据定义一个样式,可以为评论数据定义一个样式。
文档
文档是可以索引的基本信息单元。例如,如果你可以为一个客户创建一个文档,为一个产品创建一个文档,为一个订单创建一个索引。文档以json格式呈现,一种无处不在的互联网数据交换格式。
在一个索引/样式中,你可以存储任意多的文档。注意虽然文档存在于索引中,它必须被索引/分配到索引内的一种样式中。
分片和副本
一个索引可以存储超出单个节点硬件限制的数据。例如,占用了1TB硬件空间的十亿条文档的索引可能并不适合放在一个节点上,或者会出现检索请求过慢的问题。
为了解决这个问题,Elasticsearch提供了分片,它可以将一个索引划分为多片。当你创建了一个索引,你可以定义你期望的分片数量。每一片都是全功能独立的索引,它可以放在集群内的任意一个节点上。
分片的重要性体现在两个主要的原因上:
- 它允许你水平分割内容卷组
- 你可以分布式地并行地执行操作,增加了性能和吞吐量
分片如何分布,检索如何聚合文档等这些机制都完全由Elasticsearch管理,对于用户是透明的。
在网络/云环境中,失败无处不在,非常有必要建立一套容错机制,以防出现分片/节点下线或者丢失。为此,Elasticsearch允许用户为索引的多个分片创建一份或多份副本,交错分片副本集,或简称副本。
副本的重要性体现在以下两点:
- 在分片、节点失效时提供高可用。因此一个分片副本集永远不要位于同一个节点
- 可以扩展检索卷/吞吐量,因为检索操作可以并行在所有的副本上同时执行
总而言之,每个索引可以分成多片。一个索引可以复制零次(即没有副本)或多次。一旦建立副本,每个索引都会具有主分片(可以用来进行复制副本的分片)和副本分片(主分片的复制)。在索引一创建时可以指定每个索引的分片个数和副本个数。索引创建好后,你可以动态改变副本的数量,但不能改变分片的数量。
默认情况下,Elasticsearch每个索引有5个主分片和一个副本集,意味着如果集群中有两个节点,你的索引会有5个主分片和5个副本分片,每个索引总共是10个分片。
每个Elasticsearch分片是一个Lucence索引。在单个Lucence索引中有文档数存在上限。根据LUCENE-5843
,限制为2,147,483,519
个文档。你可以使用api_cat/shards
检测分片大小。
https://www.elastic.co/guide/en/elasticsearch/reference/current/_basic_concepts.html#getting-started-shards-and-replicas