如何在ES 1.7.1同一集群用Logstash替代_reindex实现索引复制
ES 1.7.1同集群内索引复制的Logstash配置方案
没问题,针对你在ES 1.7.1集群内执行索引复制的需求,我帮你完善Logstash配置并说明关键要点:
完整的logstash.conf配置
input { # 从原索引读取数据 elasticsearch { hosts => "myhost" port => "9200" index => "my_index" size => 500 scroll => "5m" docinfo => true } } output { # 写入同集群的新索引 elasticsearch { hosts => "myhost" port => "9200" index => "my_index_new" # 替换成你想要的新索引名 document_id => "%{[@metadata][_id]}" # 保留原文档ID,避免生成新ID document_type => "%{[@metadata][_type]}" # 保留原文档的type(ES 1.7需要) flush_size => 500 # 和input的size对应,批量写入 } # 可选:开启stdout输出查看进度,调试完成后可以注释掉 stdout { codec => rubydebug } }
关键配置说明
Input部分:
scroll和size:通过scroll API批量读取原索引数据,size控制每次读取的文档数,scroll设置会话有效期,确保在数据读取完成前会话不失效。docinfo => true:开启后会获取原文档的元数据(_id、_type等),这是保留原文档信息的核心配置。
Output部分:
index:指定新的索引名称,必须和原索引区分开。document_id:使用原文档的ID,避免Logstash自动生成新ID导致数据重复或索引结构不一致。document_type:ES 1.7中索引有type概念,保留原type能保证数据结构和原索引一致。
操作注意事项
- 提前创建新索引:建议先手动创建新索引,并复制原索引的mapping和settings,避免Logstash自动生成的mapping不符合预期。创建命令示例:
curl -XPUT 'http://myhost:9200/my_index_new' -d '{ "settings": { # 复制原索引的settings }, "mappings": { # 复制原索引的mappings } }' - 调整批量参数:根据你的集群硬件性能,适当调整
size和flush_size,平衡复制速度和集群负载。 - 监控复制进度:可以通过ES的
_cat/countAPI查看新旧索引的文档数,确认复制是否完成:curl -XGET 'http://myhost:9200/_cat/count/my_index?v' curl -XGET 'http://myhost:9200/_cat/count/my_index_new?v' - 运行Logstash:进入Logstash安装目录,执行启动命令:
bin/logstash -f logstash.conf
内容的提问来源于stack exchange,提问作者letsc
相关产品推荐
相关产品推荐

