英文版地址: https://www.elastic.co/guide/en/elasticsearch/guide/current/_add-an-index.html
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
添加索引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
上。
如果我们现在查看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 }
集群的健康状况为 yellow
则表示全部 主 (primary) 分片都正常运行(集群可以正常服务所有请求),但是 副本 分片没有全部处在正常状态。
实际上,所有 3 个副本分片都是 unassigned
—— 它们都还没有被分配到任何节点。
在同一个节点上存储相同数据的副本是没有意义的,因为一旦失去了那个节点,我们也将丢失该节点上的所有副本数据。
现在,我们的集群功能齐全了,但是在硬件故障时有丢失数据的风险。