【Elasticsearch】es7.2 跨集群迁移少量数据

说明

本文主要做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

(推荐)根据环境实际情况判断是否可以使用别名实现零停机切换

以上就是少量数据在不同集群中的迁移方法,大家可在自己的测试环境自行测试。过程中难免出差,敬请指正。谢谢

相关推荐
Elasticsearch9 小时前
AI 整合:为什么平台将胜出,而产品组合将瓦解
elasticsearch
七牛开发者9 小时前
为什么 Go 很适合 AI 辅助开发?
数据库·人工智能·python·elasticsearch·log4j
Aphelios3809 小时前
一次锁内网络IO引发的Tomcat线程池“饿死”事故
java·开发语言·spring boot·elasticsearch·tomcat·网络io阻塞·线程池耗尽
Elasticsearch15 小时前
向数据源提问:使用 Elasticsearch 和 Elastic Agent Builder 将代码搜索扩展到十亿行代码规模
elasticsearch
-今昭-17 小时前
AnsibleVault加密配置及zabbix部署
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客20 小时前
跳过有状态的 OTel Collector:Elasticsearch 9.5 原生存储两种指标时间类型
大数据·人工智能·elasticsearch·搜索引擎·重构·全文检索
PC2005-cloud2 天前
Elasticsearch 学习笔记:集群实战(3 控制节点 + 3 数据节点部署与故障转移)
笔记·学习·elasticsearch
Devin~Y2 天前
从内容社区到AI智能客服:Spring Boot + Spring Cloud + Spring AI 全栈实战面试拆解
java·spring boot·redis·elasticsearch·spring cloud·kafka·mybatis
凤山老林2 天前
复杂检索引擎落地:Spring Boot + Elasticsearch 数据同步与高阶查询实战
spring boot·后端·elasticsearch
Elastic 中国社区官方博客3 天前
你的 AI agent 不需要你的 API 密钥:使用 OAuth 2.1 对 Elasticsearch MCP 服务器进行身份验证
大数据·运维·人工智能·elasticsearch·搜索引擎·全文检索