我们之前实现了elasticsearch的整合,但是elasticsearch本身就是为了解决关系型数据库中的数据搜索问题,本身其实严格来说是没有数据的,那么我们如何做到将数据库中的数据同步到elasticsearch中呢?
其实同步mysql数据到elasticsearch中的方法很多:go-mysql-elasticsearch,binlog等等。我们今天用的是Logstash,个人觉得比较简单,而且功能也很强大哦。
下面来讲讲具体实现吧
1、去官网下载对应es版本的 logstash-7.1.0 然后解压,放到你想要放置的目录
2、下载mysql连接库:
将mysql的驱动包放置到随便一个目录,只要下面的配置文件路径正确即可,可以自己建一个mysql,我的是logstash-7.1.0/mysql
3、修改配置文件,这个配置文件路径也是可以随便放,启动时候记得不要弄错路径即可,个人建议方法哦bin目录下,方便些
在bin目录下,创建配置文件(dbToEs.conf)
input {
jdbc {
#数据库驱动路径,如果是Oracle对应Oracle的驱动
jdbc_driver_library => "../mysql/mysql-connector-java-8.0.15.jar"
#驱动名
jdbc_driver_class => "com.mysql.jdbc.Driver"
#数据库地址
jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/db_test"
#数据库用户名
jdbc_user => "root"
#数据库密码
jdbc_password => "123456"
#定时任务,默认每分钟执行一次
schedule => "* * * * *"
#sql语句,也可以采用路径的方式
statement => "SELECT * from table1"
add_field => { "[@metadata][type]" => "mydb_data" }
}
jdbc {
jdbc_driver_library => "../mysql/mysql-connector-java-8.0.15.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/db_test"
jdbc_user => "root"
jdbc_password => "123456"
schedule => "* * * * *"
statement => "SELECT * from table2"
add_field => { "[@metadata][type]" => "mydb2_data" }
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
mutate {
remove_field => ["@timestamp","@version"]
}
}
output {
if [@metadata][type] == "mydb_help" {
elasticsearch {
hosts => [ "127.0.0.1:9200" ]
#manage_template => false
index => "mydb_data"
document_id => "%{id}"
document_type => "mydb_data"
}
} else if [@metadata][type] == "mydb_logo"{
elasticsearch {
#es地址端口
hosts => [ "127.0.0.1:9200" ]
#es主键
index => "mydb2_data"
document_id => "%{id}"
#文档类型
document_type => "mydb2_data"
}
}
}
上面我是对两个表进行了数据同步,所以两个jdbc然后启动就可以了,我的是在window下执行,切换打bin目录执行
logstash -f dbToEs.conf
然后你就会看到同步日志,每分钟都会执行一次。
-------------------------------------------写的不好,仅供参考------------------------------------------