说明
本文主要做es7.2 跨集群迁移少量数据(数据 < 100GB)。测试环境使用 Docker 部署了两个 Elasticsearch 7.2 实例,并通过端口映射分别暴露为:
- 源集群:宿主机 9200 → 容器内 9200
- 目标集群:宿主机 19200 → 容器内 9200
且两个容器运行在同一台宿主机上(这是关键前提),测试时我使用宿主机 IP 实现跨容器通信。
主要步骤包括:
- 源集群:创建索引 + 插入测试数据
- 目标集群:创建目标索引(可选)+ 配置白名单
- 执行远程 _reindex
- 验证数据一致性
本方案使用 Reindex from Remote,是官方推荐的跨集群迁移方式。
🧪 环境设定
| 角色 | 对应的值 | 说明 |
|---|---|---|
| 源集群 (Source) | http://192.168.1.10:9200 | 数据所在集群(ES 7.2) |
| 目标集群 (Target) | http://192.168.1.10:19200 | 迁移目标集群(ES 7.2) |
| 用户名 | elastic | 两边均启用安全认证 |
| 密码 | fC3!eG5#iF | 请替换为真实密码,且两个集群的密码可以不一样 |
| 索引名 | app-logs-2025 | 示例业务索引 |
启动两个 ES 容器
源集群(映射到宿主机 9200)
xml
docker run -d \
--name es-source \
-p 9200:9200 \
-e "discovery.type=single-node" \
-e "xpack.security.enabled=true" \
-e "ELASTIC_PASSWORD=fC3!eG5#iF" \
docker.elastic.co/elasticsearch/elasticsearch:7.2.0
目标集群(映射到宿主机 19200)
xml
docker run -d \
--name es-target \
-p 19200:9200 \
-e "discovery.type=single-node" \
-e "xpack.security.enabled=true" \
-e "ELASTIC_PASSWORD=fC3!eG5#iF" \
docker.elastic.co/elasticsearch/elasticsearch:7.2.0
在源集群创建索引并插入测试数据
创建源索引
在源集群机器上执行(或从任意可访问源集群的客户端)
xml
curl -u elastic:'fC3!eG5#iF' -X PUT "http://192.168.1.10:9200/app-logs-2025" \
-H 'Content-Type: application/json' -d '
{
"settings": {
"number_of_shards": 2,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"message": { "type": "text" },
"service": { "type": "keyword" },
"level": { "type": "keyword" },
"timestamp": { "type": "date" }
}
}
}'
插入测试数据(安全方式)
xml
for i in {1..5}; do
level=$( [ $((i%3)) -eq 0 ] && echo "ERROR" || echo "INFO")
json=$(printf '{
"message": "User login attempt %s",
"service": "auth-service",
"level": "%s",
"timestamp": "2025-03-18T15:00:0%sZ"
}' "$i" "$level" "$i")
curl -u elastic:'fC3!eG5#iF' -X POST "http://192.168.1.10:9200/app-logs-2025/_doc" \
-H 'Content-Type: application/json' -d "$json"
done
验证源数据
xml
curl -u elastic:'fC3!eG5#iF' "http://192.168.1.10:9200/app-logs-2025/_count"
# 预期输出: {"count":5,"_shards":{...}}
在目标集群配置远程白名单
注意:此步骤必须在目标集群操作,且需重启服务
编辑 elasticsearch.yml
登录目标集群机器,当前环境可以直接进入docker后修改/usr/share/elasticsearch/config/elasticsearch.yml 文件
在文件末尾添加:
xml
#允许从源集群拉取 reindex 数据
reindex.remote.whitelist: "192.168.1.10:9200"
#支持多个地址(逗号分隔):
reindex.remote.whitelist: "192.168.1.10:9200,192.168.1.11:9200"
重启 Elasticsearch 服务
xml
docker restart es-target
#等待服务完全启动
不重启 = 白名单不生效 = reindex 失败!
(可选)在目标集群预先创建索引
如果你想自定义目标索引结构(如改 mapping、调分片数),必须提前创建。否则 _reindex 会自动创建索引(继承源结构)。
创建目标索引(示例:优化设置)
xml
# 在目标集群执行
curl -u elastic:'fC3!eG5#iF' -X PUT "http://192.168.1.10:19200/app-logs-2025" \
-H 'Content-Type: application/json' -d '
{
"settings": {
"number_of_shards": 1, # 减少分片(小数据更高效)
"number_of_replicas": 1,
"refresh_interval": "30s", # 降低刷新频率,提升写入性能
"index.codec": "best_compression"
},
"mappings": {
"properties": {
"message": { "type": "text" },
"service": { "type": "keyword" },
"level": { "type": "keyword" },
"timestamp": { "type": "date" },
"migrated_at": { "type": "date" } # 新增字段
}
}
}'
如果不创建,ES 会在 _reindex 时自动创建(结构与源一致)。
在目标集群执行远程 _reindex
执行迁移命令(在目标集群执行)
xml
curl -u elastic:'fC3!eG5#iF' -X POST "http://192.168.1.10:19200/_reindex?wait_for_completion=false" \
-H 'Content-Type: application/json' -d '
{
"source": {
"remote": {
"host": "http://192.168.1.10:9200",
"username": "elastic",
"password": "fC3!eG5#iF"
},
"index": "app-logs-2025"
},
"dest": {
"index": "app-logs-2025"
},
"script": {
"source": "ctx._source.migrated_at = new Date();",
"lang": "painless"
}
}'
脚本说明:
- 自动添加 migrated_at 字段(记录迁移时间)
- 如果没预建索引,去掉 "script" 部分也可
可以根据返回结果大致判断是否同步成功
验证数据一致性
比较文档数量
xml
# 源集群
curl -u elastic:'fC3!eG5#iF' "http://192.168.1.10:9200/app-logs-2025/_count"
# 目标集群
curl -u elastic:'fC3!eG5#iF' "http://192.168.1.10:19200/app-logs-2025/_count"
两者 count 必须相等
检查新字段是否生效
xml
curl -u elastic:'fC3!eG5#iF' "http://192.168.1.10:19200/app-logs-2025/_search?size=1&pretty"
预期输出包含:
{
"_index" : "app-logs-2025",
"_type" : "_doc",
"_id" : "snvk_5wB85N-R9Z-x8p4",
"_score" : 1.0,
"_source" : {
"migrated_at" : "2026-03-18T09:04:24.679Z",
"level" : "INFO",
"service" : "api-gateway",
"message" : "Docker test log 1",
"timestamp" : "2025-03-18T16:00:01Z"
}
切换应用 & 清理(可选)
更新应用配置
将应用的 ES 地址从 192.168.1.10:9200 改为 192.168.1.10:19200
(推荐)根据环境实际情况判断是否可以使用别名实现零停机切换
以上就是少量数据在不同集群中的迁移方法,大家可在自己的测试环境自行测试。过程中难免出差,敬请指正。谢谢