技术主题

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