基本概念
有几个概念是 Elasticsearch 的核心。
近实时
Elasticsearch 是一个近实时搜索平台。这意味着在将文档索引到可搜索的时间之前, 有轻微的延迟 (通常为一秒)。
集群
集群是一个或多个节点 (服务器) 的集合, 它们一起保存整个数据, 并在所有节点上提供联合索引和搜索功能。群集由默认为 "elasticsearch" 的唯一名称标识。此名称很重要, 因为如果将节点设置为以其名称加入群集, 则节点只能是群集的一部分。 请确保在不同的环境中不重用相同的群集名称, 否则可能会出现连接错误群集的节点。
例如, 您可以使用、以及用于开发、转移和生产群集。logging-devlogging-stagelogging-prod
请注意, 有一个只有一个节点的集群是有效和完美的。此外, 您还可能有多个独立的群集, 每个集群都有自己唯一的群集名称。
节点
节点是单个服务器, 它是群集的一部分, 存储数据, 并参与群集的索引和搜索功能。与集群一样, 节点由一个名称标识, 默认情况下, 它是在启动时分配给节点的随机通用唯一标识符 (UUID)。如果不需要默认值, 可以定义所需的任何节点名称。此名称对于管理目的非常重要, 您需要确定网络中哪些服务器与 Elasticsearch 群集中的哪些节点相对应。 可以将节点配置为通过群集名称加入特定的群集。
默认情况下, 每个节点都设置为加入一个名为elasticsearch的群集, 这意味着, 如果您在网络上启动了许多节点, 并且-假设他们可以发现对方-他们将自动形成并加入一个名为elasticsearch的群集。
在单个群集中, 您可以有尽可能多的节点。此外, 如果网络上当前没有其他 Elasticsearch 节点, 则启动单个节点将默认形成一个名为elasticsearch的新单节点群集。
索引
索引是具有某些相似特性的文档的集合。例如, 您可以有客户数据的索引、产品目录的另一个索引以及订单数据的另一个索引。索引由名称标识 (必须全部为小写), 并且此名称用于在对其中的文档执行索引、搜索、更新和删除操作时引用索引。 在单个群集中, 您可以定义尽可能多的索引。
类型
一种类型, 用于将不同类型的文档存储在同一索引中, 如用户的一种类型, 以及用于博客帖子的另一种类型, 这是索引的逻辑类别/分区。无法再在索引中创建多个类型, 并且将在更高版本中删除类型的整个概念。
文档
文档是可编入索引的基本信息单元。此文档用JSON (JavaScript 对象表示法) 表示, 它是一种无处不在的 internet 数据交换格式。在索引/类型中, 可以根据需要存储尽可能多的文档。
碎片& 复制副本
索引可能存储大量的数据, 从而超过单个节点的硬件限制。例如, 一个单一索引的10亿个文档占用1TB 的磁盘空间可能不适合单个节点的磁盘, 也可能太慢, 无法仅从单个节点中提供搜索请求。
为了解决这个问题, Elasticsearch 提供了将索引细分为多个碎片的能力。创建索引时, 可以简单地定义所需的碎片数。每个碎片本身都是一个功能完备且独立的 "索引", 可以承载在群集中的任何节点上。
分片的主要原因有两个:
* 它允许您水平地拆分/缩放您的内容。
* 它允许您跨碎片 (可能在多个节点上) 分发和并行化操作, 从而提高性能/吞吐量。
碎片的分布方式以及它的文档如何聚合的搜索请求的机制完全由 Elasticsearch 管理, 并且对您作为用户是透明的。
在网络/云环境中, 任何时候都可以预料到故障, 这是非常有用的, 强烈建议有一个故障转移机制, 以防碎片/节点莫名其妙地离线或消失的原因。
为此, Elasticsearch 允许您将索引的碎片的一个或多个副本复制到所谓的副本碎片或短副本中。
复制之所以重要, 主要有两个原因:
* 它提供了高可用性, 以防碎片/节点出现故障。因此, 必须注意, 副本碎片永远不会与它从其复制的原始/主碎片在同一节点上分配。
* 它允许您扩展搜索卷/吞吐量, 因为可以并行地对所有副本执行搜索。
总而言之, 每个索引可以分成多个碎片。
索引也可以复制为零 (意味着没有副本) 或多次。
复制后, 每个索引都将具有主要碎片 (复制自的原始碎片) 和副本碎片 (主要碎片的副本)。
在创建索引时, 每个索引可以定义碎片和副本的数量。创建索引后, 您也可以在任何时候动态更改副本的数量。
您可以使用 _shrink 和 _split api 更改现有索引的碎片数, 但这不是一项微不足道的任务, 对正确数量的碎片进行预先规划是最佳方法。
默认情况下, Elasticsearch 中的每个索引都分配了5个主要碎片和1个复制副本, 这意味着如果群集中至少有两个节点, 则索引将有5个主要碎片和另一个5个副本碎片 (1 个完整副本), 每个索引中总共有10个碎片。