ES索引库的别名的使用--不停服实现索引库的重建切换

2023-11-19

ES 的别名不停停服切换索引,线上发布

场景: 我们现在线上正在使用 ES索引库 V , 没有使用ES索引库别名
两个问题 :

  1. 现在由于字段更新, 把线上的数据重新写入了V1库, 现在如何在不断服的情况下,完美的实现 从V 切换到V1 索引库?
  2. 后续如果再次重建索引V2 , 如何从V1 切换到V2
为什么使用ES索引库别名

ES 为我们提供了别名的概念 aliases,也就是我们在生成一个索引的时候,比如叫 my_index_v1,我们是可以做一个别名 my_name 指向它。

  • 当我们在查询 my_name 的时间时,实际上查询是 my_index_v1 这个索引的数据。
  • 业务系统去查询时直接使用 my_index 去做查询,当后台字段发生变化,或者字段类型发生变化时,我们就可以再生成一个新的 my_index_v2 。
  • 把 my_index_v1 的数据 导入到 my_index_v2 中
  • 最后删除 my_index 对于 my_index_v1 的指向,
  • 重新把 my_index 指向到 my_index_v2 。

在这个过程中,应用系统在切换完成前查询的旧数据,切换后查询的是新数据,应用就可以做到不停机,完美切换

实战第一个问题 我们如何从没别名 从V索引库 切换到 V1 索引库

我们线上现在master 代码是使用的 master 代码, 而且线上库是没有 索引别名的
所以 线上是通过代码中写死索引库名 V 去实现ES的增删改查的
第一次从V 切换到 V1 如何操作?

1.1 新建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"
        }
        }
  }
1.2 给V1库新建别名
  • V1新建索引别名 alias_xx , 这时候 别名 alias_xx 指向了 V1索引库, 对V1新建别名对 线上master的版本 线上数据 V 是没有任何影响
  • 线上数据依旧 通过代码的 V 的索引库 写入, 所以不影响
  • 此刻我们的 代码是dev分支, dev分支已经修改,使用的es索引库的别名 my_index_name_alias
#创建别名,允许通过别名 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
1.3 dev开发分支 使用V1库的别名my_index_name_alias 去增删改查操作es索引库
  • 此刻 dev分支可以发布到测试环境
  • 代码分支 dev 可以通过 别名 my_index_name_alias 去操作索引库 V1 , 这个逻辑是通的, 因为 代码及索引库 都是通过别名去访问的, 所以是没问题的
  • 跟线上的 ES索引库 V 和 master代码 是没有任何关联的
  • 测试环境正常操作, 写入ES库,更新, 测试没问题后, 就可以去发布线上了
1.4 dev分支上线
  • dev分支上线 合并到master代码, master就从V 切换到 V1库了
  • master代码上线后, 测试没问题后, 此时 master 及 ES索引库 都是通过 别名访问的 V1
  • 发布后,线上测试没问题

这时 我们线上 全都使用了别名去操作ES库了, 代码中也都是通过别名去操作ES库 V1了, 别名通过 指向 V1 , 实际上操作的就是V1数据存储库

第二个问题 如何从V1 切换到V2

后续我们ES索引库 结构又变了变成V2的结构, 我们要如何从V1切换到V2

  • 新创建一个索引my_v2_xx,数据结构是新的结构
  • 将 my_v1 的数据同步到my_v2_xx
  • 删除my_v1的别名
  • 新增my_v2_xx
  • 测试无误后, 删除原索引库 my_v1
2.1 修改别名指向

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"
      }
    }
  ]
}
 
2.2 检查当前索引指向
# 检查 别名指向哪个索引库
GET /*/_alias/my_index_name_alias
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES索引库的别名的使用--不停服实现索引库的重建切换 的相关文章

随机推荐

  • 第一回:Matplotlib初相识

    文章目录 第一回 Matplotlib初相识 一 认识matplotlib 二 一个最简单的绘图例子 三 Figure的组成 四 两种绘图接口 五 通用绘图模板 思考题 第一回 Matplotlib初相识 一 认识matplotlib Ma
  • 完美解决maven项目配置文件不生效、更新问题

    0 前言 三种需求情况 场景 以及解决办法 1 不知道为什么配置文件 xmlymlproperties 不生效 可能是java路径也可能是resource路径 2 Maven项目配置文件 不实时更新 3 非resource路径下的配置文件不
  • 计算机辅助诊断应用,数据挖掘在计算机辅助诊断中的应用研究

    摘要 近年来 计算机辅助诊断 Computer Aided Diagnosis CAD 逐渐成为医学领域的研究热点之一 很多计算机辅助诊断技术不断出现并获得快速发展 对于提高临床医生诊断的准确率 减少漏诊起到了积极的作用 数据挖掘技术的兴起
  • 网络编程中的协议格式

    数据包封装 传输层及其以下的机制由内核提供 应用层由用户进程提供 后面将介绍如何使用socket API编写应用程序 应用程序对通讯数据的含义进行解释 而传输层及其以下处理通讯的细节 将数据从一台计算机通过一定的路径发送到另一台计算机 应用
  • 毕业设计-基于 MATLAB 的车牌识别系统设计

    目录 前言 课题背景和意义 实现技术思路 一 车牌识别系统总体方案设计 二 车牌识别系统硬件设计 三 车牌识别系统软件设计 四 实验结果与分析 部分源代码 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕
  • 计算至少需要多少个快递主站点javascript

    题目 题目描述 快递业务范围有N个站点 A站点与B站点可以中转快递 则认为A B站可达 如果A B可达 B C可达 则A C可达 现在给N个站点编号0 1 n 1 用s i j 表示i j是否可达 s i j 1表示i j可达 s i j
  • BGP面试常见问题

    1 IBGP 为什么采用全互联 不采用全互联怎么部署 由 由于IBGP的水平分割导致一个路由器收到的一条BGP路由不能传递给其他IBGP的邻居 这样的话 如果要让一个iGp中所有路由器都要可以给别的路由器传递BGP路由的话 就需要建立全互连
  • ..\OBJ\LCD.axf: error: L6047U: The size of this image (34984 bytes) exceeds,KEIL5破解方法

    OBJ LCD axf error L6047U The size of this image 34984 bytes exceeds 相信刚开始学习使用KEIL的同学有可能会遇到这个问题 我当时看到这个问题也是一脸懵逼 为啥会有这个错误
  • STM32F401RET6智能锁实战项目-----之环境搭建

    一 环境搭建 1 安装keil5软件 直接双击keil5安装包中的 exe 后缀文件 然后全选下一步即可 注意 keil5的路径不能含中文或路径过长 可以不安装在C盘 二 破解keil5 安装完成后 桌面便会出现一个keil5的快捷方式图标
  • 【华为OD机试真题】区间连接器(连接器问题)(java&python)100%通过率 超详细代码注释 代码深度解读

    华为OD机试真题 2022 2023 真题目录 点这里 华为OD机试真题 信号发射和接收 试读 点这里 华为OD机试真题 租车骑绿道 试读 点这里 区间连接器 知识点数组排序Q滑窗时间限制 1s空间限制 256MB限定语言 不限 题目描述
  • 如何轻松实现跨境电商,华为云解决方案告诉你

    一 跨境电商 服务器宕机怎么办 各位观众老爷们好 接下来我将介绍我们的主人公 这个男孩看好了 他叫小帅 是一名公司技术主管 并且单身暗恋小美 另外一个女孩 她叫小美 是该公司的高级程序员 同时对小帅也颇有好感 作为跨境电商员工的小美 今天又
  • 【报错解决办法】bad restore file magic number (file may be corrupted) -- no data loaded

    今天在服务器上load一个Rdata的时候出现了这个报错 这还是第一次 之前load的都没问题 重装过一次R 上网一搜 发现是r的版本不对 检查之后发现确实如此 windows的R是4 1 2的版本 而linux上是3 6 于是我就重新在l
  • mongo- spring boot 操作- and or查询

    mongo spring boot 操作 and or查询 场景 select from user where address 上海 age gt 10 and name 小明 or nickName like 小明 以前查询在 mongo
  • lfs在Mandrake安装下的安装的一些体验

    首先 在第一遍安装GCC的时候 提示 cannot find lc 从网上搜索出来的都是提示需要安装一个glibc static的这么一个包 我就找阿找阿 找了半天 反正是没有能够找到一个合适的版本出来 这就让我服了 还好 我在编译GCC的
  • 改用DirectShow+Opencv解决外置单USB接口的双目摄像头调用cv::VideoCapture打不开的问题

    最近在做windows人脸识别的项目中遇到一个很纳闷的问题 采用OpenCv库的VideoCapture打不开外置单USB双目摄像头 其他的只要是一个摄像头一跟USB就可以打开 在网上找了很多资料 七七八八的最终得以解决了 在这整理下 环境
  • 用虚幻4开发搭积木的VR游戏

    2016 年 9 月 23 24 日 由 CSDN 和创新工场联合主办的 MDCC 2016 移动开发者大会 中国 Mobile Developer Conference China 将在北京 国家会议中心召开 来自iOS Android
  • 如何创建一个Windows软件

    很久以前我创造了一个Windows软件 我今天把这个方法分享给大家 我的系统 Edition Windows 11 Pro Insider Preview Version 22H2 Installed on 7 30 2022 OS bui
  • 掘金个人主页头像旋转效果

    img src https sf1 ttcdn tos pstatp com img user avatar d1d3c1b115358ea70f51edcd697b58b2 300x300 image alt 钱端挖掘机师傅的个人资料头像
  • 服务器cpu最多几核心,决定虚拟服务器所需要的CPU核心数量是一件非常复杂的事情...

    决定虚拟服务器所需要的CPU核心数量是一件非常复杂的事情 但是综合考虑下面几个因素 相信管理员能够作出最适合于自己的决定 看起来决定虚拟服务器所需要的单颗CPU核心数量是一件非常简单的事情 但事实上有很多复杂因素需要考虑 首先 在虚拟环境C
  • ES索引库的别名的使用--不停服实现索引库的重建切换

    ES 的别名不停停服切换索引 线上发布 场景 我们现在线上正在使用 ES索引库 V 没有使用ES索引库别名 两个问题 现在由于字段更新 把线上的数据重新写入了V1库 现在如何在不断服的情况下 完美的实现 从V 切换到V1 索引库 后续如果再