Elasticsearch 路由和分片

路由文档到分片

  • 当你索引一个文档,它被存储在单独一个主分片上。Elasticsearch是如何知道文档属于哪个分片的呢?当你创建一个新文档,它是如何知道是应该存储在分片1还是分片2上的呢?
  • 进程不能是随机的,因为我们将来要检索文档。事实上,它根据一个简单的算法决定:
    shard = hash(routing) % number_of_primary_shards
    
  • routing值是一个任意字符串,它默认是_id但也可以自定义。这个routing字符串通过哈希函数生成一个数字,然后除以主切片的数量得到一个余数(remainder) ,余数的范围永远是0number_of_primary_shards - 1,这个数字就是特定文档所在的分片。
  • 这也解释了为什么主分片的数量只能在创建索引时定义且不能修改:如果主分片的数量在未来改变了,所有先前的路由值就失效了,文档也就永远找不到了。
  • 有时用户认为固定数量的主分片会让之后的扩展变得很困难。现实中,有些技术会在你需要的时候让扩展变得容易。

  • 所有的文档API(getindexdeletebulkupdatemget)都接收一个routing参数,它用来自定义文档到分片的映射。自定义路由值可以确保所有相关文档——例如属于同一个人的文档——被保存在同一分片上。

主分片和复制分片如何交互

  • 为了阐述意图,我们假设有三个节点的集群。它包含一个叫做bblogs的索引并拥有两个主分片。每个主分片有两个复制分片。相同的分片不会放在同一个节点上,所以我们的集群是这样的: 有三个节点一个索引的集群有三个节点一个索引的集群
  • 我们能够发送请求给集群中任意一个节点。每个节点都有能力处理任意请求。每个节点都知道任意文档所在的节点,所以也可以将请求转发到需要的节点。下面的例子中,我们将发送所有请求给Node 1,这个节点我们将会称之为请求节点(requesting node)

提示:

当我们发送请求,最好的做法是循环通过所有节点请求,这样可以平衡负载。