Skip to content

ElasticSync 是一个高性能的 Elasticsearch 数据同步工具,支持在线同步、导出和导入功能。

Notifications You must be signed in to change notification settings

zhuhedong/elasticsearch

Repository files navigation

ElasticSync - Elasticsearch数据同步工具

概述

ElasticSync 是一个高性能的 Elasticsearch 数据同步工具,支持在线同步、导出和导入功能。

功能特性

  • ✅ 在线实时同步 ES 索引数据
  • ✅ 导出索引为 NDJSON 格式
  • ✅ 从 NDJSON 文件导入数据
  • ✅ 支持大数字精度保留(超过JavaScript MAX_SAFE_INTEGER的数字)
  • ✅ 并发处理,支持多worker
  • ✅ 失败重试机制
  • ✅ 实时进度报告

使用方法

在线同步

# 同步所有配置的索引
./elasticsync

# 同步指定索引
./elasticsync -mode sync -job source-index-name

数据导出

./elasticsync -mode export -job source-index -file export.ndjson

数据导入

./elasticsync -mode import -job target-index -file export.ndjson

配置说明

配置文件路径:configs/config.yaml

source:
  addresses: ["http://source-es:9200"]
  username: "elastic"
  password: "password"
  
target:
  addresses: ["http://target-es:9200"]
  username: "elastic"
  password: "password"
  
sync:
  batchSize: 2000          # 批次大小
  workerCount: 4           # 并发数
  retryMax: 3              # 重试次数
  retryBackoffMs: 500      # 重试间隔(毫秒)
  indices:                 # 索引映射
    - source: "source-index"
      target: "target-index"

大数字精度处理

问题背景

JavaScript的Number类型只能安全表示 -(2^53-1) 到 2^53-1 之间的整数(MAX_SAFE_INTEGER = 9007199254740991)。 超过这个范围的数字会丢失精度,例如:

  • 原始值:728591169268744795
  • 错误值:728591169268744800

解决方案

ElasticSync 使用以下策略保留大数字精度:

  1. 读取阶段:使用 json.Decoder.UseNumber() 保持数字原始字符串形式
  2. 存储阶段:将大数字以字符串形式存储,避免float64转换
  3. 写入阶段:使用自定义序列化器,将字符串形式的数字作为纯数字输出到JSON

相关文件:

  • internal/source/json_decoder.go - JSON解码器
  • internal/source/elasticsearch.go - ES数据读取
  • internal/writer/number_handler.go - 大数字序列化处理
  • internal/writer/bulk_writer.go - 批量写入

编译

go build -o elasticsync cmd/elasticsync/main.go

环境变量

  • ELASTICSYNC_CONFIG - 自定义配置文件路径(默认:configs/config.yaml)

注意事项

  1. 确保源和目标 Elasticsearch 集群网络可达
  2. 批次大小和并发数需要根据集群性能调整
  3. 大索引同步时建议使用较大的scrollTimeoutSeconds值
  4. 同步过程中会显示实时进度

License

MIT

About

ElasticSync 是一个高性能的 Elasticsearch 数据同步工具,支持在线同步、导出和导入功能。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published