李锋镝的博客 - LiFengdi.Com

  • 首页
  • 时间轴
  • 留言
  • 左邻右舍
  • 我的日常
  • 关于我
青衿之志 履践致远
霁月光风 不萦于怀
  1. 首页
  2. 原创
  3. 正文

Elasticsearch零停机迁移数据

2019年12月11日 11175点热度 0人点赞 0条评论

创建索引

创建一个名为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"
  }
}
除非注明,否则均为李锋镝的博客 - LiFengdi.Com原创文章,转载必须以链接形式标明本文链接
本文链接:https://www.lifengdi.com/archives/article/1607
标签: ElasticSearch 数据迁移
最后更新:2019年12月11日

李锋镝

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

打赏 点赞
< 上一篇
下一篇 >
guest
您的姓名(必填)
您的邮箱(必填)
您的站点
guest
您的姓名(必填)
您的邮箱(必填)
您的站点
0 评论
Inline Feedbacks
查看所有评论
文章目录
  • 创建索引
    • 创建一个名为my_index的索引
    • 创建映射
    • 添加一个文档
  • 设置别名prod_index指向my_index
    • 检测别名是否设置成功
  • 重建索引
    • 首先创建一个名为my_index1的索引
    • 创建映射
    • 将数据从my_index中索引到my_index1
  • 转移索引别名
  • 其他
网站统计
  • 文章总数:259 篇
  • 评论总数:417 篇
  • 标签数量:218 个
  • 最后更新:2022年5月19日 20:08
  • 建站日期:2016年6月6日
  • 运行天数:2173天

待到秋来九月八,我花开后百花杀。
冲天香阵透长安,满城尽带黄金甲。

最新 热点 随机
最新 热点 随机
jsdelivr的CDN加速好像不行了…… 居家办公了~ Python SQL查询使用动态表名 C# 11 的这个新特性,我愿称之最强! iTerm2设置SSH自动连接服务器 一线技术人的成长思考总结
居家办公了~关于8月29号下午博客故障的一些记录办理居住证困难重重啊!WordPress的自动更新好烦啊醒醒~补个税了居住证签注...
我要狠狠的反驳“公司禁止使用 Lombok ”的观点! 中国文学史上最霸气的诗句是哪一首?这首诗当仁不让 分布式事务的 N 种实现 默哀!2021年5月22日13时07分,袁隆平院士逝世 阿里巴巴《Java开发手册》下载 十一节后开工头一天,修了个耳机……
标签聚合
数据库 MySQL JAVA 日常 ElasticSearch 分布式 架构 SpringBoot
最近评论
zenmexiugai 发布于 2 小时前(05月20日) 改成一样的还是报错,怎么回事呢
张三 发布于 9 小时前(05月19日) 我不会css,作者的前端是怎么写的啊?包括这些评论啊什么的
张三 发布于 9 小时前(05月19日) 很棒的博客 作者加油啊
Andy烧麦 发布于 1 天前(05月18日) 将原本的通勤时间拿来学习,还是不错的
傅小黑 发布于 2 天前(05月17日) 居家工作更累
有情链接
  • 志文工作室
  • 临窗旋墨
  • 旧时繁华
  • 城南旧事
  • 强仔博客
  • 林三随笔
  • 徐艺扬的博客
  • 猫鼬的星球计划
  • 云辰博客
  • 韩小韩博客
  • 知向前端
  • 阿誉的博客
  • 林羽凡
  • 情侣头像
  • 哥斯拉
  • Xym's blog

COPYRIGHT © 2022 lifengdi.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

豫ICP备16004681号-2