当你index一个document的时候,这个document被存储在一个单独的primary
shard上。ES是怎么知道一个document所属的shard的呢?当我们创建了一个新的document,ES是怎么知道这个document是应该存储在shard1上还是shard2上的呢?
这个进程不能是随机的,因为在将来的某个时候我们要检索这个document,事实上,这个存储是有一个简单的公式决定的:
shard = hash(routing) % number_of_primary_shards
这个routing的值任意的字符串,默认是document的_id,也能是一个用户设置的值,这个routing字符串通过一个hash函数生成一个数字,这个数字除以index中的primary
shard的数量,然后返回余数。这个余数是在0到number_of_primary_shards -
1这个范围之间的。告诉我们存储指定的document的shard的号码。
这个也解释了为什么primary shard只能在index创建的时候指定,而不能随意改变:如果primary
shard的数量有变化,以前所有的routing值都会失效,document将会再也找不到。
所有操作document的APIS(get,index,delete,bulk,update和mget)都有一个routing参数,这个参数可以定制document到shard的映射。一个定制的routing可以保证所有的document都被引用,例如,可以定制所有的document属于同一个user,并且存储在同一个shard。我们将会在Big
data - Designing for scale (TODO)讨论你为什么会这么做。
原文:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/routing-value.html