為了將數據添加到 Elasticsearch,我們需要 索引(index) —— 存儲關聯數據的地方。實際上,索引只是一個 邏輯命名空間(logical namespace),它指向一個或多個 分片(shards)。
分片(shard) 是 工作單元(worker unit) 底層的一員,它只負責保存索引中所有數據的一小片。在接下來的《深入分片》一章中,我們還將深入學習分片是如何運作的,但是現在你只要知道分片是一個獨立的Lucene實例既可,并且它自身也是一個完整的搜索引擎。我們的文檔存儲并且被索引在分片中,但是我們的程序并不會直接與它們通信。取而代之,它們直接與索引進行通信的。
在 elasticsearch 中,分片用來分配集群中的數據。把分片想象成一個數據的容器。數據被存儲在分片中,然后分片又被分配在集群的節點上。當你的集群擴展或者縮小時,elasticsearch 會自動的在節點之間遷移分配分片,以便集群保持均衡。
分片分為 主分片(primary shard) 以及 從分片(replica shard) 兩種。在你的索引中,每一個文檔都屬于一個主分片,所以具體有多少主分片取決于你的索引能存儲多少數據。
雖然理論上主分片對存儲多少數據是沒有限制的。分片的最大數量完全取決于你的實際狀況:硬件的配置、文檔的大小和復雜度、如何索引和查詢你的文檔,以及你期望的響應時間。
從分片只是主分片的一個副本,它用于提供數據的冗余副本,在硬件故障時提供數據保護,同時服務于搜索和檢索這種只讀請求。
索引中的主分片的數量在索引創建后就固定下來了,但是從分片的數量可以隨時改變。
接下來,我們在空的單節點集群中上創建一個叫做 blogs 的索引。一個索引默認設置了5個主分片,但是為了演示,我們這里只設置3個主分片和一組從分片(每個主分片有一個從分片對應):
PUT /blogs
~~~
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
~~~
現在,我們的集群看起來就像下圖所示了有索引的單節點集群,這三個主分片都被分配在 Node 1。
有索引的單節點集群
如果我們現在查看 集群健康(cluster-health) ,我們將得到如下信息:
~~~
{
"cluster_name": "elasticsearch",
"status": "yellow", <1>
"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 <2>
}
~~~
集群的 status 為 yellow.
我們的三個從分片還沒有被分配到節點上。
集群的健康狀況 yellow 意味著所有的 主分片(primary shards) 啟動并且運行了,這時集群已經可以成功的處理任意請求,但是 從分片(replica shards) 沒有完全被激活。事實上,當前這三個從分片都處于 unassigned(未分配)的狀態,它們還未被分配到節點上。在同一個節點上保存相同的數據副本是沒有必要的,如果這個節點故障了,就等同于所有的數據副本也丟失了。
現在我們的集群已經可用了,但是依舊存在因硬件故障而導致數據丟失的風險。