當索引一個文檔的時候,文檔會被存儲到一個主分片中。 Elasticsearch 如何知道一個文檔應該存放到哪個分片中呢?當我們創建文檔時,它如何決定這個文檔應當被存儲在分片 1
還是分片 2
中呢?
首先這肯定不會是隨機的,否則將來要獲取文檔的時候我們就不知道從何處尋找了。實際上,這個過程是根據下面這個公式決定的:
shard = hash(routing) % number_of_primary_shards
routing
是一個可變值,默認是文檔的 _id
,也可以設置成一個自定義的值。 routing
通過 hash 函數生成一個數字,然後這個數字再除以 number_of_primary_shards
(主分片的數量)後得到 餘數 。這個分佈在 0
到 number_of_primary_shards-1
之間的餘數,就是我們所尋求的文檔所在分片的位置。
這就解釋了爲什麼我們要在創建索引的時候就確定好主分片的數量 並且永遠不會改變這個數量:因爲如果數量變化了,那麼所有之前路由的值都會無效,文檔也再也找不到了。
參考:https://www.elastic.co/guide/cn/elasticsearch/guide/current/routing-value.html