小毛驴搬家公司 - Elasticsearch 数据迁移与同步工具,支持模板、索引和数据的同步。
小搬家公司上线!帮你把 ES 数据从源端运到目标端,支持断点续传,累了歇会儿接着搬~
go install cnb.cool/zhiqiangwang/elasticsearch-sync@latest
elasticsearch-sync --help
| 选项 | 环境变量 | 默认值 | 描述 |
|---|---|---|---|
--input-host | INPUT_HOST | http://127.0.0.1:9200 | 源 Elasticsearch 服务地址(小毛驴要从这里出发搬东西) |
--input-username | INPUT_USERNAME | - | 源 ES 认证用户名(小毛驴要进门需要的通行证) |
--input-password | INPUT_PASSWORD | - | 源 ES 认证密码(小毛驴要进门需要的密码) |
--input-type | INPUT_TYPE | es5 | 源数据来源方式(es5 直接读取,fs 从打包文件读取) |
--output-host | OUTPUT_HOST | http://127.0.0.1:9200 | 目标 Elasticsearch 服务地址(小毛驴要把东西搬到这里) |
--output-username | OUTPUT_USERNAME | - | 目标 ES 认证用户名(小毛驴要进门需要的通行证) |
--output-password | OUTPUT_PASSWORD | - | 目标 ES 认证密码(小毛驴要进门需要的密码) |
--output-type | OUTPUT_TYPE | fs | 目标输出方式 (es5 或 fs)(小毛驴要把东西放到哪里) |
--fs-dir | FS_DIR | backups | 文件系统目录(当 input-type=fs 或 output-type=fs 时有效)(小毛驴要从哪个文件夹读取或写入文件) |
--disable-store | DISABLE_STORE | false | 禁用断点续传存储(不保存迁移进度)(小毛驴要不要记住自己搬到哪了) |
模板迁移(魔法师复制模板)
魔法师来啦!帮你在目标集群复制和源集群一样的魔法模板~
elasticsearch-sync templates [全局选项]
索引迁移(施工队建楼)
施工队来啦!帮你在目标集群搭建和源集群一样的索引结构~
elasticsearch-sync indices [全局选项] [--indices 索引名1,索引名2]
| 选项 | 描述 |
|---|---|
--indices | 指定要搭建的索引(不指定就全搭,小心累坏建筑工人) |
数据迁移(小毛驴搬家公司)
小搬家公司上线!从源 ES 集群把数据偷偷运到目标集群~
elasticsearch-sync data [全局选项] [--indices 索引名1,索引名2] [--size 1000] [--query '{"query":{...}}']
| 选项 | 描述 | 默认值 |
|---|---|---|
--indices | 指定要搬家的索引(不指定就全搬,小心累坏小毛驴) | 所有开放的索引 |
--size | 每次搬运的文档数量(不要贪多,小毛驴一次扛不动太多) | 1000 |
--query | 查询条件 (JSON 格式)(想搬哪些宝贝?给个清单先~) | - |
./elasticsearch-sync templates \ --input-host http://source-es:9200 \ --input-username admin \ --input-password password \ --output-host http://target-es:9200 \ --output-username admin \ --output-password password
./elasticsearch-sync indices \ --input-host http://source-es:9200 \ --output-host http://target-es:9200 \ --indices index1,index2
./elasticsearch-sync data \ --input-host http://source-es:9200 \ --output-host http://target-es:9200 \ --size 2000
使用 --query 参数指定查询条件,只迁移符合条件的数据:
# 迁移 status 为 active 的文档
./elasticsearch-sync data \
--input-host http://source-es:9200 \
--output-host http://target-es:9200 \
--indices my_index \
--query '{"query":{"match":{"status":"active"}}}'
# 迁移指定时间范围内的文档
./elasticsearch-sync data \
--input-host http://source-es:9200 \
--output-host http://target-es:9200 \
--indices logs \
--query '{"query":{"range":{"timestamp":{"gte":"2024-01-01","lte":"2024-12-31"}}}}'
# 使用 term 查询迁移特定类型的文档
./elasticsearch-sync data \
--input-host http://source-es:9200 \
--output-host http://target-es:9200 \
--indices products \
--query '{"query":{"term":{"category":"electronics"}}}'
使用 --output-type=fs 将数据导出到本地文件系统:
# 导出模板到文件
./elasticsearch-sync templates \
--input-host http://source-es:9200 \
--output-type fs \
--fs-dir ./my_export
# 导出索引结构到文件
./elasticsearch-sync indices \
--input-host http://source-es:9200 \
--output-type fs \
--fs-dir ./my_export \
--indices index1,index2
# 导出数据到文件
./elasticsearch-sync data \
--input-host http://source-es:9200 \
--output-type fs \
--fs-dir ./my_export \
--indices my_index \
--size 1000
文件输出目录结构:
my_export/ # --output-fs-dir 指定的目录
├── templates/ # 模板文件目录
│ ├── test.json # 模板文件(模版名称命令)
├── indices/ # 索引结构文件目录
│ ├── test.json # 索引文件(索引名称命令)
└── data/ # 数据文件目录
├── 5b6c7d8e...data # 数据文件(内容 MD5 命名,带换行json数据)
除了命令行参数外,还可以通过环境变量进行配置:
# 设置源 ES 配置
export INPUT_HOST="http://source-es:9200"
export INPUT_USERNAME="admin"
export INPUT_PASSWORD="password"
# 设置目标 ES 配置
export OUTPUT_HOST="http://target-es:9200"
export OUTPUT_USERNAME="admin"
export OUTPUT_PASSWORD="password"
# 执行命令
./elasticsearch-sync templates
数据迁移命令默认支持断点续传功能,迁移进度会保存在 .data 目录中。如果迁移过程中断,下次执行相同命令时会自动从断点继续。
如果不需要断点续传功能(例如一次性迁移或测试场景),可以通过以下方式禁用:
# 使用命令行参数
./elasticsearch-sync data --disable-store
# 或使用环境变量
export DISABLE_STORE=true
./elasticsearch-sync data
断点续传的进度文件存储在用户主目录下的 .elasticsearch-sync/.data 目录中:
~/.elasticsearch-sync/.data/ # 进度存储目录
├── job.json # 待迁移索引列表
├── progress_index1.json # index1 的迁移进度
└── progress_index2.json # index2 的迁移进度
Apache License 2.0