Elasticsearch跨集群数据迁移方案+代码操作

主流的ES迁移有三套方案
1、logstash数据同步
2、ES dump
3、ES snapshot迁移

1、logstash数据同步

./logstash -f config_file
1. 指定索引index全量迁移配置文档:
当目标端数据已经存在,无论数据是否变更,均执行更新覆盖,目标数据不存在则新建。

input {
    elasticsearch {
        hosts => ["ES IP(原始):9200"]
        index => "map"
    	docinfo => true
	}
}

output {
    elasticsearch {
        hosts => ["ES IP(目标):9200"]
        index => "%{[@metadata][_index]}"
        document_type => "%{[@metadata][_type]}"
        document_id => "%{[@metadata][_id]}"
}
}

2. 全量迁移配置文档:
当目标端数据已经存在,无论数据是否变更,均执行更新覆盖,目标数据不存在则新建。

input {
    elasticsearch {
        hosts => ["ES IP(原始):9200"]
        index => "*"
    	docinfo => true
	}
}

output {
    elasticsearch {
        hosts => ["ES IP(目标):9200"]
        index => "%{[@metadata][_index]}"
        document_type => "%{[@metadata][_type]}"
        document_id => "%{[@metadata][_id]}"
}
}

3. 新增迁移配置文档:
启动后程序一直运行,每分钟执行一次,按照源端的type及id进行目标端索引和数据的创建,如果目标数据存在则跳过,没有则新建,如果id相同的数据有变更,则仍跳过不更新。

input {
    elasticsearch {
        hosts => ["ES IP(原始):9200"]
        index => "*"
    	docinfo => true
	}
}

output {
    elasticsearch {
        hosts => ["ES IP(目标):9200"]
        index => "%{[@metadata][_index]}"
        document_type => "%{[@metadata][_type]}"
        document_id => "%{[@metadata][_id]}"
		action => "create"
}
}

Create:相同ID不变,增加新的ID和document
Update:基于相同的ID,修改对应的document
Delete:删除对应的index和ID

2、ES dump

本文暂不描述,ES dump是ES标准的数据迁移方案
但是由于ESdump处理后是保存一个json,整体来看不如最新的ES snapshot来的方便与安全。本文重点描述ES snapshot

3、ES snapshot迁移

ES snapshot目前行业主流模式是把ES的数据打快照保存在对象存储中,然后通过文件形式进行迁移,再从新集群对应的对象存储中进行数据恢复。

ESsnapshot迁移方案手册
(以下操作均可在kibana中的命令输入执行)

1. 创建快照仓库

创建一个名为my_repo的快照仓库:

PUT /_snapshot/my_repo
{
  "type": "s3",
  "settings": {
    "bucket": "testtjx",
    "base_path": "elk2",
    "region": "SHANGHAI",
    "endpoint": "ks3-cn-shanghai-internal.ksyun.com",
    "access_key": "AK",
    "secret_key": "SK"
  }
}

测试环境用的金山云ES和金山云对象存储产品

2. 查看快照仓库:
查看仓库列表:

GET /_snapshot

查看某个仓库:

GET /_snapshot/my_repo

删除快照仓库

DELETE /_snapshot/my_repo

3. 执行制作快照
执行快照会触发ES执行一次数据备份。
对所有索引执行快照,并将快照命名为my_snap1:

PUT /_snapshot/my_repo/my_snap1

对部分索引执行快照,并将快照命名为my_snap2:

PUT /_snapshot/my_repo/my_snap2
{
  "indices": "my_index_1,my_index_2"
}

4. 快照管理和恢复
查看快照列表:

GET /_snapshot/my_repo/_all

查看某个快照:

GET /_snapshot/my_repo/my_snap1

5. 查看执行中的快照
查看正在执行的快照:

GET /_snapshot/my_repo/_current

查看正在执行快照的详细进度,包括分片备份进度等:

GET /_snapshot/_status
GET /_snapshot/my_repo/_status
GET /_snapshot/my_repo/my_snap1/_status
GET /_snapshot/my_repo/my_snap1,my_snap2/_status

6. 删除快照
删除已完成或正在进行的快照,该操作会删除KS3上的相关数据:

DELETE /_snapshot/my_repo/my_snap1

7. 从快照中恢复
从快照恢复时,ES会把KS3上的数据导入回来,并建立新的索引。如果ES中已经存在同名索引,恢复会失败。
恢复快照my_snap1中的全部数据:

POST /_snapshot/my_repo/my_snap1/_restore

如果不想恢复全部数据,只想恢复指定的索引,并使用新的索引名:

POST /_snapshot/my_repo/my_snap1/_restore
{
  "indices": "my_index_1",
  "include_global_state": false,
  "rename_pattern": "(.+)",
  "rename_replacement": "restored_$1"   // 这里指定新的索引名为restored_my_index_1
}

8. 查看恢复状态
在恢复过程中,查看索引恢复的状态和百分比:

GET /restored_my_index_1/_recovery

取消恢复-删除目标索引即可取消正在进行的恢复:

DELETE /restored_my_index_1

版权声明:本文为shichengcheng_scc原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。