0%

分布式系统实例之 elasticsearch reindex 和别名

概述

ES中可以为索引添加别名,一个别名可以指向到多个索引中,同时在添加别名时可以设置筛选条件,指向一个索引的部分数据,实现在关系数据库汇总的视图功能,这就是ES中别名的强大之处。别名是一个非常实用的功能,为我们使用索引提供了极大的灵活性,许多ES的API都支持用别名来代替真实索引名。通过索引我们可以方便的进行以下操作:

  • 实现正在运行的集群上的一个索引到另一个索引之间的无缝切换。试想一下这种藏进,由于业务变换,我们需要将业务数据有索引1变换到新的索引2上,如果没有别名,我们必须修改和总段业务系统,但是有了别名,只需要修改别名,另起指向新的索引2即可,这样的操作可以在用户无任何感知的情况下完成。
  • 使数据检索等炒作更加方便。加入有两个月的日志数据,分别存放在index_202008和index_202009两个索引中,没有使用别名进行检索时,我们需要同时写上两个索引名称进行检索,使用索引后,我们可以令别名同时指向这两个索引,检索时只需要使用这个别名就可以同时在两个索引中尽心检索。
  • 为一个索引中的部分数据创建别名,例如,一个索引中存放了一整年的数据,现在新增一个业务场景,更多的是对其中某一个月的数据进行检索,这时,我们可以在创建别名时,通过设置过滤条件filter,可以单独令别名指向一个月的数据,使得检索更加高效。

通过上面的场景我们可以看出,ES中别名可以指向一个索引,也可以同时指向多个索引,甚至可以通过配合过滤器filter指向索引中部分数据。别名可以再创建索引时添加,也可以在索引创建后进行添加,ES中提供丰富的API对别名进行管理。接下来,我们捋一捋ES中对别名的操作。

创建别名

创建别名有很多种方法,可以创建索引同时创建别名,也可以在创建索引后创建,既可以让别名指向多个索引,也可以让别名指向一个索引的部分数据,甚至指向一个字段。我们来一一例举这是如何操作的。

(1)创建索引同时创建别名

创建一个名为users用户索引,索引中记录了用户出生年,现在,我们在创建索引的同时,创建两个别名,一个别名指向整个users索引,并通过filter进行过滤,使别名只指向2000年出生的用户。

2)创建索引后创建别名

直接通过API路由传递别名来创建,这种方法有一下几种请求方式,注意,这种方式要求索引必须存在。

1
2
3
4
5
6
7
8
9
PUT /<index>/_alias/<alias>

PUT /my_single_26/_alias/my_alias_test

POST /<index>/_alias/<alias>

PUT /<index>/_aliases/<alias>

POST /<index>/_aliases/<alias>