技术主题
es的大数据迁移,冷热分离,其中一步很重要的操作就是别名切换,本博客重点探索下别名的使用
技术背景
数据的冷热分离,定时将数据进行迁移,保证了当前的集群数据性能好
技术原理
一:Es的别名不停服切换索引,线上发布
如果使用Es索引库,没有使用Es索引库别名
1、如果由于字段更新,线上的数据重新写入了v1库,现在如何在不断服的情况下,完美的实现从v到v1的切换
2、后续如果重新建索引v2,如何从v1切换到v2
二:为什么使用Es索引库别名
Es为我们提供了别名的概念aliases,也就是我们在生成一个索引的时候,比如叫chat_index_v1,我们是可以做一个别名chat_alias_index指向它。
1、当我们在查询chat_alias_index的时间时,实际上查询是chat_index_v1这个索引的数据
2、业务系统去查询直接使用chat_index_v1去做查询,当后台字段发生变化时,或者字段类型发生变化时,可以再新写一个新的chat_index_v2
3、把chat_index_v1的数据导入到chat_index_v2中
4、最后删除chat_alias_index对于chat_index_v1的指向,重新指向到chat_index_v2
三:实战-如何从没别名从v库迁移到v1库
3.1新建v1索引库
新建v1库,把线上数据全部写入到v1库,这个是同步的,写完后比如现在是8点,数据写完上线后发现已经过了四个小时,这期间v1的数据是没变化的,如果线上数据有变化,过程中的增量数据也要同步到v1
构建v1的mapping结构,构建索引库v1
PUT /my_v1
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2,
"analysis": {
"analyzer": {
"ik": {
"tokenizer": "ik_max_word"
}
}
}
},
"mappings": {
"_doc": {
"dynamic": "strict",
"_all": {
"enabled": false
},
"properties": {
"_class": {
"type": "keyword"
},
"addTime": {
"type": "integer"
},
"userid": {
"type": "keyword"
}
}
}
3.2给v1索引库新建别名
v1新建索引别名alias_xx,这时候别名指向了v1的索引库
#创建别名,允许通过别名 my_index_name_alias 写入es数据
POST /_aliases
{
"actions": [
{
"add": { //设置 v1为索引库 创建别名 my_index_name_alias 的数据写入转发对象
"index": "my_v1",
"alias": "my_index_name_alias",
"is_write_index":true
}
}
]
}
# 检查 别名指向哪个索引库
GET /*/_alias/my_index_name_alias
3.3dev开发分支,使用v1库的别名进行增删改查操作es索引库
1、此刻dev的分支可以发布测试
2、测试环境能正常写入操作就行
3、发布线上
3.4修改别名指向
Es解除索引别名引向
把旧的别名删除,然后添加别名指向新的库
#删除原名字,设置新名字
POST _aliases
{
"actions": [
{
"remove": {
"index": "my_v1",
"alias": "my_index_name_alias"
}
},
{
"add": {
"index": "my_v2_xx",
"alias": "my_index_name_alias"
}
}
]
}
检查当前索引指向
# 检查 别名指向哪个索引库
GET /*/_alias/my_index_name_alias