Elasticsearch如何对超1万份文档执行Reindex实现全量无丢失迁移
问题原因
你请求中source.size = 10000定义的是reindex单次scroll请求拉取的批次大小,并不是迁移的总文档数上限。仅迁移1万份文档的核心原因是默认的scroll上下文有效期过短,拉取完第一批数据后上下文失效,无法继续拉取剩余文档。
你配置的version_type=external会保留原文档的版本号,即使已经迁移过部分文档,重新执行全量reindex请求只会补传未迁移的文档,不会造成重复写入或数据覆盖,无需单独处理已迁移的1万条数据。
无丢失全量迁移方案
- 步骤1:前置优化(可选,提升迁移效率)
迁移前先调整新索引B的配置,降低迁移过程中的资源消耗,加快迁移速度:
PUT B/_settings { "number_of_replicas": 0, "refresh_interval": -1 }
- 步骤2:执行后台reindex任务
使用如下请求发起迁移,wait_for_completion=false会让任务在后台执行,避免前端连接超时中断,scroll=30m将scroll上下文有效期设为30分钟,足够覆盖2.6万文档的迁移周期:
POST _reindex?wait_for_completion=false&scroll=30m { "source": { "index": "A", "size": 10000 }, "dest": { "index": "B", "version_type": "external" } }
请求返回后会拿到任务ID,格式类似{"task": "节点ID:任务编号"}。
如果你的索引A分片数大于1,可以加sliced切片配置实现并行迁移,进一步提升速度,slice的max值和索引A的分片数保持一致即可:
POST _reindex?wait_for_completion=false&scroll=30m { "source": { "index": "A", "size": 10000, "slice": { "id": 0, "max": 3 } }, "dest": { "index": "B", "version_type": "external" } }
- 步骤3:监控迁移进度
可以通过任务ID查询迁移进度:
GET _tasks/<替换为你拿到的任务ID>
也可以直接对比两个索引的文档总量,确认迁移是否完整:
GET A/_count GET B/_count
- 步骤4:恢复新索引配置
确认两个索引文档数量完全一致后,把索引B的配置恢复为业务需要的参数:
PUT B/_settings { "number_of_replicas": 1, "refresh_interval": "1s" }
后续如果需要切流,直接把业务访问的别名切换到索引B即可完成字段类型的平滑变更。
内容的提问来源于stack exchange,提问作者user404
相关产品推荐
相关产品推荐

