ES跨集群数据迁移

摘要:
跨集群数据迁移用户在腾讯云上自建的ES集群或者在其它云厂商购买的ES集群,如果要迁移至腾讯云ES,用户可以根据自己的业务需要选择适合自己的迁移方案。离线迁移离线迁移需要先停止老集群的写操作,将数据迁移完毕后在新集群上进行读写操作。
跨集群数据迁移

用户在腾讯云上自建的ES集群或者在其它云厂商购买的ES集群,如果要迁移至腾讯云ES,用户可以根据自己的业务需要选择适合自己的迁移方案。如果业务可以停服或者可以暂停写操作,可以参考离线迁移的四种方案。

离线迁移

离线迁移需要先停止老集群的写操作,将数据迁移完毕后在新集群上进行读写操作。适合于业务可以停服的场景。

离线迁移大概有以下几种方式:

  • elasticsearch-dump
  • snapshot
  • reindex
  • logstash

elasticsearch-dump

适用场景

适合数据量不大,迁移索引个数不多的场景

使用方式

elasticsearch-dump是一款开源的ES数据迁移工具,github地址: https://github.com/taskrabbit/elasticsearch-dump

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
	    --limit:每次向目标ES集群写入数据的条数,不可设置的过大,以免bulk队列写满

3 . 迁移单个索引

以下操作通过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

4 . 迁移所有索引:以下操作通过elasticdump命令将将集群172.16.0.39中的所有索引迁移至集群172.16.0.20。 注意此操作并不能迁移索引的配置如分片数量和副本数量,必须对每个索引单独进行配置的迁移,或者直接在目标集群中将索引创建完毕后再迁移数据

		elasticdump --input=http://172.16.0.39:9200 --output=http://172.16.0.20:9200

snapshot

适用场景

适用数据量大的场景

使用方式

snapshot api是Elasticsearch用于对数据进行备份和恢复的一组api接口,可以通过snapshot api进行跨集群的数据迁移,原理就是从源ES集群创建数据快照,然后在目标ES集群中进行恢复。需要注意ES的版本问题:

			目标ES集群的主版本号(如5.6.4中的5为主版本号)要大于等于源ES集群的主版本号;
			1.x版本的集群创建的快照不能在5.x版本中恢复;
  1. 源ES集群中创建repository

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

		fs: 共享文件系统,将快照文件存放于文件系统中
		url: 指定文件系统的URL路径,支持协议:http,https,ftp,file,jar
		s3: AWS S3对象存储,快照存放于S3中,以插件形式支持
		hdfs: 快照存放于hdfs中,以插件形式支持
		cos: 快照存放于腾讯云COS对象存储中,以插件形式支持

如果需要从自建ES集群迁移至腾讯云的ES集群,可以直接使用fs类型仓库,注意需要在Elasticsearch配置文件elasticsearch.yml设置仓库路径:

		path.repo: ["/usr/local/services/test"]

之后调用snapshot api创建repository:

		curl -XPUT http://172.16.0.39:9200/_snapshot/my_backup -H 		'Content-Type: application/json' -d '{
    		"type": "fs",
    		"settings": {
        		"location": "/usr/local/services/test" 
        		"compress": true
    		}
		}'

如果需要从其它云厂商的ES集群迁移至腾讯云ES集群,或者腾讯云内部的ES集群迁移,可以使用对应云厂商他提供的仓库类型,如AWS的S3, 阿里云的OSS,腾讯云的COS

		curl -XPUT http://172.16.0.39:9200/_snapshot/my_s3_repository
		{
 		 	"type": "s3",
  			"settings": {
    		"bucket": "my_bucket_name",
   			"region": "us-west"
  			}
		}

2 . 源ES集群中创建snapshot

调用snapshot api在创建好的仓库中创建快照

		curl -XPUT http://172.16.0.39:9200/_snapshot/my_backup/snapshot_1?wait_for_completion=true

创建快照可以指定索引,也可以指定快照中包含哪些内容,具体的api接口参数可以查阅官方文档

3 . 目标ES集群中创建repository

目标ES集群中创建仓库和在源ES集群中创建仓库类似,用户可在腾讯云上创建COS对象bucket, 将仓库将在COS的某个bucket下。

4 . 移动源ES集群snapshot至目标ES集群的仓库

把源ES集群创建好的snapshot上传至目标ES集群创建好的仓库中

5 . 从快照恢复

		curl -XPUT http://172.16.0.20:9200/_snapshot/my_backup/snapshot_1/_restore

6 . 查看快照恢复状态

		curl http://172.16.0.20:9200/_snapshot/_status

reindex

reindex是Elasticsearch提供的一个api接口,可以把数据从源ES集群导入到当前的ES集群,同样实现了数据的迁移,限于腾讯云ES的实现方式,当前版本不支持reindex操作。简单介绍一下reindex接口的使用方式。

1 . 配置reindex.remote.whitelist参数

需要在目标ES集群中配置该参数,指明能够reindex的远程集群的白名单

2 . 调用reindex api

以下操作表示从源ES集群中查询名为test1的索引,查询条件为title字段为elasticsearch,将结果写入当前集群的test2索引

		POST _reindex
		{
  			"source": {
    			"remote": {
      				"host": "http://172.16.0.39:9200"
    			},
    			"index": "test1",
    			"query": {
      				"match": {
        				"title": "elasticsearch"
      				}
    			}
  			},
  			"dest": {
   			 	"index": "test2"
  			}
		}

logstash

logstash支持从一个ES集群中读取数据然后写入到另一个ES集群,因此可以使用logstash进行数据迁移,具体的配置文件如下:

		input {
    		elasticsearch {
        		hosts => ["http://172.16.0.39:9200"]
        		index => "*"
        		docinfo => true
	    	}
		}
		output {
    		elasticsearch {
        		hosts => ["http://172.16.0.20:9200"]
        		index => "%{[@metadata][_index]}"
    		}
		}

上述配置文件将源ES集群的所有索引同步到目标集群中,当然可以设置只同步指定的索引,logstash的更多功能可查阅logstash官方文档

example:

input {
elasticsearch {
#action => "index" #动作 固定值不需要修改
hosts => "10.98.8.151:9200" #ElasticSearch主机
index => "*" #索引名称
user => "elastic" #用户名
password =>"xxxxx" #密码
size => 5000
scroll => "50m"
docinfo => true
#会提取ES文档的元信息metadata
}
}
filter {
#Only matched data are send to output.
}
output {
#stdout {
#    codec => rubydebug
#}
elasticsearch {
#action => "index" #动作 固定值不需要修改
hosts => "10.88.8.5:9200" #ElasticSearch主机
index => "%{[@metadata][_index]}" #索引名称
document_type => "%{[@metadata][_type]}"
document_id => "%{[@metadata][_id]}"
user => "elastic" #用户名
password => "elastic" #密码
}
}

总结

  1. elasticsearch-dump和logstash做跨集群数据迁移时,都要求用于执行迁移任务的机器可以同时访问到两个集群,不然网络无法连通的情况下就无法实现迁移。而使用snapshot的方式没有这个限制,因为snapshot方式是完全离线的。因此elasticsearch-dump和logstash迁移方式更适合于源ES集群和目标ES集群处于同一网络的情况下进行迁移,而需要跨云厂商的迁移,比如从阿里云ES集群迁移至腾讯云ES集群,可以选择使用snapshot的方式进行迁移,当然也可以通过打通网络实现集群互通,但是成本较高。
  2. elasticsearchdump工具和mysql数据库用于做数据备份的工具mysqldump工具类似,都是逻辑备份,需要将数据一条一条导出后再执行导入,所以适合数据量小的场景下进行迁移;
  3. snapshot的方式适合数据量大的场景下进行迁移。

免责声明:文章转载自《ES跨集群数据迁移》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇关于IPv6被拒第12组 Alpha冲刺 (1/6)(组长)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Elasticsearch _reindex Alias使用

应用背景:1、当你的数据量过大,而你的索引最初创建的分片数量不足,导致数据入库较慢的情况,此时需要扩大分片的数量,此时可以尝试使用Reindex。 2、当数据的mapping需要修改,但是大量的数据已经导入到索引中了,重新导入数据到新的索引太耗时;但是在ES中,一个字段的mapping在定义并且导入数据之后是不能再修改的, 所以这种情况下也可以考虑尝试使用...

实时数据集成

  企业应用集成 面向服务的体系结构 (SOA) 目前应该是一个很受欢迎的名词,中间件技术人员几乎到了言必称SOA的程度,数据集成当然也不例外,在Oracle openworld2008大会上,就推出了一堆数据集成的专场演讲,其中和SOA结合最紧密的就是实时数据集成 real time data integration。我总结了一下,实时数据集成一般分为两...

如何在十分钟内插入1亿条记录到Oracle数据库?

这里提供一种方法,使用 APPEND 提示,使得十分钟内插入上亿数据成为可能。 -- Create table create table TMP_TEST_CHAS_LEE ( f01 VARCHAR2(20), f02 NUMBER(10) not null, f03 VARCHAR2(21), f04 VARCHAR2(21), f05 NUMBER,...

C#数据注解

【数据注解】 Data Annotations,使用数据注解可以帮助我们快速实现数据库表和类之间的绑定 【常见数据注解类型】 [Table("...")]  映射表名 [Key]  主键 [Display(Name="...")]    显示名称,一般指属性的中文名 [Column(TypeName="...")]   属性对应数据库的类型 [Requir...

h5页面下拉到底部加载下一页数据

//页面滚到底部异步加载下一页数据 $(window).scroll(function () { //已经滚动到上面的页面高度 var scrollTop = parseFloat($(this).scrollTop()), //页面高度 scrollHeight =$(documen...

十步法原则解决数据质量问题

  一、相关概念 1.1 数据质量 数据的一组固有属性满足数据消费者要求的程度。 1)数据固有属性 真实性:即数据是客观世界的真实反映 及时性:即数据是随着变化及时更新的 相关性:即数据是数据消费者关注和需要的 2)高质量数据满足要求(消费者角度) 可得的,当数据消费者需要时能够获取到; 及时的,当需要时,数据获得且是及时更新的; 完整的,数据是完整...