通过Elasticdump实现Elasticsearch集群间数据迁移
应用场景
在企业日常运营中,Elasticsearch集群的数据迁移是常见场景。Elasticdump是一个开源的Elasticsearch集群迁移工具,它支持不同版本的Elasticsearch之间的数据迁移。以下是Elasticdump实现Elasticsearch集群间数据迁移的一些应用场景:
- 跨版本迁移:在Elasticsearch集群需要升级到新版本时,Elasticdump可以帮助平滑迁移数据,确保升级过程中数据的完整性和可用性。
- 集群合并:当企业需要将多个Elasticsearch集群的数据整合到一个集群中以简化管理时,Elasticdump可以高效地完成这一任务。
- 服务迁移上云:企业可以将自建的Elasticsearch服务迁移至云平台,以利用云服务的弹性扩展、简化维护和成本效益。
- 变更服务提供商:如果企业当前使用的是第三方Elasticsearch服务,但出于成本、性能或其他战略考虑,希望更换服务提供商至华为云。
Elasticdump工具适用于数据量较小,索引数量不多的迁移场景。工具的详细使用方式请参见elasticsearch-dump官方文档。
方案架构
通过Elasticdump工具实现Elasticsearch集群间数据迁移的迁移流程如图1所示。
- 在迁移前,需要确保源集群和目标集群的版本兼容,并对源集群的数据进行备份,以防止数据丢失
- 在Linux虚拟机上安装Elasticdump迁移工具。
- 通过配置Elasticdump迁移命令,将源集群的索引数据迁移至目标集群。
方案优势
- 跨版本兼容性:Elasticdump支持不同版本的Elasticsearch集群间的数据迁移,包括从老版本迁移到新版本。
- 灵活的迁移方案:是Elasticdump提供了灵活的迁移方案,包括迁移索引settings、mapping、data等数据,以适应不同的业务需求。
- 开源免费:作为一个开源工具,是Elasticdump代码托管在GitHub上,用户可以免费使用。
性能影响
Elasticdump迁移方式的原理是通过Scroll API方式读取原始索引source内容写入到目标集群的索引,迁移时对源集群的数据读写会造成压力,建议在业务低峰期进行迁移。
约束限制
集群迁移过程中,源集群的索引数据不能增删改,否则会导致数据迁移后的源集群数据和目标集群数据内容不一致。
前提条件
- 已经购买CSS集群,源Elasticsearch集群和目标Elasticsearch集群处于可用状态。
- 集群间需要保证网络连通。
- 如果源集群和目标集群在不同VPC,则需要先打通VPC网络建立对等连接。具体操作请参见对等连接简介。
- 如果是自建Elasticsearch集群迁移至华为云,则可以通过给自建Elasticsearch集群配置公网访问打通网络。
- 如果是第三方Elasticsearch集群迁移至华为云,则需要建立企业内部数据中心到华为云的VPN通道或专线。
- 确认集群的索引已开启“_source”。
集群索引的“_source”默认是开启的。执行命令GET {index_name}/_search,当返回的索引信息里有“_source”信息时表示已开启。
步骤一:获取Elasticsearch集群信息
在迁移集群前,需要先获取必备的集群信息,用于配置迁移任务。
|
集群来源 |
要获取的信息 |
获取方式 |
|
|---|---|---|---|
|
源集群 |
华为云Elasticsearch集群 |
|
|
|
自建Elasticsearch集群 |
|
联系服务管理员获取。 |
|
|
第三方Elasticsearch集群 |
|
联系服务管理员获取。 |
|
|
目标集群 |
华为云Elasticsearch集群 |
|
|
源集群的来源不同,获取信息的方式不同,此处仅介绍如何获取华为云Elasticsearch集群的信息。
- 登录云搜索服务管理控制台。
- 在左侧导航栏,选择。
- 在集群列表,选择目标集群,获取集群名称和访问地址。
图2 获取集群信息
步骤二:安装Elasticdump工具
- 创建ECS用于安装Elasticdump工具。
- 购买Linux ECS,“镜像”选择CentOS 8系列,“虚拟私有云”和目标集群保持一致,启用公网访问。购买操作指导请参见快速购买和使用Linux ECS。
如果当前环境的网络未连接,则无需启用ECS的公网访问功能。建议采用离线安装步骤进行操作(需提前在有网络的环境中下载Elasticdump工具包和nodejs安装包,并传输至目标ECS)。操作指导请参见常见问题:如何离线安装Elasticdump工具。
- 测试ECS和源集群、目标集群的连通性。
在ECS执行如下命令测试连通性,当正常返回集群信息时表示已经连通。
# 非安全模式的集群 curl http://[ip]:9200 # 安全模式+HTTP访问的集群 curl -ik http://[ip]:9200 -u [username]:[password] # 安全模式+HTTPS访问的集群 curl -ik https://[ip]:9200 -u [username]:[password]
- 购买Linux ECS,“镜像”选择CentOS 8系列,“虚拟私有云”和目标集群保持一致,启用公网访问。购买操作指导请参见快速购买和使用Linux ECS。
- 在ECS上安装并配置nodejs。
- 下载nodejs安装包。
wget https://nodejs.org/dist/v20.10.0/node-v20.10.0-linux-x64.tar.gz
- 解压nodejs安装包。
tar -xvf node-v20.10.0-linux-x64.tar.gz
- 在bash_profile文件导入nodejs环境变量。
vim ~/.bash_profile
- 设置环境变量。执行vi命令打开bash_profile文件,添加如下内容:
export PATH=$PATH:/root/node-v20.10.0-linux-x64/bin/
- 执行source命令使配置生效。
source ~/.bash_profile
- 验证nodejs是否安装成功。
node -v
- 下载nodejs安装包。
- 在ECS上安装Elasticdump工具。
npm install elasticdump -g
- 验证Elasticdump工具是否安装成功。
elasticdump --help
步骤三:使用Elasticdump迁移数据
- 使用Elasticdump迁移Elasticsearch数据,以实现数据迁移至目标集群。
Elasticdump从input读取数据,发送数据到output,因此input配置的是源Elasticsearch集群信息,output配置的是目标Elasticsearch集群信息。如表2所示提供了参数配置说明。
- 迁移指定索引settings:
elasticdump --input={protocol}://{host}:{port}/{index_name} --output={protocol}://{host}:{port}/{index_name} --type=settings # 示例:非安全模式的集群迁移到安全模式+HTTPS协议的集群 elasticdump --input=http://xx.xx.xx.xx:9200/my_index --output=https://username:password@xx.xx.xx.xx:9200/my_index --type=settings - 迁移指定索引mapping:
elasticdump --input={protocol}://{host}:{port}/{index_name} --output={protocol}://{host}:{port}/{index_name} --type=mapping # 示例:非安全模式的集群迁移到安全模式+HTTPS协议的集群 elasticdump --input=http://xx.xx.xx.xx:9200/my_index --output=https://username:password@xx.xx.xx.xx:9200/my_index --type=mapping - 迁移指定索引数据:
elasticdump --input={protocol}://{host}:{port}/{index_name} --output={protocol}://{host}:{port}/{index_name} --type=data # 示例:非安全模式的集群迁移到安全模式+HTTPS协议的集群 elasticdump --input=http://xx.xx.xx.xx:9200/my_index --output=https://username:password@xx.xx.xx.xx:9200/my_index --type=data - 通过query语句迁移数据:
elasticdump --input={protocol}://{host}:{port}/{index_name} --output={protocol}://{host}:{port}/{index_name} --searchBody="QueryString" # 示例:非安全模式的集群迁移到安全模式+HTTPS协议的集群 elasticdump --input=http://xx.xx.xx.xx:9200/my_index --output=https://username:password@xx.xx.xx.xx:9200/my_index --searchBody="{\"query\":{\"term\":{\"username\": \"admin\"}}}"
表2 参数说明 参数
说明
protocol
连接协议。
- 非安全模式的集群配置为http。
- 安全模式+HTTP协议的集群配置为http。
- 安全模式+HTTPS协议的集群配置为https。
host
集群访问地址。
- 非安全模式的集群配置为“集群IP地址”,如“xx.xx.xx.xx”。
- 安全模式的集群配置为“访问集群的用户名:密码@集群IP地址”,如“username:password@xx.xx.xx.xx”。
当集群存在多个IP地址时,中间用“,”隔开,如“xx.xx.xx.xx,xx.xx.xx.xx”。
集群IP地址的获取方式请参见步骤一:获取Elasticsearch集群信息。
port
集群的连接端口,默认是“9200”。
index_name
待迁移的索引名称。
QueryString
源集群的查询语句,用于指定要迁移的数据范围。支持json字符串格式,如“{\"query\":{\"term\":{\"username\": \"admin\"}}}”表示只迁移username为admin的文档。
更多迁移场景请参见elasticsearch-dump官方文档。
- 迁移指定索引settings:
- 数据迁移完成后,使用以下命令分别在源集群和目标集群中获取文档个数,并对比结果以确认数据一致性。
# 非安全模式的集群 curl http://[ip]:9200/[index_name]/_count # 安全模式+HTTP访问的集群 curl -ik -u [username]:[password] http://[ip]:9200/[index_name]/_count # 安全模式+HTTPS访问的集群 curl -ik -u [username]:[password] https://[ip]:9200/[index_name]/_count
常见问题:如何使用Elasticdump导出数据
Elasticdump支持导出数据到本地。
- 导出指定索引到本地json文件中:
# Backup index data to a file elasticdump \ --input={protocol}://{host}:{port}/{index_name} \ --output=/{local_file}/my_index.json \ --type=data - 导出指定索引到本地并保存为zip压缩包:
# Backup an index to a gzip using stdout elasticdump \ --input={protocol}://{host}:{port}/{index_name} \ --output=$ \ | gzip > /{local_file}/my_index.json.gz - 通过query语句导出指定索引到本地:
# Backup the results of a query to a file elasticdump \ --input={protocol}://{host}:{port}/{index_name} \ --output=/{local_file}/query.json \ --searchBody="QueryString"
|
参数 |
说明 |
|---|---|
|
protocol |
连接协议。
|
|
host |
集群访问地址。
当集群存在多个IP地址时,中间用“,”隔开,如“xx.xx.xx.xx,xx.xx.xx.xx”。 集群IP地址的获取方式请参见步骤一:获取Elasticsearch集群信息。 |
|
port |
集群的连接端口,默认是“9200”。 |
|
index_name |
待迁移的索引名称。 |
|
local_file |
本地存储路径。 |
|
QueryString |
源集群的查询语句,用于指定要迁移的数据范围。支持json字符串格式,如“{\"query\":{\"term\":{\"username\": \"admin\"}}}”表示只迁移username为admin的文档。 |
常见问题:HTTPS访问的集群如何忽略安全证书认证
Elasticdump支持通过设置环境变量NODE_TLS_REJECT_UNAUTHORIZED=0跳过安全证书认证。
# An alternative method of passing environment variables before execution
# NB : This only works with linux shells
NODE_TLS_REJECT_UNAUTHORIZED=0 elasticdump --input={protocol}://{host}:{port}/{index_name} --output={protocol}://{host}:{port}/{index_name}
常见问题:如何离线安装Elasticdump工具
当环境中的nodejs已安装成功,需要离线安装Elasticdump工具时,可以参考如下步骤。
-
为了在无公网访问能力的环境中安装Elasticdump工具,需要提前在有网络的环境中生成安装包。
- 登录具有公网访问功能的ECS。
- 参考2在ECS上安装并配置nodejs。
- 安装Elasticdump工具。
npm install elasticdump -g
- 安装npm打包工具。
npm install npm-pack-all -g
- 进入node_modules路径。注意替换为实际路径。
cd /root/node-v20.10.0-linux-x64/lib/node_modules/elasticdump/
- 打包Elasticdump安装包。
npm-pack-all
- 使用ll命令查看当前目录下是否生成了安装包文件。
如图3所示,表示打包成功,已生成“elasticdump-6.x.x.tgz”安装包,不同版本的安装包名称会有差异。
- 使用sftp工具下载Elasticdump安装包。
- 在有网络的环境中下载nodejs安装包。
下载地址:https://nodejs.org/dist/v20.10.0/node-v20.10.0-linux-x64.tar.gz。
- 在无公网访问能力的环境中安装Elasticdump工具。
- 将Elasticdump安装包和nodejs安装包上传到目标ECS的root路径下。
- 在ECS上安装并配置nodejs。
- 解压nodejs安装包。
tar -xvf node-v20.10.0-linux-x64.tar.gz
- 在bash_profile文件导入nodejs环境变量。
vim ~/.bash_profile
- 设置环境变量。执行vi命令打开bash_profile文件,添加如下内容:
export PATH=$PATH:/root/node-v20.10.0-linux-x64/bin/
- 执行source命令使配置生效。
source ~/.bash_profile
- 验证nodejs是否安装成功。
node -v
- 解压nodejs安装包。
- 安装Elasticdump。
npm install elasticdump-6.x.x.tgz -g
- 设置Elasticdump软链接。注意替换为实际路径。
ln -s /root/node-v20.10.0-linux-x64/lib/node_modules/elasticdump/bin/elasticdump /usr/local/bin
- 验证Elasticdump工具是否安装成功。
elasticdump --help

