本文档提供了从Elasticsearch迁移到OpenSearch的完整方案,主要使用elasticdump工具进行数据迁移。该方案适用于ES 7.x版本到OpenSearch 1.x版本的迁移。
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| elasticdump | 简单可靠、支持断点续传、处理大索引能力强 | 需要Node.js环境 | 推荐方案 |
| Reindex API | 官方支持、性能好 | 需要网络连通、配置复杂 | 网络环境良好时 |
| Logstash | 功能强大、支持数据转换 | 配置复杂、资源消耗大 | 需要数据转换时 |
node --version
npm --version
Ubuntu/Debian:
# 使用NodeSource仓库(推荐)
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
# 或使用nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
source ~/.bashrc
nvm install 18
nvm use 18
CentOS/RHEL:
curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
sudo yum install -y nodejs
# 全局安装
npm install -g elasticdump
# 验证安装
elasticdump --version
# 检查源ES集群健康状态
curl -X GET "http://source-es-host:9200/_cluster/health"
# 检查目标OpenSearch集群健康状态
curl -X GET "http://target-opensearch-host:9200/_cluster/health"
# 检查源索引是否存在
curl -X GET "http://source-es-host:9200/source_index_name"
elasticdump \
--input=http://source-es-host:9200/source_index_name \
--output=http://target-opensearch-host:9200/target_index_name \
--type=mapping
elasticdump \
--input=http://source-es-host:9200/source_index_name \
--output=http://target-opensearch-host:9200/target_index_name \
--type=data \
--limit=1000 \
--concurrency=1
# 检查文档数量
curl -X GET "http://source-es-host:9200/source_index_name/_count"
curl -X GET "http://target-opensearch-host:9200/target_index_name/_count"
# 检查索引状态
curl -X GET "http://target-opensearch-host:9200/target_index_name/_stats"
# 迁移映射
elasticdump \
--input=http://username:password@source-es-host:9200/source_index_name \
--output=http://username:password@target-opensearch-host:9200/target_index_name \
--type=mapping
# 迁移数据
elasticdump \
--input=http://username:password@source-es-host:9200/source_index_name \
--output=http://username:password@target-opensearch-host:9200/target_index_name \
--type=data \
--limit=1000
# 设置环境变量
export ES_USERNAME="your_es_username"
export ES_PASSWORD="your_es_password"
export OPENSEARCH_USERNAME="your_opensearch_username"
export OPENSEARCH_PASSWORD="your_opensearch_password"
# 使用环境变量
elasticdump \
--input=http://$ES_USERNAME:$ES_PASSWORD@source-es-host:9200/source_index_name \
--output=http://$OPENSEARCH_USERNAME:$OPENSEARCH_PASSWORD@target-opensearch-host:9200/target_index_name \
--type=data
#!/bin/bash
# Elasticsearch到OpenSearch迁移脚本
# 配置参数
SOURCE_HOST="source-es-host:9200"
TARGET_HOST="target-opensearch-host:9200"
SOURCE_INDEX="source_index_name"
TARGET_INDEX="target_index_name"
# 认证信息(可选)
SOURCE_USER="${ES_USERNAME:-}"
SOURCE_PASS="${ES_PASSWORD:-}"
TARGET_USER="${OPENSEARCH_USERNAME:-}"
TARGET_PASS="${OPENSEARCH_PASSWORD:-}"
# 构建认证URL
if [ -n "$SOURCE_USER" ] && [ -n "$SOURCE_PASS" ]; then
SOURCE_URL="http://$SOURCE_USER:$SOURCE_PASS@$SOURCE_HOST"
else
SOURCE_URL="http://$SOURCE_HOST"
fi
if [ -n "$TARGET_USER" ] && [ -n "$TARGET_PASS" ]; then
TARGET_URL="http://$TARGET_USER:$TARGET_PASS@$TARGET_HOST"
else
TARGET_URL="http://$TARGET_HOST"
fi
echo "开始迁移索引: $SOURCE_INDEX -> $TARGET_INDEX"
# 1. 检查源索引是否存在
echo "检查源索引..."
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$SOURCE_URL/$SOURCE_INDEX")
if [ "$HTTP_CODE" -ne 200 ]; then
echo "错误: 源索引 $SOURCE_INDEX 不存在或无权限访问"
exit 1
fi
# 2. 迁移索引映射
echo "迁移索引映射..."
elasticdump \
--input="$SOURCE_URL/$SOURCE_INDEX" \
--output="$TARGET_URL/$TARGET_INDEX" \
--type=mapping
if [ $? -ne 0 ]; then
echo "错误: 索引映射迁移失败"
exit 1
fi
# 3. 迁移数据
echo "迁移索引数据..."
elasticdump \
--input="$SOURCE_URL/$SOURCE_INDEX" \
--output="$TARGET_URL/$TARGET_INDEX" \
--type=data \
--limit=1000 \
--concurrency=1
if [ $? -ne 0 ]; then
echo "错误: 索引数据迁移失败"
exit 1
fi
# 4. 验证迁移结果
echo "验证迁移结果..."
SOURCE_COUNT=$(curl -s "$SOURCE_URL/$SOURCE_INDEX/_count" | jq -r '.count')
TARGET_COUNT=$(curl -s "$TARGET_URL/$TARGET_INDEX/_count" | jq -r '.count')
echo "源索引文档数: $SOURCE_COUNT"
echo "目标索引文档数: $TARGET_COUNT"
if [ "$SOURCE_COUNT" -eq "$TARGET_COUNT" ]; then
echo "迁移成功!文档数量一致"
else
echo "警告:文档数量不一致,请检查迁移结果"
exit 1
fi
echo "迁移完成!"
#!/bin/bash
# 批量迁移多个索引
# 索引列表
INDICES=("index1" "index2" "index3" "index4")
# 配置参数
SOURCE_HOST="source-es-host:9200"
TARGET_HOST="target-opensearch-host:9200"
# 认证信息
SOURCE_USER="${ES_USERNAME:-}"
SOURCE_PASS="${ES_PASSWORD:-}"
TARGET_USER="${OPENSEARCH_USERNAME:-}"
TARGET_PASS="${OPENSEARCH_PASSWORD:-}"
# 构建认证URL
if [ -n "$SOURCE_USER" ] && [ -n "$SOURCE_PASS" ]; then
SOURCE_URL="http://$SOURCE_USER:$SOURCE_PASS@$SOURCE_HOST"
else
SOURCE_URL="http://$SOURCE_HOST"
fi
if [ -n "$TARGET_USER" ] && [ -n "$TARGET_PASS" ]; then
TARGET_URL="http://$TARGET_USER:$TARGET_PASS@$TARGET_HOST"
else
TARGET_URL="http://$TARGET_HOST"
fi
# 迁移每个索引
for index in "${INDICES[@]}"; do
echo "=========================================="
echo "开始迁移索引: $index"
echo "=========================================="
# 迁移映射
echo "迁移索引映射..."
elasticdump \
--input="$SOURCE_URL/$index" \
--output="$TARGET_URL/$index" \
--type=mapping
if [ $? -ne 0 ]; then
echo "错误: 索引 $index 映射迁移失败"
continue
fi
# 迁移数据
echo "迁移索引数据..."
elasticdump \
--input="$SOURCE_URL/$index" \
--output="$TARGET_URL/$index" \
--type=data \
--limit=1000 \
--concurrency=1
if [ $? -eq 0 ]; then
echo "索引 $index 迁移完成"
else
echo "错误: 索引 $index 数据迁移失败"
fi
echo ""
done
echo "批量迁移完成!"
# 小批次(适合小内存环境)
elasticdump --limit=500 --concurrency=1
# 大批次(适合大内存环境)
elasticdump --limit=5000 --concurrency=2
# 增加内存限制到4GB
node --max-old-space-size=4096 $(which elasticdump) \
--input=http://source-host:9200/index_name \
--output=http://target-host:9200/index_name \
--type=data
elasticdump \
--input=http://source-host:9200/index_name \
--output=http://target-host:9200/index_name \
--type=data \
--compression=gzip
内存不足
# 增加Node.js内存限制
node --max-old-space-size=8192 $(which elasticdump) ...
网络超时
# 增加超时时间
elasticdump --timeout=300000 ...
认证失败
索引已存在
# 删除目标索引后重新迁移
curl -X DELETE "http://target-host:9200/target_index_name"
# 启用详细日志
elasticdump \
--input=http://source-host:9200/index_name \
--output=http://target-host:9200/index_name \
--type=data \
--debug
--debug参数监控迁移进度elasticdump是ES到OpenSearch迁移的可靠工具,具有以下优势:
推荐在生产环境中使用elasticdump进行ES到OpenSearch的数据迁移。