我的索引目前有5个分片都有数据。假设我想暂时阻止特定分片中的更多数据。有没有办法做到这一点?
答案 0 :(得分:1)
我不知道,您是否可以直接指定要存储的数据的某些分片。但是,在开始时,您可以指定_routing值,这些值将决定您的数据将存储到哪个分片。通过此,您可以间接管理elasticsearch以将数据存储在特定分片中。例如,请考虑以下映射:
{
"comment" : {
"_routing" : {
"required" : true,
"path" : "blog.post_id"
}
}
}
上面的代码将获取提供给它的_routing路径的哈希值,并且根据哈希值,它将选择它将存储到的分片。因此,最终,特定帖子的所有评论都将存储在同一个分片中。
人们选择自定义路由超过正常路由的原因,即通常我们希望或数据存储在特定分片中的原因是为了提高搜索查询的性能。您可以指定分片将执行搜索的路由值。
我不确定您为什么只想将数据存储在某些分片中。
Here是一个很好的博客,它解释了为什么您希望将数据存储在特定分片中,以及自定义路由如何帮助您实现这一目标。
答案 1 :(得分:0)
这是一个古老的问题,但今天仍然非常重要,当我遇到类似的情况时,我不得不将文档分配给特定的分片,而不是随机的或主要的。
您可以通过Elasticsearch的{{1}}字段通过使用Elasticsearch给定的formula计算一个分片号来实现此目的:
_routing
比方说,您不希望将文档分配给第2个分片,并且当从其哈希和分片编号中获取模数时,如果分片编号不是2,则必须提供路由名称。为此,您必须找到一个路由名称,以在代码中进行解释,我将在Java中给出一个示例,以查找具有特定路由名称的分片号:
shard_num = hash(_routing) % num_primary_shards
输出:
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
和30的模数是25,这是一个分片数。在这种情况下,您确实要担心,因为索引文档不会位于分片号2中。
作为一个完整的例子,我想展示一个带有路由名称的索引:
假设我们创建“ 课程”索引并设置所需的路由:
routingName11
然后您为这样的文档编制索引:
PUT http://localhost:9200/course
{
"settings": {
"number_of_shards": 30
},
"mappings": {
"_routing": {
"required": true
}
}
}
在我们的案例中,我们有一个多租户软件,其中约100个租户(组织)在Elasticsearch中共享相同的索引,并且我们必须确保数据安全性,使一个租户永远不会看到其他租户的数据。我们提出的解决方案是为所有具有100个分片的租户创建索引,并通过为每个租户查找路由名称为每个租户分配一个分片。如您在上面的索引映射示例中看到的那样,路由设置为“ required”,并且每当您将CRUD操作发送到Elasticsearch时,都必须定义一个路由,否则Elasticsearch会抛出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
}