一个大的用户edit

大规模流行论坛都是从小论坛起步的。 有一天我们会发现共享索引中的一个分片要比其它分片更加繁忙,因为这个分片中的一个论坛的文档变得更加热门。 这时,那个论坛需要属于它自己的独立的索引。

我们用来提供一个用户一个索引的索引别名给了我们一个简洁的迁移论坛的方式。

第一步就是为那个论坛创建一个新的专用的索引,并为其分配合理的分片数,可以满足一定预期的数据增长:

PUT /baking_v1
{
  "settings": {
    "number_of_shards": 3
  }
}

第二步就是将共享索引中的数据迁移到专用的索引中,可以通过scroll查询和bulk API来实现。 当迁移完成时,可以更新索引别名指向那个新的索引:

POST /_aliases
{
  "actions": [
    { "remove": { "alias": "baking", "index": "forums"    }},
    { "add":    { "alias": "baking", "index": "baking_v1" }}
  ]
}

更新索引别名的操作是原子性的;就像在拨动一个开关。你的应用程序还是在与 baking API 交互并且对于它已经指向一个专用的索引毫无感知。

专用的索引不再需要过滤器或者自定义的路由了。我们可以依赖于 Elasticsearch 默认使用的文档的 _id 字段来做分区。

最后一步是从共享索引中删除旧的文档,可以使用之前的路由和论坛ID来搜索,然后进行批量(bulk)删除来实现。

一个用户一个索引(index-per-user)模型的优雅之处在于它允许你减少资源消耗,保持低成本,同时给了你在需要时不停机、灵活扩容的能力。