簡體   English   中英

ElasticSearch:如何禁用特定分片上的分配?

[英]ElasticSearch: How to disable allocation on a specific shard?

我的索引目前有 5 個分片,所有分片都有數據。 假設我想暫時阻止特定分片中的更多數據。 有沒有辦法做到這一點?

我不知道,您是否可以直接指定要存儲數據的某些分片。 但是,在開始時,您可以指定_routing值,這將決定您的數據將存儲到哪個分片中 通過這種方式,您可以間接管理 elasticsearch 以將您的數據存儲在特定分片中。 例如,考慮這個映射:

{
"comment" : {
    "_routing" : {
        "required" : true,
        "path" : "blog.post_id"
    }
}

}

上面的代碼將獲取提供給它的 _routing 路徑的哈希值,並根據哈希值選擇將要存儲到的分片。 因此,最終,特定帖子的所有評論都將存儲在同一個分片中。

人們選擇自定義路由而不是普通路由的原因,即通常我們希望將數據存儲在特定分片中的原因是為了提高搜索查詢的性能。 您可以指定分片將執行搜索的路由值。

我不確定您為什么希望您的數據僅存儲在某些分片中。

是一個很好的博客,解釋了為什么要將數據存儲在特定分片中,以及自定義路由將如何幫助您實現這一目標。

這是一個老問題,但它今天仍然非常重要,當我遇到類似的情況時,我必須將文檔分配到特定的分片,而不是隨機或主要分片,因此我來到了這篇文章。

您可以通過 Elasticsearch 的_routing字段通過使用 Elasticsearch 給定的公式計算分片數來實現這一點:

shard_num = hash(_routing) % num_primary_shards

假設您不想將文檔分配給分片編號 2,並且當分片編號不是 2 時,當模數取自其散列和分片編號時,您必須提供路由名稱。 為此,您必須找到一個路由名稱,在代碼中進行解釋,我將在 Java 中給出一個示例,以查找具有特定路由名稱的分片號:

String routing = "routingName11";
final int numberOfShard = 30;
final int shard = routing.hashCode() % numberOfShard;
System.out.println("Routing: " + routing + " - shard number: " + shard);

輸出:

Routing: routingName11 - shard number: -25

您必須確保您在索引中提供的路由名稱不會導致生成該特定分片編號。 如上所述, routingName11和 30 的模數是 25,這是一個分片數。 在這種情況下,您必須擔心,因為索引文檔不會存在於分片號 2 中。

作為一個完整的例子,我想用一個路由名稱來演示索引:

假設我們創建“ course ”索引並設置所需的路由:

PUT http://localhost:9200/course
{
    "settings": {
        "number_of_shards": 30
    },
    "mappings": {
        "_routing": {
           "required": true 
        }
    }
}

然后你像這樣索引一個文檔:

PUT http://localhost:9200/course_index/_doc/1?routing=tenant0&refresh=true
{
    "id": 1,
    "title": "Data Security course in Lidl",
    "description": "The course teaches our core Data Security measurements here in Lidle. As new regulations are out, ....",
    "text": "Text of the couse goes here",
    "created_date": 152625632,
    "last_date": 152625632,
    "expiration_date": null,
    "domain_id": 10,
    "language_id": 2
}

在我們的例子中,我們有一個多租戶軟件,其中大約 100 個租戶(組織)在 Elasticsearch 中共享相同的索引,我們必須確保數據安全,一個租戶永遠無法看到其他租戶的數據。 我們使用 100 個分片為所有租戶創建索引並通過為每個租戶查找路由名稱為每個租戶專用一個分片的解決方案。 正如您在上面的索引映射示例中看到的,路由設置為“required”,每當您向 Elasticsearch 發送 CRUD 操作時,您必須定義一個路由,否則 Elasticsearch 將拋出routing_missing_exception

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM