背景
項目中使用的老的索引,由於數據冗余,會想影響性能。因此需要重新建立索引,但是這樣必然需要更新服務中的索引名稱,然后重新啟動服務,可能會對服務的使用者產生一定的影響。因此,調研了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" }}
]
}
此時,我們的應用在沒有重新啟動的情況下,從舊的索引移到了新的索引,對用戶來說是完全無感知的,非常友好。
