用户在腾讯云上自建的 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 后缀的 bucket 名。
region:COS Bucket 地域,必须与 ES 集群同地域。
base_path:备份目录。
在源 ES 集群中创建 snapshot
备份所有索引
说明
恢复所有的索引数据,通常会有一些系统索引已经存在,那就会出现异常的情况。
将源 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,查看指定索引的状态,返回结果中
status
为 green
,则说明索引已经完全恢复: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"user => "elastic"password => "your_password"index => "*"docinfo => truesize => 5000scroll => "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-elasticsearch 和 logstash-output-elasticsearch。
elasticsearch-dump
1. 安装 Node.js 和 npm,并配置好环境变量。
2. 安装 elasticsearch-dump
elasticsearch-dump 使用 node.js 开发,可使用 npm 包管理工具直接安装:
npm install elasticdump -g
3. 主要参数说明
--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
4. 如果集群有安全认证,可以参照下面的方法使用 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
如果是 HTTPS 集群,需要 -ca 加上各自集群
server-certificates.pem
证书,要在最前面加NODE_TLS_REJECT_UNAUTHORIZED=0
NODE_TLS_REJECT_UNAUTHORIZED
=
0
elasticsearch-dump --input
=
https://elastic:
P%40ssw0rd%21@192.168.1.2:9200/my_index -ca /path1/server-certificates.pem --output
=
https://elastic:
P%40ssw0rd%21@192.168.1.2:9200/my_index -ca /path2/server-certificates.pem --type
=
data
5. 迁移单个索引
以下操作通过 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=settingselasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=mappingelasticdump --input=http://172.16.0.39:9200/companydatabase --output=http://172.16.0.20:9200/companydatabase --type=data
6. 迁移所有索引
以下操作通过 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 的方式适合数据量大的场景下进行迁移。