【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

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

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

相关推荐
秋知叶i2 小时前
【git命令】Git 删除远程分支保姆级教程(含缓存清理 + 本地残留绝杀)
git·elasticsearch·缓存
was1723 小时前
基于 Rust 的跨 Shell 提示符:Starship 安装与环境初始化指南
开发语言·elasticsearch·rust
不想看见4041 天前
Git的工作原理和基本使用
大数据·elasticsearch·搜索引擎
金牌归来发现妻女流落街头1 天前
【用 Java API Client 操作 Elasticsearch】
java·elasticsearch·jenkins
葱卤山猪1 天前
Git常用核心命令实操总结(新手避坑版)
大数据·git·elasticsearch
难忘经典1 天前
Java进阶(ElasticSearch的安装与使用)
java·elasticsearch·jenkins
深蓝轨迹1 天前
Git误操作急救手册
chrome·git·elasticsearch
ℒℴѵℯ陆·离ꦿ໊ོﻬ°1 天前
Git误操作急救手册
大数据·elasticsearch·搜索引擎
放下华子我只抽RuiKe51 天前
数据炼金术:机器学习背后的“脏活”与特征工程
人工智能·深度学习·elasticsearch·机器学习·搜索引擎·自然语言处理·数据挖掘