elasticsearch 5.x 系列之七 基于索引别名的零停机升级服务
一,写在前面的话,elasticsearch 建立索引时的Mapping 设置
建议你在设计索引的初期,就把索引的各个字段设计好,因为,elasticsearch 的各个字段,定义好类型后,就无法进行修改了。
另外需要注意的点有如下
注意1:不要在一个索引中定义多个type。
6.X版本已经不支持,7.X版本彻底不支持。
扩展问题:5.X版本的父子文档实际实现中是一个索引中定义了多个type,到了6.X中实现方式改变为:join方式。
注意2:将Set _source设置为false。
假设你只关心度量结果,不是原始文件内容。
将节省磁盘空间并减少IO。
比如,你可以把原始的数据存储在mysql ,hbase 等其他地方,从es 中得到id 后,去相应的数据库中进行取数据
举例:
“_source”:{
“enabled”:false
},
注意3:将_all设置为false。
假设你确切地知道你对哪个field做查询操作?
能实现性能提升,缩减存储。
举例:
“_all”:{
“enabled”:false },
注意4:设置dynamic = strict。
假设你的数据是结构化数据。
字段设置严格,避免脏数据注入。
举例:
“dynamic”:”strict”,
注意5:使用keyword类型
假设你只关心完全匹配
提高性能和缩小磁盘存储空间
举例:
“CLF_CustomerID”:{
“type”:”keyword”
},
注意6:使用别名
二,elasticsearch 别名处理
首先看一下索引别名的建立和删除
1,建立索引别名(如下显示的是建立test1 的索引别名 alias1)
curl -X POST "localhost:9200/_aliases" -H 'Content-Type: application/json' -d'
{
"actions" : [
{ "add" : { "index" : "test1", "alias" : "alias1" } }
]
}
'
2,删除索引的别名(如下显示的是删除test1 的索引别名 alias1)
curl -X POST "localhost:9200/_aliases" -H 'Content-Type: application/json' -d'
{
"actions" : [
{ "remove" : { "index" : "test1", "alias" : "alias1" } }
]
}
'
3, 索引和索引别名之间的关系是多对多的关系
也就是说1个索引别名可以对应多个索引,一个索引可以有多个索引别名。
三,elasticsearch 别名的使用,实战运用
1,举例子。
首先,
举例,比如你有一个索引,名字叫做zebra_info_data,那么建议你线上的产品,利用别名机制机制,然后,搜索的时候,你就可以用别名进行搜索了
curl -X PUT "master:9200/zebra_info_data/_alias/zebra_info_data_alias"
搜索的时候,你就可以使用别名搜索了,类似如下:
curl -XGET "master:9200/zebra_info_alias/_search?pretty"
2,另外的例子
1, 建立索引test
2, 建立索引test_2
3, 给索引test_2 添加别名 test, 并且删除 test 索引,Ok, 现在数据搜索由test 到test_2
curl -X PUT "localhost:9200/test"
curl -X PUT "localhost:9200/test_2"
curl -X POST "localhost:9200/_aliases" -H 'Content-Type: application/json' -d'
{
"actions" : [
{ "add": { "index": "test_2", "alias": "test" } },
{ "remove_index": { "index": "test" } }
]
}
'
3,另外的例子。
下面的例子,显示了用索引别名进行搜索的优势, 这样就可以不影响线上的服务,而在后台偷偷做手脚了
curl -X POST "localhost:9200/_aliases" -H 'Content-Type: application/json' -d'
{
"actions": [
{ "remove": { "index": "my_index_v1", "alias": "my_index" }},
{ "add": { "index": "my_index_v2", "alias": "my_index" }}
]
}
'
4, 其他,比如查看,以及删除。
删除logs_20162801指向的别名 current_day
curl -X DELETE "localhost:9200/logs_20162801/_alias/current_day"
删除所有指向current_day 的索引引用
curl -X DELETE "localhost:9200/*/_alias/current_day"
查看所有指向logs_20162801 的别名
GET /logs_20162801/_alias/*
查看zebra_geo_poi 这个别名指向的所有别名。
curl -XGET 'http://172.16.232.242:9200/_alias/zebra_geo_poi?pretty'
四,写在后面的话。
建议在设计index 的初期,就把索引建立好,后期就不用进行修改了。应为这里的零停机升级服务,或者说重新索引的的数据,是花费巨大的资源为代价的。
另外,附上官网中的别名api 一份,不要太感谢本小生了。
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-aliases.html