李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 读书观影
  • 系列
  • AI工具集
  • 论坛
  • 友圈
    • 友链
    • 朋友圈
    • 游客中心
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • Now
    • 每日心情
    • 网站地图
    • 网站统计
    • 赞助
  • 星球穿梭
  • 🚇开往
静亦定 动亦定
惟坚韧者始能遂其志
  1. 首页
  2. 中间件
  3. 正文

Elasticsearch零停机迁移数据

2019年12月11日 247 0 0
本文最后更新于 2025年11月20日,距今已 348 天,其中的信息可能已经发生变化,请注意甄别。

创建索引

创建一个名为my_index的索引

PUT localhost:9200/my_index

创建映射

PUT localhost:9200/my_index/my_type/_mapping
{
    "properties": {
        "name": {
            "type": "text"
        }
    }
}

添加一个文档

PUT localhost:9200/my_index/my_type/2
{
    "name": "李锋镝"
}

查询:

GET localhost:9200/my_index/my_type/2
{
    "_index": "my_index",
    "_type": "my_type",
    "_id": "2",
    "_version": 1,
    "_seq_no": 0,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "name": "李锋镝"
    }
}

可以发现文档所属的索引是my_index。

设置别名prod_index指向my_index

PUT localhost:9200/my_index/_alias/prod_index

检测别名是否设置成功

使用

GET localhost:9200/*/_alias/prod_index

或者

GET localhost:9200/my_index/_alias/*

如果成功就会都返回如下的结果:

{
    "my_index": {
        "aliases": {
            "prod_index": {}
        }
    }
}

说明别名设置成功。

使用别名查询文档:

GET localhost:9200/prod_index/my_type/2
{
    "_index": "my_index",
    "_type": "my_type",
    "_id": "2",
    "_version": 1,
    "_seq_no": 0,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "name": "李锋镝"
    }
}

嗯...文档所属的索引同样是my_index。

然后可能过了一段时间我们发现my_index中的一个字段的映射不符合我们现今的需求,需要修改这个字段的映射。问题来了,我们不能修改现存的映射,所以我们必须重新索引数据。

重建索引

首先创建一个名为my_index1的索引

PUT localhost:9200/my_index1

创建映射

PUT localhost:9200/my_index1/my_type/_mapping
{
    "properties": {
        "name": {
            "type": "keyword"
        }
    }
}

将数据从my_index中索引到my_index1

POST localhost:9200/_reindex
{
  "source": {
    "index": "my_index"
  },
  "dest": {
    "index": "my_index1"
  }
}

操作成功,返回:

{
    "took": 1159,
    "timed_out": false,
    "total": 2,
    "updated": 0,
    "created": 2,
    "deleted": 0,
    "batches": 1,
    "version_conflicts": 0,
    "noops": 0,
    "retries": {
        "bulk": 0,
        "search": 0
    },
    "throttled_millis": 0,
    "requests_per_second": -1.0,
    "throttled_until_millis": 0,
    "failures": []
}

然后我们查询下数据,看下数据过来了没:

GET localhost:9200/my_index1/my_type/2
{
    "_index": "my_index1",
    "_type": "my_type",
    "_id": "2",
    "_version": 1,
    "_seq_no": 0,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "name": "李锋镝"
    }
}

可以看到通过新的索引已经可以查询到my_index中的数据了。

接下来就是将别名prod_index指到my_index1上,因为一个别名可以指向多个索引,所以我们还需要删除my_index的别名。这个操作需要原子化,所以我们使用_aliases API来操作。

转移索引别名

POST localhost:9200/_aliases
{
    "actions": [
        {
            "remove": {
                "index": "my_index",
                "alias": "prod_index"
            }
        },
        {
            "add": {
                "index": "my_index1",
                "alias": "prod_index"
            }
        }
    ]
}

然后我们使用别名来查询一下我们的数据:

GET localhost:9200/prod_index/my_type/2
{
    "_index": "my_index1",
    "_type": "my_type",
    "_id": "2",
    "_version": 1,
    "_seq_no": 0,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "name": "李锋镝"
    }
}

可以看到我们通过别名查询到的数据的索引已经是my_index1了。

OK,到了这里基本就大功告成,实现了在零停机的情况下从旧索引迁移到新索引了(前提是应用程序里边使用的是别名而不是索引名,这样你就可以在任何时候重建索引,而且别名的开销很小)。

其他

数据量太大,迁移时间很长怎么办?

_reindex API重建索引默认分页大小是1000,可以通过调整这个参数来增加效率。

POST localhost:9200/_reindex
{
  "source": {
    "index": "my_index",
    "size": 5000
  },
  "dest": {
    "index": "my_index1",
    "routing": "=cat"
  }
}

或者使用slices并行处理数据:

POST localhost:9200/_reindex?slices=5&refresh
{
  "source": {
    "index": "my_index"
  },
  "dest": {
    "index": "my_index1"
  }
}
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

Elasticsearch零停机迁移数据

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: ElasticSearch 数据迁移
最后更新:2025年11月20日

岁月同一天 11 月 4 日

回望过去的今天,你在写什么

  • 中间件
    1 年前 2025年11月4日
    为什么MySQL要“小表驱动大表”

    在 MySQL 优化中,“小表驱动大表”是一条广为人知的核心原则——尤其在多表 Join 场景下,驱动表的选择直接影响查…

  • 后端
    1 年前 2025年11月4日
    深度解析多级缓存架构:从设计到落地,彻底解决数据一致性难题

    在高并发系统中,缓存是提升性能的核心手段,但单一缓存往往难以平衡“速度、容量、一致性”三者的需求。基于 Spring B…

  • 原创
    7 年前 2019年11月4日
    Linux服务器查看日志命令总结1

    tail 用于输出文件中的尾部内容,实际应用如下: // 显示文件倒数2行数据,并实时刷新新日志 tail -2f de…

相关文章
  • Elasticsearch中的多索引、多类型搜索2019年10月24日
  • Elasticsearch:cat API 介绍及其使用2020年10月27日
  • 终于有人把Elasticsearch原理讲透了!2019年8月15日
  • SpringBoot使用注解的方式构建Elasticsearch查询语句,实现多条件的复杂查询2019年9月12日
  • SpringBoot整合Elasticsearch详细步骤以及代码示例(附源码)2019年9月20日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

还没有评论,快来抢沙发吧~

待到重阳日,还来就菊花。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
又一个逆天改命的人:小小徐 AI的生成能力等于生产力吗? NGINX严重漏洞(CVE-2026-15176、CVE-2026-93479、CVE-2026-97205) Kratos-plus v1.1.27更新说明 php2shell远程执行漏洞修复(CVE-2026-109618 和 CVE-2026-109619) 聊一聊DeepSeek开放自研搜索API这事
给主题增加了游客中心功能心气没了,干什么都不得劲我觉得是时候公布我的导航网站了游本昌去世关于主题加载速度优化的一点儿小演进给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能
JWT、Cookie、Session、Token 区别与实战选型指南 BeanCopier工具类(性能优化工具类) 1小时搭建私有化AI知识库:DeepSeek + Ollama + AnythingLLM 实战指南(从部署到优化) 探讨全球多站点跨机房数据传输场景下QUIC协议的优劣 玩博客的人是不是越来越少了? C# 11 的这个新特性,我愿称之最强!
最近评论
李锋镝 发布于 2 天前(11月02日) 良田是啥?
李锋镝 发布于 2 天前(11月02日) 哈哈哈,我也希望
李锋镝 发布于 2 天前(11月02日) 看最新的说是骗流量的,哎
女装品牌前十名 发布于 2 天前(11月01日) 文章不错非常喜欢,支持一下
彬红茶 发布于 3 天前(11月01日) 我也刷到这个了,不知道你有没有刷过良田
标签聚合
JAVA K8s MySQL Theme 分布式 Spring 多线程 AI 日常 IDEA ElasticSearch WordPress 数据库 架构 SQL SpringBoot AI编程 JVM Redis Claude
友情链接
  • Honesty
  • 九仞之行
  • 老张博客
  • lijie blog
  • 皮皮社
  • Mr.Sun的博客
  • 韩小韩博客
  • 志文工作室
  • 知向前端
  • 搬砖日记
  • 林羽凡
  • 懋和道人
  • 刘永博客
  • Serendipity
  • 彬红茶日记
  • 哥斯拉
  • 韩情脉脉
  • 瓦匠个人小站
  • sssr7844的博客

COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

lifengdi.com 十年之约虫洞

Domain age badge for lifengdi.com

Theme Kratos-plus By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号