ElasticSearch 的3种数据迁移方案

在实际工作中,我们经常会遇到需要将自建的 Elasticsearch 迁移上云,或者迁移到其他 ES 集群的情况。这时,选择合适的数据迁移方案就显得尤为重要啦。今天就来给大家介绍三种常用的迁移方案,分别是 COS 快照、logstash 和 elasticsearch - dump,小伙伴们可以根据自己的业务需求挑选哦~

如果业务可以停服或者暂停写操作,那这几种方式都可以考虑:

  1. COS 快照(Cloud Object Storage)
  2. logstash
  3. elasticsearch - dump

一、COS 快照数据备份

基于 COS 快照的迁移方式是借助 ES 的 snapshot api 接口来实现的。简单来说,就是先从源 ES 集群创建索引快照,然后在目标 ES 集群中进行恢复。不过,用这种方式迁移时,有个特别需要注意的点就是 ES 的版本问题:目标 ES 集群的主版本号(比如 5.6.4 中的 5 就是主版本号)要大于等于源 ES 集群的主版本号。而且 1.x 版本的集群创建的快照不能在 5.x 版本中恢复哦⚠️。

创建 repository 仓库

创建快照之前,必须先创建 repository 仓库,一个仓库可以包含多份快照文件。repository 主要有以下几种类型:

  • fs:共享文件系统,快照文件就存放在文件系统里。
  • url:指定文件系统的 URL 路径,支持 http、https、ftp、file、jar 这些协议。
  • s3:AWS S3 对象存储,快照存放在 S3 中,需要以插件形式支持,安装插件可以参考相关文档。
  • hdfs:快照存放在 hdfs 中,也是以插件形式支持,安装插件可参考对应文档。
  • cos:快照存放在腾讯云 COS 对象存储中,同样以插件形式支持,安装插件后要重启集群才能用哦,安装方法可以参考相关文档。

如果是从自建 ES 集群迁移到腾讯云的 ES 集群,直接用 COS 类型仓库就很方便。但得先在自建 ES 集群上安装 cos - repository 插件,之后把自建 ES 集群的数据备份到 COS,再在腾讯云的 ES 集群中恢复就行啦。

要是自建 ES 集群不方便安装 cos - repository 插件,但已经安装了 repository - s3 或者 repository - hdfs 插件,那可以先把数据备份到 S3 或者 HDFS 中,再把备份好的文件上传到腾讯云 COS,最后在腾讯云的集群中恢复。

创建 COS 仓库可以用下面这个命令:

复制代码
PUT _snapshot/my_cos_backup

{

"type": "cos",

"settings": {

"app_id": "xxxxxxx",

"access_key_id": "xxxxxx",

"access_key_secret": "xxxxxxx",

"bucket": "xxxxxx",

"region": "ap-guangzhou",

"compress": true,

"chunk_size": "500mb",

"base_path": "/"

}

}

这里面的参数意思分别是:

  • app_id:腾讯云账号 APPID。
  • access_key_id:腾讯云 API 密钥 SecretId。
  • access_key_secret:腾讯云 API 密钥 SecretKey。
  • bucket:COS Bucket 名字,是不带 appId 后缀的哦。
  • region:COS Bucket 地域,一定要和 ES 集群在同一个地域。
  • base_path:备份目录。

在源 ES 集群中创建 snapshot

调用 snapshot api 就能创建快照来备份索引数据,创建的时候可以指定备份部分索引,也可以备份所有索引,具体的参数可以去看官方文档。

备份所有索引:把源 ES 集群中的所有索引备份到 my_cos_backup 仓库下,命名为 snapshot_1,用这个命令:

PUT _snapshot/my_cos_backup/snapshot_1

这个命令会立刻返回,然后在后台异步执行。要是想让命令阻塞执行,加上 wait_for_completion 参数就行:

PUT _snapshot/my_cos_backup/snapshot_1?wait_for_completion=true

命令执行时间和索引大小有关哦。

备份指定索引:创建快照时可以指定要备份的索引,像这样:

复制代码
PUT _snapshot/my_cos_backup/snapshot_2

{

"indices": "index_1,index_2"

}

这里要注意,indices 的值有多个索引时,要用逗号隔开,而且不能有空格。

查看快照状态

想知道快照有没有备份完成,用下面这个命令,返回结果中 state 字段是 SUCCESS 就说明备份成功啦:

GET _snapshot/my_cos_backup/snapshot_1

在目标 ES 集群中创建 repository

在目标 ES 集群中创建仓库的方法和在源 ES 集群中是一样的哦。

从快照恢复

把快照中备份的所有索引恢复到 ES 集群,用这个命令:

复制代码
POST _snapshot/my_cos_backup/snapshot_1/_restore

如果 snapshot_1 里有 5 个索引,那这 5 个都会被恢复。还可以用附加选项对索引重命名,比如想恢复单个索引并换个名字:

复制代码
POST /_snapshot/my_cos_backup/snapshot_1/_restore

{

"indices": "index_1",

"rename_pattern": "index_(.+)",

"rename_replacement": "restored_index_$1"

}

这里的 indices 是说只恢复 index_1 索引,rename_pattern 是查找能匹配上的正在恢复的索引,rename_replacement 是把匹配的索引重命名成新的模式。

查看索引恢复状态

可以调用 _recovery API 查看指定索引的恢复进度:

复制代码
GET index_1/_recovery

也可以用这个 API 查看指定索引的状态,status 是 green 就说明完全恢复啦:

复制代码
GET _cluster/health/index_1

二、logstash工具

logstash 可以从一个 ES 集群读取数据再写入到另一个 ES 集群,所以也能用来做数据迁移。不过用它迁移前,有几点要注意:

  • 要在和腾讯云 ES 集群相同的 VPC 下创建 CVM,部署 logstash,而且这个 CVM 得能访问到源 ES 集群。
  • 部署 logstash 的 CVM 配置最好高一点,比如 16 核 CPU、32GB 内存。
  • logstash 应该和目标 ES 集群的主版本号相同,比如目标是 6.8.2 版本,logstash 也得用 6.8 版本。
  • 要特别注意索引 type 的问题,不同版本的 ES 对索引 type 的约束不一样,跨大版本迁移可能会因为这个导致写入失败,具体可以参考相关插件的说明。

给大家一个常用的 logstash 跨集群数据迁移的配置文件示例:

复制代码
input {

elasticsearch {

hosts => "1.1.1.1:9200"

index => "*"

docinfo => true

size => 5000

scroll => "5m"

}

}

output {

elasticsearch {

hosts => ["http://2.2.2.2:9200"]

user => "elastic"

password => "your_password"

index => "%{[@metadata][_index]}"

document_type => "%{[@metadata][_type]}"

document_id => "%{[@metadata][_id]}"

}

}

这个配置文件是把源 ES 集群的所有索引同步到目标集群,也可以设置只同步指定索引,更多功能可以去查阅相关文档。

三、elasticsearch - dump工具

elasticsearch - dump 是一款开源的 ES 数据迁移工具,github 上有它的地址

安装 elasticsearch - dump

它是用 node.js 开发的,可以用 npm 包管理工具直接安装:

复制代码
npm install elasticdump -g

主要参数说明

  • --input:源地址,可以是 ES 集群 URL、文件或 stdin,还能指定索引,格式是 {protocol}://{host}:{port}/{index}
  • --input - index:源 ES 集群中的索引
  • --output:目标地址,可以是 ES 集群 URL、文件或 stdout,也能指定索引,格式和 input 类似
  • --output - index:目标 ES 集群的索引
  • --type:迁移类型,默认是 data,只迁移数据,还可以选 settings、analyzer、mapping、alias

如果集群有安全认证,在对应的 http 后面加上 user:password@ 就行,比如:

复制代码
elasticsearch - dump --input=http://192.168.1.2:9200/my_index --output=http://user:password@192.168.1.2:9200/my_index --type=data

迁移单个索引

下面这个操作是把集群 172.16.0.39 中的 companydatabase 索引迁移到集群 172.16.0.20。首先要迁移索引的 settings,不然直接迁移 mapping 或者 data 会丢失原有配置,当然也可以在目标集群先创建好索引再同步:

复制代码
elasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=settings

elasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=mapping

elasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=data

迁移所有索引

这个操作是把集群 172.16.0.39 中的所有索引迁移到集群 172.16.0.20,但不能迁移索引配置,得单独对每个索引迁移配置,或者在目标集群先创建好索引:

复制代码
elasticdump --input=http://172.16.0.39:9200 --output=http://172.16.0.20:9200

四、总结

  1. elasticsearch - dump 和 logstash 做跨集群数据迁移时,要求执行迁移任务的机器能同时访问两个集群,所以更适合源和目标 ES 集群在同一网络的情况。而 snapshot 方式是完全离线的,没有这个限制,适合跨云厂商迁移,比如从阿里云 ES 集群迁移到腾讯云 ES 集群,当然也可以打通网络实现互通,但成本较高。
  2. elasticsearch - dump 类似 MySQL 的 mysqldump,是逻辑备份,需要一条条导出再导入,适合数据量小的场景;
  3. snapshot 方式则适合数据量大的场景;
相关推荐
AI_Auto1 小时前
数字化转型-制造业未来蓝图:“超自动化”工厂
运维·自动化
BAOYUCompany7 小时前
暴雨服务器更懂人工智能+
运维·服务器·人工智能
SpiderPex8 小时前
GitHub下载项目完整配置SSH步骤详解
运维·ssh·github
睡觉的时候不会困8 小时前
基于三台主机搭建 Web 服务环境:Nginx、NFS 与 DNS 配置全流程
运维·nginx
@半良人9 小时前
Jenkins流水线部署+webhook2.0
运维·jenkins
瀚高PG实验室10 小时前
CentOS 8 安装HGDB V4.5 psql命令执行报错
linux·运维·centos·瀚高数据库
chaofan98010 小时前
AI驱动的浏览器自动化革命:Claude Code + BrowserCat MCP深度实践指南
运维·自动化·claude code
Fireworkitte11 小时前
DevOps 详解
运维·devops
平生不喜凡桃李11 小时前
Linux 线程概念与控制
java·linux·运维
缘友一世11 小时前
Agent常用搜索引擎Tavily使用学习
学习·搜索引擎·agent