场景: 我们现在线上正在使用 ES索引库 V , 没有使用ES索引库别名
两个问题 :
ES 为我们提供了别名的概念 aliases,也就是我们在生成一个索引的时候,比如叫 my_index_v1,我们是可以做一个别名 my_name 指向它。
在这个过程中,应用系统在切换完成前查询的旧数据,切换后查询的是新数据,应用就可以做到不停机,完美切换
我们线上现在master 代码是使用的 master 代码, 而且线上库是没有 索引别名的
所以 线上是通过代码中写死索引库名 V 去实现ES的增删改查的
第一次从V 切换到 V1 如何操作?
新建V1库, 把线上数据 全部写入 V1库, 这个是同步的, 写完后 比如现在是 8:00, 这时候数据是V1
写完上线后, 已经是 12:00了, 这期间 V1的数据是没变化的
如果线上数据有变化, 需要增量同步下 你8:00-12:00 上线期间 过程中的增量数据 也要同步到 V1库
构建V1的 mappings 结构, 构建索引库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"
}
}
}
#创建别名,允许通过别名 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
这时 我们线上 全都使用了别名去操作ES库了, 代码中也都是通过别名去操作ES库 V1了, 别名通过 指向 V1 , 实际上操作的就是V1数据存储库
后续我们ES索引库 结构又变了变成V2的结构, 我们要如何从V1切换到V2
ES解除索引别名指向
把 my_index_name_alias 的指向 从 V1 ES索引库删除, 然后添加 别名指向 V2索引库
#删除原名字,设置新名字
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