- routing参数是一个可选参数,默认使用文档的_id值,可以用在INDEX, UPDATE,GET, SEARCH, DELETE等各种操作中。
- 在写入(包括更新)时,用于计算文档所属分片,在查询(GET请求或指定了routing的查询)中用于限制查询范围,提高查询速度。
计算方法#
- ES通过这样一个公式保证使用相同routing的文档被分配到同一个分片上,当然在默认情况下使用_id作为routing起到将文档均匀分布到多个分片上防止数据倾斜的作用。
shardId = hash(_routing) % num_primary_shards
- 使用了routing参数可以让routing值相同的文档分配到同一个分片上,从而减少查询时需要查询的shard数,提高查询效率。但是使用该参数容易导致数据倾斜。
- 为此,ES还提供了一个index.routing_partition_size参数(仅当使用routing参数时可用),用于将routing相同的文档映射到集群分片的一个子集上,这样一方面可以减少查询的分片数,另一方面又可以在一定程度上防止数据倾斜。
shard_num = (hash(_routing) + hash(_id) % routing_partition_size) % num_primary_shards
设置routing为必选#
- 使用routing写入的文档,在进行GET,UPDATE或DELETE操作时如果不指定routing参数会出现异常。
- 为此ES提供了一个索引mapping级别的设置,_routing.required,来强制用户在INDEX,GET,DELETE,UPDATA一个文档时必须使用routing参数。
- 当然查询时不受该参数的限制的。该参数的设置方式如下:
PUT my_index
{
"mappings": {
"_doc": {
"_routing": {
"required": true
}
}
}
}
结合别名#
- routing和别名结合,可以对使用者屏蔽读写时使用routing的细节,降低误操作的风险,提高操作的效率。
POST /_aliases
{
"actions" : [
{
"add" : {
"index" : "test",
"alias" : "alias1",
"routing" : "1"
}
}
]
}