【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

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

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

相关推荐
liuhl09106 小时前
【无标题】
大数据·elasticsearch·搜索引擎
xbgRS8 小时前
Elasticsearch的查询
elasticsearch
Elasticsearch11 小时前
使用 Lucene 搜索你的 Bean —— Highlighting
elasticsearch
Elasticsearch11 小时前
使用 Lucene 搜索你的 Bean —— Elasticsearch
elasticsearch
Elasticsearch16 小时前
最好的 LLM 只有 59% 的时间能写出正确的 Elasticsearch ES|QL。以下是另外 41% 出错的原因
elasticsearch
垚垚学技术_聚焦云原生16 小时前
Ansible Role 生产环境标准目录结构与规范化实践
java·elasticsearch·ansible
小林ixn16 小时前
从 MySQL 的 LIKE 到 ES 倒排索引:一次把全文检索和混合检索讲透
sql·elasticsearch·全文检索·agent·关键词
MayBaymax17 小时前
ES 基础总结
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客17 小时前
两个依赖和一个配置块:通过 Prometheus 远程写入将 Spring Boot 指标发送到 Elasticsearch
大数据·数据库·spring boot·elasticsearch·搜索引擎·全文检索·prometheus
SelectDB技术团队18 小时前
ELK 太占磁盘、ES 总报写入拒绝:从归因到可执行的优化清单
大数据·clickhouse·elk·elasticsearch·全文检索·复杂查询·实时更新