12. elasticsearch 别名

本文介绍了如何使用Elasticsearch的索引别名功能来优雅地解决索引切换和扩展性问题。在电商场景中,通过在旧索引和新索引之间切换别名,可以实现数据更新时的无感过渡,同时提供回滚保障。别名还支持分组多个索引、构建视图等功能,提高了系统的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Elasticsearch的mapping一旦创建,只能增加字段,而不能修改已经存在mapping的字段。在elasticsearch里面给index起一个aliases(别名)能非常优雅的解决两个索引无缝切换的问题,这个功能在某些场景下非常使用。

比如电商的核心商品索引库,除了实时增量数据外,每天都要重建一遍索引,避免index里面的数据和db里面的数据不一致,因为index分shard了,所以要一个一个的shard做全量替换,直到所有的shard替换完毕,才能宣布重建成功。整个过程其实还是风险挺大的,虽然每次只替换一个shard把风险量降到最低,但如果第3个或第4个shard重建有问题,有可能要回滚整个索引,这个问题其实用索引别名的问题就能比较优雅的解决。

旧索引称为a,新索引称为b,他们拥有共同的别名c,而dao层查询的索引名也是c,当新的全量索引b重建完成之后,只需要解除旧索引a与别名c关系,然后添加新索引b与别名c的关系,就能完成无缝切换,中间对用户是无感知的,如果b有问题,那么随时都可以重新解除b的关系并恢复a,这就完成了所谓的回滚操作,非常简单优雅。

在es里面index aliases就像是软连接一样,它可以映射一个或多个索引,提供了非常灵活的特性,使用它我们可以做到:

(1)在一个运行中的es集群中无缝的切换一个索引到另一个索引上

(2)分组多个索引,比如按月创建的索引,我们可以通过别名构造出一个最近3个月的索引

(3)查询一个索引里面的部分数据构成一个类似数据库的视图(views)

1.给索引添加别名

PUT /my_index_v1   //构建索引

PUT /my_index_v1/_alias/my_index   //给索引添加别名

2. 查询关系

GET /*/_alias/my_index  //查某个别名映射的所有index

GET /my_index_v1/_alias/* //查询某个index拥有的别名

返回:

{
    "my_index_v1" : {
        "aliases" : {
            "my_index" : { }
        }
    }
}

3.切换索引

现在我们构建new index:

PUT /my_index_v2   //构建索引

新索引构建完毕之后,我们就可以执行切换操作命令了:

POST /_aliases
{
    "actions": [
        { "remove": { "index": "my_index_v1", "alias": "my_index" }},
        { "add":    { "index": "my_index_v2", "alias": "my_index" }}
    ]
}

上面的操作是顺序的执行的,先接触old index的别名,然后给new index 添加新的别名,这样以来 索引就透明的别切换了,用户不会感觉任何变化,而且也不需要停机操作。

建议多使用别名,可以增加程序的扩展性。

`co.elastic.clients.elasticsearch.indices.UpdateAliasesRequest` 是 Elasticsearch 客户端 Java API 中的一个类,用于构建和执行更新别名的请求。 在 Elasticsearch 中,别名是索引的可选名称,用于更方便地访问索引。当索引的名称发生变化或需要将索引更改为只读模式时,可以使用别名进行操作,而不会影响到应用程序的正常运行。 `co.elastic.clients.elasticsearch.indices.UpdateAliasesRequest` 类的主要作用是构建更新别名的请求,并将其发送到 Elasticsearch 集群。该类提供了多个方法,可以设置要更新的别名、索引名称、别名操作类型等。以下是一个示例代码: ```java UpdateAliasesRequest request = new UpdateAliasesRequest() .addAlias(new Alias("alias_name").filter(QueryBuilders.termQuery("field_name", "field_value"))) .removeAlias("old_alias_name") .addAliasAction(new AddAliasAction.Builder("new_alias_name").index("new_index_name").build()) .removeAliasAction(new RemoveAliasAction.Builder("old_alias_name").index("old_index_name").build()); ElasticsearchClient client = ...; // 创建 Elasticsearch 客户端 UpdateAliasesResponse response = client.indices().updateAliases(request, RequestOptions.DEFAULT); ``` 在该示例中,首先创建了一个 `UpdateAliasesRequest` 实例,并使用 `addAlias` 方法添加了一个新的别名,并使用 `filter` 方法为该别名设置了一个查询条件。接着使用 `removeAlias` 方法删除了一个旧的别名,并使用 `addAliasAction` 方法添加了一个新的别名操作,使用 `removeAliasAction` 方法删除了一个旧的别名操作。最后,调用 Elasticsearch 客户端的 `updateAliases` 方法将更新别名的请求发送到 Elasticsearch 集群,并将返回的响应结果存储在 `UpdateAliasesResponse` 实例中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值