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 使用以下策略保留大数字精度:
- 读取阶段:使用
json.Decoder.UseNumber()
保持数字原始字符串形式 - 存储阶段:将大数字以字符串形式存储,避免float64转换
- 写入阶段:使用自定义序列化器,将字符串形式的数字作为纯数字输出到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)
- 确保源和目标 Elasticsearch 集群网络可达
- 批次大小和并发数需要根据集群性能调整
- 大索引同步时建议使用较大的scrollTimeoutSeconds值
- 同步过程中会显示实时进度
MIT