Elasticsearch-Alias别名的2个核心场景
了解Elasticsearch的Alias别名之后,可以在业务上很方便的实现复杂需求,快速解决问题,本文从3个方面介绍:官方定义、使用场景、使用方法。
一、官方定义
先看下官方对ES 的Alias
定义:
重点有2个:
- 别名是一组索引的辅助名称,一个别名可以指向多个索引,一个索引可以有多个别名。
- 使用别名后,在重建索引数据时,无需停机或更改程序代码。
别名
有种类似Nginx反向代理的感觉,当访问别名时,相当于访问的实际索引的代理
。
二、使用场景
1、一组索引使用同一个别名
比如:存储大量日志数据的场景,或者 存储几亿订单数据的场景。
由于ES索引的单个分片建议大小为30G左右,同时ES的分片数量也不要太大,建议1~5之间。所以,势必要建立多个索引去存储大量数据。比如 按日、按月、按季度、按年 存储等。
此时如果要从这些索引里去查询数据,在不使用Alias
的情况下,肯定要在业务代码里写上一堆复杂的逻辑,然后是兼容各种场景和异常,即使感觉做的比较完善了,可能上线后还有未知的问题。
使用Alias
后,业务代码无需改动,只需要给相关索引建立同样的别名,然后利用Alias
查询,ES会自动将相关的索引数据都查出来。
order_202301(索引名称) => order_alias(别名)
order_202302(索引名称) => order_alias(别名)
order_202303(索引名称) => order_alias(别名)
......
2、一组索引里的部分索引使用同一个别名
比如:数据太大,只需要查询近半年的数据,则使用别名指向近半年的索引即可,业务层依然无需修改代码。滚动更新别名指向的索引。
3、无缝的切换一个索引到另一个索引
比如:正在使用的索引A
存在部分异常数据,此时可以重新构建索引B
,然后将Alias
指向索引B
,这样可以无缝切换索引,并且业务层无感知。
4、查询一个索引里面的部分数据构成视图
针对某个索引,有些场景需要固化视图时,就可以设置别名来实现,这样调用方使用起来很方便,无需加入重复的查询条件。比如有个 订单索引
,多处需要查询 30天内已支付订单,此时可以利用Alias
构建出这样的视图。
5、重建索引
在ES中无法对索引的现有字段做改动,一般的做法是创建新的索引,然后把文档从旧的索引复制到新的索引里。针对这种情况,别名的使用优势就体现出来了,索引别名可以实现旧索引到新索引的平滑迁移。
三、使用方法
1、创建别名
POST _aliases
{
"actions": [
{
"add": {
"index": "order_202301",
"alias": "order_alias"
}
},
{
"add": {
"index": "order_202302",
"alias": "order_alias"
}
}
]
}
2、移除别名
POST _aliases
{
"actions": [
{
"remove": {
"index": "order_202301",
"alias": "order_alias"
}
}
]
}
3、切换别名
POST _aliases
{
"actions": [
{
"remove": {
"index": "order_202301",
"alias": "order_alias"
}
},
{
"add": {
"index": "order_202303",
"alias": "order_alias"
}
}
]
}
4、部分数据构建视图
POST /_aliases
{
"actions" : [
{
"add" : {
"index" : "order_202303",
"alias" : "order_alias",
"filter": {"term" : {"pay_state": 1}}
}
}
]
}
5、重建索引
- 不使用Alias的方案
在不使用Alias
重建索引时,一般是如下5步:
# 1、将index_A拷贝到备份index_A_bak
POST _reindex
{
"source": {
"index": "index_A"
},
"dest": {
"index": "index_A_bak"
}
}
# 2、删除index_A
DELETE index_A
# 3、创建新的 index_A,此处省去创建新的index_A的过程
# 4、将备份index_A_bak拷贝到新的index_A
POST _reindex
{
"source": {
"index": "index_A_bak"
},
"dest": {
"index": "新的index_A"
}
}
# 5、删除备份index_A_bak
DELETE index_A_bak
以上的方案无法实现无缝切换,因为在删除旧的index-A之后,新的index-A还没创建,而且数据还没拷贝完毕。
基于这种方案要想无缝切换,那只能是先创建index-B,通过reindex将index-A的数据拷贝到index-B,然后业务代码改成访问index-B。
- 使用Alias的方案
使用Alias的方案就很轻松了,无需改动代码即可实现无缝切换。后续切换索引只需要操作3、4、5步即可。
# 1、给index_A添加别名
POST /_aliases
{
"actions": [
{
"add": {
"index": "index_A",
"alias": "index_alias"
}
}
]
}
# 2、业务层的代码改成使用别名操作索引
# 3、将index_A数据拷贝到index_B
POST _reindex
{
"source": {
"index": "index_A"
},
"dest": {
"index": "index_B"
}
}
# 4、别名切换
POST /_aliases
{
"actions": [
{
"add": {
"index": "index_A",
"alias": "index_alias"
},
"remove": {
"index": "index_B",
"alias": "index_alias"
}
}
]
}
# 5、删除索引index_A
DELETE index_A
四、总结
本文主要讲了Elasticsearch别名的使用场景,主要就2点:
- 使用别名代替一组索引,让业务开发变得更简单。
- 重建索引数据时,无需停机或更改程序代码。
本篇完结!感谢你的阅读,欢迎点赞 关注 收藏 私信!!!