背景
对传统数据库来说,比如mysql,当需要数据迁移的时候,我们会有很多的方案可以实现,比如手动导出sql文件,再导入到新的数据库里;或者搭建主从复;或者直接使用mysql的dump命令来进行。那elasticsearch如果要进行数据迁移的时候,那要怎么进行呢?下面小编介绍一种方案,一起来看看吧。
方案
前期准备
源elasticsearch: 目标elasticsearch: logstash:
elasticsearch安装
可以参考我前面的文章:
logstash安装
下载
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.2.4.tar.gz
解压
tar -zxvf logstash-6.2.4.tar.gz
创建logstash配置文件
cd logstash-6.2.4/config
vi logstash.conf
logstash.conf的配置如下:
#源elasticsearch
input {
elasticsearch {
hosts => "ip:port"
index => "index_name"
#此处是es查询所有的数据,可以根据具体业务进行修改
query => '{ "query": { "match_all":{ }} }'
size => 500
scroll => "5m"
docinfo => true
codec => json
}
}
filter {
mutate {
rename => {
# 将字段http_referer重命名为http_source
"createTime" => "created_at"
"likeNum" => "like_counter"
}
# logstash 导出数据会产生一些特殊字段
remove_tag => ["_grokparsefailure"]
remove_field => ["@timestamp" , "@version"]
}
# 导出数据可以添加一些过滤条件
if[delete] == 1 {
drop {}
}
}
# 输出到目标elasticsearch
output {
elasticsearch {
#目标elasticsearch的ip和端口
hosts => ["target_ip:target_port"]
action => "update" #upsert 有则更新,无则插入
document_type => "_doc" # 索引type
document_id => "%{[@metadata][_id]}" # 索引对应的id 字段
index => "target_index_name" # 目标索引名称
doc_as_upsert => true
}
}
启动
bin/logstash -f config/file.conf
分析
启动之后,logstash就会根据input组件中query中的es语句,将源es的索引数据查询出来,将结果同步到目标es中,这样就完成了源es和目标es的数据同步。
结束
需要源码的可以关注公众号【温故知新之java】,更多干活与你分享。