添加索引

为了将数据添加到 Elasticsearch,我们需要 索引(index) —— 存储关联数据的地方。实际上,索引只是一个 逻辑命名空间(logical namespace),它指向一个或多个 分片(shards)

分片(shard)工作单元(worker unit) 底层的一员,它只负责保存索引中所有数据的一小片。在接下来的《深入分片》一章中,我们还将深入学习分片是如何运作的,但是现在你只要知道分片是一个独立的Lucene实例既可,并且它自身也是一个完整的搜索引擎。我们的文档存储并且被索引在分片中,但是我们的程序并不会直接与它们通信。取而代之,它们直接与索引进行通信的。

在 elasticsearch 中,分片用来分配集群中的数据。把分片想象成一个数据的容器。数据被存储在分片中,然后分片又被分配在集群的节点上。当你的集群扩展或者缩小时,elasticsearch 会自动的在节点之间迁移分配分片,以便集群保持均衡。

分片分为 主分片(primary shard) 以及 从分片(replica shard) 两种。在你的索引中,每一个文档都属于一个主分片,所以具体有多少主分片取决于你的索引能存储多少数据。

虽然理论上主分片对存储多少数据是没有限制的。分片的最大数量完全取决于你的实际状况:硬件的配置、文档的大小和复杂度、如何索引和查询你的文档,以及你期望的响应时间。

从分片只是主分片的一个副本,它用于提供数据的冗余副本,在硬件故障时提供数据保护,同时服务于搜索和检索这种只读请求。

索引中的主分片的数量在索引创建后就固定下来了,但是从分片的数量可以随时改变。

接下来,我们在空的单节点集群中上创建一个叫做 blogs 的索引。一个索引默认设置了5个主分片,但是为了演示,我们这里只设置3个主分片和一组从分片(每个主分片有一个从分片对应):

  1. PUT /blogs
  2. {
  3. "settings" : {
  4. "number_of_shards" : 3,
  5. "number_of_replicas" : 1
  6. }
  7. }

现在,我们的集群看起来就像下图所示了有索引的单节点集群,这三个主分片都被分配在 Node 1

有索引的单节点集群

如果我们现在查看 集群健康(cluster-health) ,我们将得到如下信息:

  1. {
  2. "cluster_name": "elasticsearch",
  3. "status": "yellow", <1>
  4. "timed_out": false,
  5. "number_of_nodes": 1,
  6. "number_of_data_nodes": 1,
  7. "active_primary_shards": 3,
  8. "active_shards": 3,
  9. "relocating_shards": 0,
  10. "initializing_shards": 0,
  11. "unassigned_shards": 3 <2>
  12. }
  1. 集群的 statusyellow.
  2. 我们的三个从分片还没有被分配到节点上。

集群的健康状况 yellow 意味着所有的 主分片(primary shards) 启动并且运行了,这时集群已经可以成功的处理任意请求,但是 从分片(replica shards) 没有完全被激活。事实上,当前这三个从分片都处于 unassigned(未分配)的状态,它们还未被分配到节点上。在同一个节点上保存相同的数据副本是没有必要的,如果这个节点故障了,就等同于所有的数据副本也丢失了。

现在我们的集群已经可用了,但是依旧存在因硬件故障而导致数据丢失的风险。