首页 > 编程笔记 > 通用技能 阅读:2

Elasticsearch(es)索引别名的用法(非常详细)

别名是为索引提供的替代名称,适用于各种场景,如从多个索引(作为单个别名)搜索或聚合数据,或者在重新索引期间实现零停机时间。一旦我们创建了别名,就可以像使用索引一样,将其用于索引、查询和所有其他目的。

别名在开发和生产环境中都非常实用。我们还可以将多个索引分组并分配一个别名,这样就可以对单个别名而不是对多个索引来编写查询。

要创建一个索引,可以在 aliases 对象中设置别名信息,示例代码如下:
PUT cars_for_aliases   ←---  创建一个带有别名的索引
{
  "aliases": {
    "my_new_cars_alias": {}   ←---  将别名指向该索引
  }
}

不过,除了使用索引 API,还有一种创建别名的方法——使用别名 API。例如,创建一个名为 my_cars_alias 的别名,指向 cars_for_aliases 索引:
PUT cars_for_aliases/_alias/my_cars_alias
如下图所示,my_cars_alias 是 cars_for_aliases 索引的替代(第二)名称。到目前为止,在该索引上进行的所有查询操作都可以重定向到别名 my_cars_alias。例如,我们可以在该别名上索引文档或进行搜索。


图 1 为现有索引创建别名

我们还可以创建单个别名来指向多个索引(见下图),包括使用通配符提供的索引:


图 2 创建指向多个索引的别名

下面的示例代码展示了创建别名 multi_cars_alias 的代码。该别名依次指向多个索引(cars1、cars2、cars3)。注意,其中一个索引必须是写入索引。
PUT cars1,cars2,cars3/_alias/multi_cars_alias  ←---  逗号分隔的索引列表

当创建指向多个索引的别名时,必须确保其中一个索引的 is_write_index 属性设置为 true。例如,以下代码片段在 cars3 索引上启用了 is_write_index:
PUT cars3/_alias/multi_cars_alias
{
  "is_write_index": true
}

类似地,我们可以使用通配符创建一个指向多个索引的别名(必须确保其中一个索引的 is_write_index 属性设置为 true),示例代码如下:
PUT cars*/_alias/wildcard_cars_alias   ←---  所有以cars为前缀的索引
 
一旦创建了别名,获取索引(GET <index_name>)的详细信息将反映定义在该索引上的别名。GET cars 将返回该索引上创建的所有别名(以及所有映射和设置)。

现在我们已经了解了创建别名的方式,让我们看看如何获取别名的详细信息。与设置和映射类似,我们可以向 _alias 端点发送 GET 请求来获取别名的详细信息,示例代码如下:
GET my_cars_alias/_alias

当然,我们也可以将同样的命令扩展到多个别名,示例代码如下:
GET all_cars_alias,my_cars_alias/_alias

使用别名实现零停机时间迁移数据

在生产环境中,索引的配置可能需要使用新的属性进行更新,这可能是由新的业务需求或者技术改进(或修复 bug)而引起的。新的属性可能与索引中的现有数据不兼容,在这种情况下,可以创建一个具有新设置的索引,并将数据从旧索引迁移到全新的索引。

这听起来很好,但一个潜在的问题是,针对旧索引编写的查询(例如 GET cars/_search { .. })需要更新,因为它们现在需要在新索引cars_new上执行。如果这些查询被硬编码在应用代码中,可能需要进行一次生产环境的热修复发布。

假设我们有一个名为 vintage_cars 的索引,其中包含有关老式汽车的数据,我们需要更新该索引。这时我们可以借助别名,设计一个基于别名的策略。

执行以下步骤,就可以实现零停机时间迁移:
  1. 创建一个名为 vintage_cars_alias 的别名,指向当前的 vintage_cars 索引;
  2. 因为新的属性与现有索引不兼容,创建一个新索引 vintage_cars_new,并应用新的设置;
  3. 将数据从旧索引 vintage_cars 复制(即重新索引)到新索引 vintage_cars_new;
  4. 重新创建原先指向旧索引的别名 vintage_cars_alias,使其指向新索引。详细操作稍后介绍。因此,vintage_cars_alias 现在指向 vintage_cars_new;
  5. 所有原本针对 vintage_cars_alias 执行的查询现在都会在新索引上进行。
  6. 确认重新索引和发布正常运行后,删除旧索引 vintage_cars。


图 3 实现零停机时间迁移

现在,在别名上执行的查询将从新索引中获取数据,而无须重启应用程序。这样,就实现了数据的无缝迁移。

使用_aliases API执行多个别名操作

除了使用 _alias API 处理别名,还可以使用 _aliases API 处理多个别名操作。

_aliases API 可以组合多个动作,如添加和删除别名及删除索引。此外,我们还可以使用 _aliases API 的 indices 参数通过设置一个索引列表来为多个索引同时创建别名。

例如:
POST _aliases
{
  "actions": [
    {
      "add": {
        "indices": ["vintage_cars","power_cars","rare_cars","luxury_cars"],
        "alias": "high_end_cars_alias"
      }
    }
  ]
}
这里,actions 创建了一个名为 high_end_cars_alias 的别名,指向 4 个汽车索引(vintage_cars、power_cars、rare_cars 和 luxury_cars)。

相关文章