tencent cloud

Elasticsearch Service

新手指引
动态与公告
产品动态
产品公告
安全公告
产品简介
产品概述
Elasticsearch 版本支持说明
产品功能
高级特性(X-Pack)
产品优势
应用场景
能力与限制说明
相关概念
购买指南
计费概述
产品定价
ES Serverless 服务定价
欠费说明
ES 内核增强
内核版本发布记录
定向路由优化
压缩算法优化
FST Off Heap 内存优化
快速入门
集群规格和容量配置评估
创建集群
访问集群
ES Serverless 服务指南
服务概述
基本概念
5分钟快速体验
快速使用
访问控制
数据写入
数据查询
索引管理
告警管理
ES API 参考
相关问题
数据应用指南
数据应用概述
数据管理
ES 集群指南
集群管理
访问控制
集群多可用区部署
集群扩缩容
集群配置
插件配置
监控与告警
日志查询
数据备份
升级
实践教程
数据迁移和同步
应用场景构建
索引设置
SQL 支持
企业微信机器人接收 Watcher 告警
API 文档
History
Introduction
API Category
Instance APIs
Making API Requests
Data Types
Error Codes
常见问题
产品相关问题
ES 集群
词汇表
新版介绍
Elasticsearch Service 2020.07新版
Elasticsearch Service 2020.2新版
Elasticsearch Service 2019.12新版

数据迁移

PDF
聚焦模式
字号
最后更新时间: 2021-10-26 16:42:14
用户在腾讯云上自建的 ES 集群或者在其它云厂商购买的 ES 集群,如果要迁移至腾讯云 ES,用户可以根据自己的业务需要选择合适的迁移方案。如果业务可以停服或者可以暂停写操作,可以使用以下几种方式进行数据迁移:
COS 快照
logstash
elasticsearch-dump
各种迁移方式的对比如下:
迁移方式
适用场景
COS 快照
数据量大的场景(GB、TB、PB 级别)
对迁移速度要求较高的场景

logstash
迁移全量或增量数据,且对实时性要求不高的场景
需要对迁移的数据通过 es query 进行简单的过滤的场景
需要对迁移的数据进行复杂的过滤或处理的场景
版本跨度较大的数据迁移场景,如 5.x 版本迁移到 6.x 版本或 7.x 版本
elasticsearch-dump
数据量较小的场景


COS 快照

基于 COS 快照的迁移方式是使用 ES 的 snapshot api 接口进行迁移,基本原理就是从源 ES 集群创建索引快照,然后在目标 ES 集群中进行恢复。通过 snapshot 方式进行数据迁移时,特别需要注意 ES 的版本问题:
目标 ES 集群的主版本号(如5.6.4中的5为主版本号)要大于等于源 ES 集群的主版本号。
1.x 版本的集群创建的快照不能在 5.x 版本中恢复。

在源 ES 集群中创建 repository

创建快照前必须先创建 repository 仓库,一个 repository 仓库可以包含多份快照文件,repository 主要有以下几种类型。
fs:共享文件系统,将快照文件存放于文件系统中。
url:指定文件系统的 URL 路径,支持协议:http、https、ftp、file、jar。
s3:AWS S3 对象存储,快照存放于 S3 中,以插件形式支持,安装该插件请参考 repository-s3
hdfs:快照存放于 hdfs 中,以插件形式支持,安装该插件请参考 repository-hdfs
cos:快照存放于腾讯云 COS 对象存储中,以插件形式支持,安装该插件请参考 cos-repository
如果需要从自建 ES 集群迁移至腾讯云的 ES 集群,可以直接使用 COS 类型仓库。但需要先在自建 ES 集群上安装 cos-repository 插件(安装插件后需要重启集群才能使用),先把自建 ES 集群中的数据先备份到 COS,然后在腾讯云上的 ES 集群中恢复出来,以完成数据的迁移。
如果自建 ES 的集群不方便安装 cos-repository 插件,但是已经安装 repository-s3 或者 repository-hdfs 插件,则可以先把数据备份到 S3 或者 HDFS 中,然后把 S3 或者 HDFS 中备份好的文件上传到腾讯云 COS 中,之后在腾讯云上的集群中进行恢复。
通过 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 创建快照以备份索引数据,创建快照时可以指定只对部分索引进行备份,也可以备份所有的索引,具体的 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个索引都会被恢复到 ES 集群中。您还可以使用附加的选项对索引进行重命名。该选项允许您通过模式匹配索引名称,并通过恢复进程提供一个新名称。如果您想在不替换现有数据的前提下,恢复旧数据来验证内容或进行其他操作,则可以使用该选项。从快照里恢复单个索引并提供一个替换的名称:
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,查看指定索引的状态,返回结果中 statusgreen,则说明索引已经完全恢复:
GET _cluster/health/index_1

logstash

logstash 支持从一个 ES 集群中读取数据然后写入到另一个 ES 集群,因此可以使用 logstash 进行数据迁移,使用 logstash 进行迁移前,需要注意以下几点:
需要在和腾讯云上的 ES 集群相同的 VPC 下创建 CVM,部署 logstash,同时保证该 CVM 能够访问到源 ES 集群。
用于部署 logstash 的 CVM 最好选择比较高的配置,例如 CPU 为16核,内存为32GB。
logstash 应该和目标 ES 集群的主版本号相同,例如目标 ES 集群为6.8.2版本,则 logstash 也需要使用6.8版本。
需要特别注意索引 type 的问题,因为 ES 的不同版本对索引 type 的约束不同,跨大版本迁移 ES 集群时可能出现因为索引的 type 而导致写入目标集群失败等的问题。具体可参考 logstash-output-elasticsearch 插件中对 document_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 集群的所有索引同步到目标集群中,同时也可以设置只同步指定的索引,利用 logstash 进行迁移的更多功能可查阅 logstash-input-elasticsearchlogstash-output-elasticsearch

elasticsearch-dump

elasticsearch-dump 是一款开源的 ES 数据迁移工具,github 地址
1. 安装 elasticsearch-dump elasticsearch-dump 使用 node.js 开发,可使用 npm 包管理工具直接安装:
npm install elasticdump -g
2. 主要参数说明
--input: 源地址,可为 ES 集群 URL、文件或 stdin,可指定索引,格式为:{protocol}://{host}:{port}/{index}
--input-index: 源 ES 集群中的索引
--output: 目标地址,可为 ES 集群地址 URL、文件或 stdout,可指定索引,格式为:{protocol}://{host}:{port}/{index}
--output-index: 目标 ES 集群的索引
--type: 迁移类型,默认为 data,表明只迁移数据,可选 settings, analyzer, data, mapping, alias
3. 如果集群有安全认证,可以参照下面的方法使用 reindex 集群鉴权。 在对应的 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
4. 迁移单个索引 以下操作通过 elasticdump 命令将集群172.16.0.39中的 companydatabase 索引迁移至集群172.16.0.20。
注意:
第一条命令先将索引的 settings 先迁移,如果直接迁移 mapping 或者 data 将失去原有集群中索引的配置信息如分片数量和副本数量等,当然也可以直接在目标集群中将索引创建完毕后再同步 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
5. 迁移所有索引 以下操作通过 elasticdump 命令将集群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 做跨集群数据迁移时,都要求用于执行迁移任务的机器可以同时访问到两个集群,因为网络无法连通的情况下就无法实现迁移。而使用 snapshot 的方式则没有这个限制,因为 snapshot 方式是完全离线的。因此 elasticsearch-dump 和 logstash 迁移方式更适合于源 ES 集群和目标 ES 集群处于同一网络的情况下进行迁移。而需要跨云厂商的迁移,可以选择使用 snapshot 的方式进行迁移,例如从阿里云 ES 集群迁移至腾讯云 ES 集群,也可以通过打通网络实现集群互通,但是成本较高。
2. elasticsearch-dump 工具和 MySQL 数据库用于做数据备份的工具 mysqldump 类似,都是逻辑备份,需要将数据一条一条导出后再执行导入,所以适合数据量小的场景下进行迁移。
3. snapshot 的方式适合数据量大的场景下进行迁移。

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈