自建的Elasticsearch服务运维难度高,操作复杂,需要手动调整资源,遇到性能瓶颈时优化难度相对云上Elasticsearch较大。本文介绍自建Elasticsearch迁移上云的方案,介绍自建Elasticsearch数据迁移至阿里云的常见方案,以及在迁移上云实战中遇到的关键问题和解决方法,以帮助企业客户更好的进行Elasticsearch迁移上云。
1. 概述
自建的Elasticsearch服务运维难度高,操作复杂,需要手动调整资源,遇到性能瓶颈时优化难度相对云上Elasticsearch较大。本文介绍自建Elasticsearch迁移上云的方案,介绍自建Elasticsearch数据迁移至阿里云的常见方案,以及在迁移上云实战中遇到的关键问题和解决方法,以帮助企业客户更好的进行Elasticsearch迁移上云。
2. 方案介绍
目前可以通过Logstash、reindex和OSS快照等方式来完成自建Elasticsearch数据迁移至阿里云Elasticsearch,源端数据量较大场景,一般通过OSS快照方式进行迁移,但由于OSS快照方式不支持迁移增量数据,需要在迁移前关闭源端待迁移索引的写入或者更新。
如果源端数据量较大且无法在迁移前关闭源端待迁移索引的写入或者更新,则推荐通过Logstash将自建Elasticsearch数据全量+增量迁移至阿里云的方案。
如果源端数据量较小,一般推荐通过Logstash将自建Elasticsearch数据全量迁移至阿里云的方案。
方案的具体步骤请查看官网链接:https://help.aliyun.com/document_detail/170095.html,本文不作详细介绍,本文主要介绍客户自建ES数据迁移至阿里云ES实战过程中遇到的常见问题和解决方法。
3. 迁移前规格容量评估
规格容量评估主要包括4方面:快速选型、磁盘容量评估、集群规格评估、和Shard评估,购买目标Elasticsearch集群前需要先做好评估,以确保目标集群规格容量符合业务需求。
阿里云Elasticsearch官网购买页提供了选型工具,链接地址为:Elasticsearch购买页,可以结合工具推荐配置和已有集群的配置确定目标集群配置。
Shard大小和数量是Elasticsearch集群稳定性和性能的关键因素之一,Elasticsearch集群中任何一个索引都需要有一个合理的shard规划,合理的shard规划能够防止因业务不明确,导致分片庞大消耗Elasticsearch本身性能的问题。
关于规格容量评估的具体方法可参考官网说明:https://help.aliyun.com/document_detail/72660.html。
4. 版本兼容性确认
通过Logstash进行数据迁移时,需注意Elastic、Logstash产品之间的版本兼容性,具体信息请查看官网产品兼容性:https://help.aliyun.com/document_detail/149588.htm
5. 目标集群分片(Shards)数量优化方案
如果已有Elasticsearch集群分片(Shards)数量设置不合理,希望在目标集群重新设置优化分片(shards)数量,建议手动在目标Elasticsearch集群中创建空索引,创建时,复制源端的mappings和settings结构,并合理分配shard数量,进行shard数量优化。
在进行自建Elasticsearch集群数据迁移时,不建议开启自动创建索引功能,因为Logstash只同步数据,不同步数据结构特征,所以开启自动创建索引功能后,可能会存在同步前后数据结构不一致的情况,导致迁移前后数据的格式不一致。如果需要同步前后的数据结构一致,那么建议先在目标端Elasticsearch中手动创建目标索引,并按照规划设置好分片数量。
6. 如何加快Logstash迁移数据速度
当客户迁移数据量较大时,需要调优Logstash的性能以加快数据迁移速度,调优Logstash的性能主要通过调整参数:管道批大小(即pipeline.batch.size)和管道工作线程(即pipeline.workers),关于管道批大小和管道工作线程参数说明和建议如下:
建议确认Logstash实例性能是否达到瓶颈,如果Logstash未达到瓶颈,并且源端和目标端Elasticsearch性能负载不高时,适当调大Logstash的管道批大小和工作线程数并持续监控源端Elasticsearch、目标端Elasticsearch和Logstash性能压力情况,如果Logstash实例性能达到瓶颈,需要升配Logstash后再继续调整。
以下是通过控制台监控阿里云Elasticsearch集群性能和Logstash实例性能的界面:
阿里云Elasticsearch集群监控
阿里云Logstash实例监控
7. 查看数据迁移结果
分别登录源端Elasticsearch和目标端阿里云Elasticsearch集群的Kibana控制台,在左侧导航栏,单击Dev Tools,在控制台中执行命令:GET /_cat/indices?v,查看迁移成功的索引,正常情况下,返回的记录条数应该与自建Elasticsearch集群一致,如下图:
(1)自建Elasticsearch集群索引和数据量信息:
(2)阿里云Elasticsearch集群索引和数据量信息:
8. 迁移后使用阿里云ES--认证机制
自建Elasticsearch可能没有配置用户、角色以及相应的权限,应用程序就可以直接访问Elasticsearch。阿里云Elasticsearch默认启动认证机制Basic Auth且不支持关闭认证机制,以实现用户权限管控。Basic Auth是X-pack自带的Kibana认证机制,ES实例包含X-Pack功能,因此不支持关闭Basic Auth。
在完成数据迁移至阿里云Elasticsearch后,通过客户端访问阿里云Elasticsearch时需要在程序代码中配置已授权的用户,才能正常访问阿里云Elasticsearch,否则会有类似以下的报错信息:
{"error":{"root_cause":[{"type":"security_exception","reason":"action [indices:xxx] is unauthorized for user [xxx_user]"}],"type":"security_exception","reason":"action [indices:xxx] is unauthorized for user [xxx_user]"},"status":403}
需通过Kibana控制台自定义角色分配权限,并将角色分配给用户,在客户端程序代码中使用已授权的用户访问阿里云Elasticsearch,以下是python代码访问阿里云Elasticsearch示例,具体代码可参考阿里云官网https://help.aliyun.com/document_detail/69194.html:
from elasticsearch import Elasticsearch, RequestsHttpConnection
import certifi
es = Elasticsearch(
['<YourEsHost>'],
http_auth=('<UserName>', '<YourPassword>'),
port=9200,
use_ssl=False
)
res = es.index(index="<YourEsIndex>", doc_type="<YourEsType>", id=<YourEsId>, body={"<YourEsField1>": "<YourEsFieldValue1>", "<YourEsField2>": "<YourEsFieldValue2>"})
res = es.get(index="<YourEsIndex>", doc_type="<YourEsType>", id=<YourEsId>)
print(res['_source'])
关于如何在Kibana控制台创建角色和用户,以及权限配置方法,包括配置索引只读权限、配置索引读写和集群只读权限、配置Dashboard操作权限等,请参考官网详细说明:https://help.aliyun.com/document_detail/194708.html
以下是由于缺少用户信息或者使用的测试用户gxj_test缺少相应权限情况下,访问Elasticsearch实例失败的报错信息:
以下是为用户gxj_test授权后能够正常访问Elasticsearch实例的返回信息:
9. 总结
本文主要介绍了自建Elasticsearch迁移至阿里云的几种方案,并结合迁移实战介绍了在迁移整个过程中以及完成迁移后使用阿里云Elasticsearch可能遇到的常见问题和对应解决方法。本文无法列举出Elasticsearch迁移过程中可能遇到的所有问题,有些问题需要基于业务场景进行分析,也欢迎大家积极在社区分享更多Elasticsearch迁移的最佳实践。