背景
项目中使用的老的索引,由于数据冗余,会想影响性能。因此需要重新建立索引,但是这样必然需要更新服务中的索引名称,然后重新启动服务,可能会对服务的使用者产生一定的影响。因此,调研了Elasticsearch的索引别名,来解决这个问题。
简介
索引别名就像一个快捷方式或软连接,可以指向一个或多个索引,也可以给任何一个需要索引名的API来使用。别名 带给我们极大的灵活性,我们可以使用索引别名实现以下功能:
- 在运行的集群中可以无缝的从一个索引切换到另一个索引
- 给多个索引分组 (例如, last_three_months)
- 给索引的一个子集创建视图
索引别名的使用
目前,有两种管理别名的方式,_alias 用于单个操作, _aliases 用于执行多个原子级操作
创建别名的步骤如下:
1、 首先我们创建一个索引my_index_v1
PUT /my_index_v1
2、然后设置索引别名 my_index 指向 my_index_v1
PUT /my_index_v1/_alias/my_index
现在,我们可以通过以下命令行检测my_index别名指向了哪一个索引
GET /*/_alias/my_index
也可以通过下面的命令行查询哪些别名指向了my_index_v1索引
GET /my_index_v1/_alias/*
现在,加入我们在时使用中发现了一些问题,需要优化my_index_v1索引,比如修改mapping,此时,我们必须重新索引数据,设置mapping。首先,我们还是和上面一样,新建了一个新的索引my_index_v2。
此时,我们就可以使用索引别名,将别名my_index指向my_index_v2,同时,我们还需要将my_index_v1的别名移除。这个操作需要原子化,这意味这我们需要使用_aliases操作,具体命令如下
POST /_aliases
{
"actions": [
{ "remove": { "index": "my_index_v1", "alias": "my_index" }},
{ "add": { "index": "my_index_v2", "alias": "my_index" }}
]
}
此时,我们的应用在没有重新启动的情况下,从旧的索引移到了新的索引,对用户来说是完全无感知的,非常友好。