ES 译文之 ES 必学的几个核心概念

官方原文html

Elasticsearch 中有一些很基础但很是核心的概念,在正式开始学习前,你须要先了解下它们,这将对你后面的学习有极大的帮助。网络

image

近实时 NRT

Elasticsearch 是一个近实时的搜索平台。这也就意味着,文档从被索引到真正能被搜索有一个简短的延迟(一般是 1 秒)。elasticsearch

集群 Cluster

集群,即一个或多个节点(servers)的集合,它承载了咱们保存的全部数据,并提供了在全部节点索引和搜索的能力。每一个集群拥有一个惟一的名称标识,默认的名称为 "elasticsearch"。这个名字很是重要,每一个节点只能加入到一个集群,而每一个节点可否成为某集群的一部分,就是由这个名字决定的。ide

咱们须要确保不一样的环境,集群名称是不一样的,不然节点将会加入到错误的集群。举个例子,你能够用 logging-dev、logging-stage、 logging-production 命名三个集群来分别表示开发、预发和生产三个环境。性能

集群中只有一个节点也能够完美工做。并且,你能够经过设置不一样的集群名称,实现运行多个集群的目标。学习

节点 Node

节点是一个单一的服务,同时也是集群的一部分,负责保存数据,集群的索引和搜索能力须要各个节点的参与。和集群同样,每一个节点也有本身的名字,节点的名称默认是经过 UUID 随机产生的,在节点启动时,会为其分配一个名称。若是不但愿使用默认生成的名称,也能够自定义。这个名字也很重要,集群会经过它们来标识每一个节点,在进行集群管理时,要知道哪些节点属于某个集群一样须要节点名称来识别。ui

经过为某个节点配置集群名称,就能够把它加入到指定的集群。节点默认会被加入到名称为"elaticsearch" 的集群。若是在一个网络中启动了多个节点,而且它们能够互相发现,那么这些节点就会自发组成一个名称为 "elaticsearch" 的集群。cdn

一个集群能够由任意多个节点组成。若是网络中没有正在运行的节点,那么启动一个新节点将自动建立一个新的集群,而这个集群只包含了一个节点,默认名称为 "elasticsearch"。server

索引 Index

索引,是有着类似性的文档的一组集合。怎么理解呢?举个例子,你能够用一个索引存储消费者一类的数据,一个索引保存商品类信息、还有一个索引保存订单数据。 每一个索引都是经过名称(必须是小写)来识别的。当咱们对某个索引中文档数据执行一些操做时,好比索引、搜索、更新和删除时,也要经过名字识别。htm

一个集群能够定义任意多个索引。

类型 Type

注:Type 在 Elasticsearch 6.0 已经被弃用了。再也不支持多个类型

类型是用于在索引上实现一种逻辑上的分类/分区,这让咱们能够在一个索引中存储不一样类型的文档,好比,user 类型,blog 类型。可是,在 6.0 之后, 已经不支持在一个建立多个 Type 类型了,并且,Type 类型这个概念将会在下一个版本,也就是 7.0 完全移除。

文档 Document

文档是 Elasticsearch 中能被索引的最小信息单元。好比,你能够用一个文档表示一个消费者,一个文档表示一个商品,还有一个文档表示一笔订单。文档是以 JSON 格式表示的,这是一种很经常使用的数据格式。

在一个索引/类型中,咱们能够保存任意多个文档。要说明的是,虽然物理意义上,文档是保存在索引中的,但当前版本(6.5),一个文档的保存必需要指定索引/类型。

分片和副本 Sharps & Replica

毫无疑问,一个索引中存储的数据量可能突破单个节点的硬件限制。举个栗子,假设一个含有十亿个文档的索引将占用 1T 的磁盘空间,那么一个节点的磁盘空间可能不够。 即便有足够的空间,也会出如今单一节点请求处理太慢的问题。

如何解决这个问题呢?Elasticsearch 提供了一种能力,能够把一个索引拆分为多个部分,每一个部分称为 sharps,即分片。建立索引时,你能够指定索引的分片数,每一个分片其实都是一个独立的,功能齐全的 "索引 index",而且可能存在于集群中的任何一个节点上。

分片是很是重要的,有两个缘由:

  • 它使集群能够实现水平容量扩展
  • 它使咱们能够实如今不一样分片(多个节点)之间并行操做,从而提升系统的性能/吞吐量。

那么,你是否会想,索引上的分片如何分布的呢?一个搜索请求如何查找和聚合不一样分片的搜索结果呢?其实,Elasticsearch 已经帮咱们解决了这些问题。 并且这个过程咱们也是可见的。

在一个网络/云环境下,随时可能发生异常,好比某些状况下,切片/节点忽然中止工做,或者直接从集群中直接消失了。于是,容错机制是很是必要且很是重要的。基于此,Elasticsearch 提供了为切片建立副本的能力,你能够设置为每一个切片建立一个或多个副本。

以两点来介绍下副本的重要性。

  • 高可用,万一某个节点/切片挂了,依然能够正常工做。所以,千万要注意,副本切片和主切片永远不会分配在同一个节点上。
  • 高性能,操做能够在多个副本上并行执行,这能够提升你的搜索性能,提升搜索的吞吐量.

简言之,一个索引能够被拆分红多个切片,而一个索引也能够被复制 0 或多份。一旦完成副本复制,每一个索引将会拥有一个主分片(原始分片,其余副本都从这个分片拷贝)和副本分片(主分片的副本)。

索引的分片和副本数能够在索引建立时定义。不过,在索引建立完成后,你也能够随时改变更态的改变副本数量。经过 _shrink 和 _split 两个接口,你也能够改变已建立的索引的分片数,但这不是一件小事情,最好是在建立索引时,就设置好正确的分片数。

默认状况下,Elasticsearch 会为每一个索引分配 5 个主分片和 5 个副本,这也就意味着,若是你的集群中至少有两个节点,那么默认每一个索引会有 5 个主分片和 5 个副本,即总共包含 10 个分片。

相关文章
相关标签/搜索