添加索引edit

我们往 Elasticsearch 添加数据时需要用到 索引 (index) —— 保存相关数据的地方。 索引实际上是指向一个或者多个物理 分片 (shard)逻辑命名空间

一个 分片 是一个底层的 工作单元 ,它仅保存了全部数据中的一部分。 在分片内部机制中,我们将详细介绍分片是如何工作的,而现在我们只要知道一个分片是一个 Lucene 的实例,而且它本身就是一个完整的搜索引擎。 我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。

Elasticsearch 是利用分片将数据分发到集群内各处的。看分片看成是数据的容器。文档保存在分片内,分片又被分配到集群内的各个节点里。 当你的集群规模扩大或者缩小时,Elasticsearch 会自动的在各节点之间迁移分片,使得数据仍然均匀分布在集群里。

一个分片可以是 主 (primary) 分片或者 副本 (replica) 分片。 索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。

技术上来说,一个主分片最大能够存储 Integer.MAX_VALUE - 128 个文档,但是实际的最大值依赖于你的使用场景:使用的硬件、文档的大小和复杂程度、索引和查询文档的方式以及期望的响应时长。

副本分片只是主分片的一个拷贝。副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和检索文档等读操作提供服务。

主分片的数量在索引建立的时候就已经确定了,但是副本分片的数量可以随时修改。

让我们在包含一个空节点的集群内创建名为 blogs 的索引。 默认情况下,索引会被分配 5 个主分片,但是为了演示目的,我们将分配 3 个主分片和 1 份副本(每个主分片拥有一个副本分片):

PUT /blogs
{
   "settings" : {
      "number_of_shards" : 3,
      "number_of_replicas" : 1
   }
}

集群现在看起来像图 2, “拥有一个索引的单节点集群”。所有 3 个主分片都被分配在Node 1上。

拥有一个索引的单节点集群
图 2. 拥有一个索引的单节点集群

如果我们现在查看cluster-health,我们将看到如下内容:

{
  "cluster_name": "elasticsearch",
  "status": "yellow", 
  "timed_out": false,
  "number_of_nodes": 1,
  "number_of_data_nodes": 1,
  "active_primary_shards": 3,
  "active_shards": 3,
  "relocating_shards": 0,
  "initializing_shards": 0,
  "unassigned_shards": 3, 
  "delayed_unassigned_shards": 0,
  "number_of_pending_tasks": 0,
  "number_of_in_flight_fetch": 0,
  "task_max_waiting_in_queue_millis": 0,
  "active_shards_percent_as_number": 50
}

集群 status 值为 yellow

没有被分配到任何节点的副本分片数。

集群的健康状况为 yellow 则表示全部 主 (primary) 分片都正常运行(集群可以正常服务所有请求),但是 副本 分片没有全部处在正常状态。 实际上,所有 3 个副本分片都是 unassigned —— 它们都还没有被分配到任何节点。 在同一个节点上存储相同数据的副本是没有意义的,因为一旦失去了那个节点,我们也将丢失该节点上的所有副本数据。

现在,我们的集群功能齐全了,但是在硬件故障时有丢失数据的风险。