轉載自:https://my.oschina.net/u/204498/blog/529960
一、
Elasticsearch的別名,就類似數據庫的視圖。
創建別名:
我們為索引my_index創建一個別名my_index_alias,這樣我們對my_index_alias的操作就像對my_index的操作一樣
POST /_aliases
{
"actions": [
{
"add": {
"index": "my_index",
"alias": "my_index_alias"
}
}
]
}
別名不僅僅可以關聯一個索引,它能聚合多個索引
我們為索引my_index_1 和 my_index_2 創建一個別名my_index_alias,這樣對my_index_alias的操作(僅限讀操作),會操作my_index_1和my_index_2,類似於聚合了my_index_1和my_index_2.我們是不能對my_index_alias進行寫操作,當有多個索引時alias,不能區分到底操作哪一個
POST /_aliases
{
"actions": [
{
"add": {
"index": "my_index_1",
"alias": "my_index_alias"
}
},
{
"add": {
"index": "my_index_2",
"alias": "my_index_alias"
}
}
]
}
GET /my_index_alias/_search
{
}
創建filtered的別名:
例如對於同一個index,我們給不同人看到不同的數據,
如my_index有個字段是team,team字段記錄了該數據是那個team的。team之間的數據是不可見的。
POST /_aliases
{
"actions": [
{
"add": {
"index": "my_index",
"alias": "my_index__teamA_alias",
"filter":{
"term":{
"team":"teamA"
}
}
}
},
{
"add": {
"index": "my_index",
"alias": "my_index__teamB_alias",
"filter":{
"term":{
"team":"teamB"
}
}
}
},
{
"add": {
"index": "my_index",
"alias": "my_index__team_alias"
}
}
]
}
GET /my_index__teamA_alias/_search 只能看到teamA的數據
GET /my_index__teamB_alias/_search 只能看到teamB的數據
GET /my_index__team_alias/_search 既能看到teamA的,也能看到teamB的數據
二、情景
情景1:用Logstash采集當前所有nginx的日志,放入ES,索引名叫nginx-YYYY.MM.DD
后來又增加了apache的日志,希望能放到同一個索引中,統一叫做web-YYYY.MM.DD
我們只要把logstash的配置更改下,然后重啟,這樣數據就會寫入到新的索引下,但是同一天的索引就會被寫入2個索引中,Kibana中就不好配置了。
解決方案:
1.今天是2015-11-13.我們為nginx-2015.11.13創建一個alias叫做web-2015.07.28,之前所有的nginx日志也這樣
2.kibana中把dashboard的配置索引名改為web-YYYY.MM.DD
3.將logstash里面的elasticsearch的配置改為web-YYYY.MM.DD,重啟
情景2:用Logstash采集當前所有nginx的日志,放入ES,索引名叫nginx-YYYY.MM.DD
某天2015-11-13希望按照月來建立索引,索引名改為nginx-YYYY.MM
注意:像情景1中,我們建立一個nginx-2015.11的alias執行本月的其他索引,是不行的。因為一個alias指向多個索引后,寫這個alias時,ES不可能知道寫入到那個真正的索引中。
解決方案1:
1.新建索引nginx-2015.11 以及它的nginx-2015.11.01,nginx-2015.11.02,...,nginx-2015.11.30等
2.等到了第二天,將logstash的配置改為nginx-YYYY.MM,重啟
3.如果索引只保留10天,在10天候的某天,將kibana的配置改為nginx-YYYY.MM
缺點:第二步和第三步需要手工,可以寫crontab定時任務
我們不希望用戶(Kibaba的使用者)感覺到任何變化,更不能讓使用者感覺到數據的丟失。