本文主要介绍当您的阿里云Elasticsearch创建于新网络架构下时,如何通过实例私网连接打通网络后,使用reindex方式将ECS上自建的Elasticsearch中的数据迁移至阿里云Elasticsearch中,包括创建索引和迁移数据。
前提条件
自建Elasticsearch需要满足以下条件:
所在的ECS的网络类型必须是专有网络(不支持Classiclink方式打通的ECS),且必须与阿里云Elasticsearch在同一个专有网络下。
所在的ECS的安全组不能限制阿里云Elasticsearch实例的各节点IP(Kibana控制台可查看各节点的IP),且要开启9200端口。
已经与阿里云Elasticsearch实例连通。可在执行脚本的机器上,使用
curl -XGET http://<host>:9200
验证。说明您可以通过任意一台机器执行文档中的脚本,前提是该机器可以同时访问自建Elasticsearch和阿里云Elasticsearch集群的9200端口。
准备自建Elasticsearch索引数据,本文以下图中的source索引作为需要迁移的索引为例。
阿里云Elasticsearch需要满足以下条件:
提前开启自动创建索引功能或者在阿里云Elasticsearch上创建好索引
mappings
、settings
。未做白名单限制。
使用限制
2020年10月阿里云ES进行了网络架构调整,新网络架构下的集群跨集群reindex需依赖Privatelink打通阿里云ES集群私网。您可以参见下表,依据您的业务场景选择解决方案进行处理。
2020年10月之前创建的ES集群属于旧网络架构,2020年10月及之后创建的ES集群属于新网络架构。
使用场景 | ES集群所处网络架构 | 解决方案 |
阿里云ES集群间的数据迁移 | 两个ES集群均创建于旧网络架构下。 | reindex方式:阿里云ES间跨集群reindex。 |
其中一个ES集群创建于新网络架构下。 说明 另一个ES集群可以创建于新网络架构,也可以创建于旧网络架构。 |
| |
将ECS上自建的ES集群中的数据迁移至阿里云ES集群中 | 阿里云ES集群创建于旧网络架构下。 | reindex方式:通过reindex将自建ES数据迁移至阿里云。 |
阿里云ES集群创建于新网络架构下。 | reindex方式:通过实例私网打通将自建Elasticsearch数据迁移至阿里云。 |
操作流程
目前,仅支持PrivateLink功能的负载均衡实例作为终端节点服务的服务资源。通过PrivateLink实现在VPC间私网访问服务前,您需要创建支持PrivateLink功能的负载均衡实例,并配置相关监听信息。
终端节点服务是可以被其他VPC通过创建终端节点建立私网连接的服务,待负载均衡实例配置完成后,您需要创建终端节点服务。
在Elasticsearch控制台关联阿里云Elasticsearch实例与步骤二中创建的终端节点服务。
目标实例与终端节点服务关联成功后,即可获取终端节点域名,用于配置reindex白名单。
在Elasticsearch控制台将步骤四中获取的域名配置到目标实例的reindex白名单中,进行授权。
完成以上步骤后,即完成源实例与目标实例间的网络互通,可以进行数据迁移。
步骤一:配置支持PrivateLink功能的负载均衡实例
创建负载均衡实例。
确保负载均衡实例的地域和后端添加的云服务器ECS的地域相同。详情请参见创建支持PrivateLink功能的负载均衡实例。
配置协议&监听。选择负载均衡协议为TCP,并配置端口号为9200。
详情请参见配置协议&监听。
配置后端服务器,添加自建ES所在的ECS服务器,并配置端口号为9200。
详情请参见配置后端服务器。
单击下一步,按需配置健康检查,本文以默认值为例。
配置完成后,单击提交,单击知道了,根据页面提示返回实例管理页面,查看后端ECS实例的健康检查状态。
当后端ECS实例的健康检查状态为正常时,表示后端ECS实例可以正常处理负载均衡转发的请求了。
步骤二:创建终端节点服务
在顶部菜单栏处,选择要创建终端节点服务的地域。
本文以华东1(杭州)为例。
单击创建终端节点服务,在服务创建页面,按需选择创建终端节点服务配置。
具体操作和详细说明请参见创建和管理终端节点服务。本文使用的配置说明如下,未提及的参数按需选择或保持默认。
参数
说明
选择服务资源
选择要承载流量的可用区,然后选择与终端节点服务关联的负载均衡实例。
负载均衡实例作为服务资源与终端节点服务关联,关联的负载均衡实例将接受来自您服务的用户的网络访问,终端节点服务的可用区与服务资源所在的主可用区一致。
可以作为服务资源的负载均衡实例必须满足以下两个条件:
网络类型为专有网络。
功能特性为支持PrivateLink。
自动接受终端节点连接
选择是否自动接受终端节点的连接请求,建议选择是,取值含义如下:
是:终端节点服务将自动接受终端节点的连接请求,通过终端节点能够访问服务。
否:终端节点连接将处于已断开状态,等待服务管理员进行处理:
如果服务管理员接受该终端节点对应的终端节点服务连接,通过终端节点将能够访问服务。
如果服务管理员拒绝该终端节点对应的终端节点服务连接,通过终端节点无法访问服务。
是否支持同可用区优先
选择是否支持同可用区优先,建议选择是。
单击确定创建。
步骤三:配置阿里云Elasticsearch私网互通
- 登录阿里云Elasticsearch控制台。
- 在左侧导航栏,单击Elasticsearch实例。
- 进入目标实例。
- 在顶部菜单栏处,选择资源组和地域。
- 在Elasticsearch实例中单击目标实例ID。
在左侧导航栏,选择 。
在集群网络设置区域,单击配置实例私网连接右侧的修改。
在配置实例私网连接面板,单击+添加私网连接,选择步骤二中创建的终端节点服务和目标访问可用区,并选中系统提示信息。
单击确认,终端节点服务主动连接终端节点,连接成功后会显示已连接。
步骤四:获取终端节点域名
执行完以上步骤后,需要获取终端节点域名用于配置reindex白名单。
在配置实例私网连接面板中,单击目标终端节点ID。
在终端节点连接页签,单击目标终端节点ID前的图标,即可查看终端节点对应的域名。
步骤五:配置reindex白名单
该操作会触发集群重启,建议在业务低峰期进行。
- 登录阿里云Elasticsearch控制台。
- 在左侧导航栏,单击Elasticsearch实例。
- 进入目标实例。
- 在顶部菜单栏处,选择资源组和地域。
- 在Elasticsearch实例中单击目标实例ID。
在左侧导航栏,选择 。
在YML文件配置区域,单击右侧的修改配置。
在YML文件配置面板,修改其他Configure配置,将从步骤四中获取的域名配置至此处。
代码示例:
reindex.remote.whitelist: 'ep-bp1nitq0krp8yhcf****-cn-hangzhou-i.epsrv-bp1zczi0fgoc5qtv****.cn-hangzhou.privatelink.aliyuncs.com:9200'
单击确定。
步骤六:数据迁移
在Kibana控制台的Dev Tools中执行如下命令,进行数据迁移。
说明登录Kibana控制台的具体步骤请参见登录Kibana控制台。
POST /_reindex?pretty { "source": { "remote": { "host": "http://ep-bp1nitq0krp8yhcf****-cn-hangzhou-i.epsrv-bp1zczi0fgoc5qtv****.cn-hangzhou.privatelink.aliyuncs.com:9200", "username": "elastic", "password": "Elastic@123***" }, "index": "source", "size": 5000 }, "dest": { "index": "dest" } }
更多信息说明请参见reindex api。
可选:在数据迁移过程中,如果您需要获取所有正在运行的reindex请求状态,请执行以下命令。
GET _tasks?detailed=true&actions=*reindex
查看数据迁移结果。
待数据迁移完成后,您可以通过执行以下命令查看数据迁移结果。
GET _cat/indices?
如果目标端索引test中显示健康状态正常并且数据大小正常,则证明数据迁移成功。
常见问题
问题:单索引数据量比较大,数据同步速度比较慢时,如何处理?
解决方法:
由于reindex功能的底层实现原理是通过scroll方式实现的,所以您可以适当调大scroll size的大小或配置scroll slice,借助scroll并行化机制提升效率。详情请参见reindex api。
如果源端数据量较大,建议采用OSS快照方式。详情请参见通过OSS将自建Elasticsearch数据迁移至阿里云。
如果单索引数据量比较大,可以在迁移前将目标索引的副本数设置为0,刷新时间设置为-1,以加快数据同步速度。待数据迁移完成后,再修改回来。
// 迁移索引数据前可以先将索引副本数设为0,不刷新,用于加快数据迁移速度。 curl -u user:password -XPUT 'http://<host:port>/indexName/_settings' -d' { "number_of_replicas" : 0, "refresh_interval" : "-1" }' // 索引数据迁移完成后,可以重置索引副本数为1,刷新时间1s(1s是默认值)。 curl -u user:password -XPUT 'http://<host:port>/indexName/_settings' -d' { "number_of_replicas" : 1, "refresh_interval" : "1s" }'