LogStash是一款用来同步数据至ES的工具。往ES中放置的数据体量都比较大。
在MySQL的应用场景里,也会存在数据体量到达一定程度——–>此时MySQL自身的‘like’类查询并不能很好的支持查询要求,甚至可能会导致崩溃的情况。
这种时候,ES的作用就凸显出来了。它是专治庞大数据场景下的理想存在。
当你学会es的基本使用后,同步你所用数据库中的数据至ES也必将成为需要习得的一门重要技能!
好的,接下来就说说,我在学习这门技能的过程中遇到的问题和趟过之后的总结:
环境说明: windows7+elasticsearch 5.5.0+LogStash 5.5.0
前提说明:进入到了elasticsearch安装目录的bin目录下,运行(手动双击或者在cmd命令行下)elasticsearch.bat,运行的成功的话,在浏览器的地址栏中输入:localhost:9200
你会得到一段返回的json结果。
然后进入到logstash的bin目录下,输入下方提及的命令。
①:单表同步
单表同步的操作非常简单。
在logStash的bin目录下创建xxx.conf配置文件。然后运行命令 logstash.bat -f xxx.conf
,
如果在cmd的窗口中看到了select * xxxx 之类的json输出语句,则说明同步是成功了的。可以借助es的header插件,开启header插件后,去查看同步的数据(header插件的具体安装方法,请自己搜索)。
以我的为例:
文件名:mysql-logstash.conf
input {
stdin { }
jdbc {
#需要同步的数据库
jdbc_connection_string => "jdbc:mysql://localhost:3306/sakila"
jdbc_user => "root"
jdbc_password => "123456"
#本地jar包
jdbc_driver_library => "E:/TomcatServer/apache-tomcat-8.0.43/123/iserm_server/WEB-INF/lib/mysql-connector-java-5.1.41.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
#获取到记录的SQL查询语句
statement => "SELECT * FROM category"
#定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
}
}
output {
stdout {
codec => json_lines
}
elasticsearch {
#ESIP地址与端口
hosts => "localhost:9200"
#ES索引名称(自己定义的)
index => "category2-test"
#文档类型
document_type => "category"
#文档类型id,%{category_id}意思是取查询出来的category_id的值,并将其映射到es中_id字段中
document_id => "%{category_id}"
}
}
然后在bin目录下运行 logstash.bat -f mysql-logstash.conf
即可。
②:多表同步
多表同步的方法其实跟单标同步的差不多,只是多了一个type而已
同样以我自己的为例,文件名:mySQL-logStash-MultiTable.conf
input {
stdin { }
jdbc {
type => "tongbu01"
jdbc_connection_string => "jdbc:mysql://localhost:3306/sakila"
jdbc_user => "root"
jdbc_password => "123456"
jdbc_driver_library => "E:/TomcatServer/apache-tomcat-8.0.43/123/iserm_server/WEB-INF/lib/mysql-connector-java-5.1.41.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
#添加增量类配置
record_last_run => "true"
use_column_value => "true"
tracking_column => "actor_id"
tracking_column_type => numeric
clean_run => "false"
jdbc_page_size => "50000"
#获取到记录的SQL查询语句
statement => "SELECT * FROM actor"
#定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
}
jdbc {
type => "tongbu02"
jdbc_connection_string => "jdbc:mysql://localhost:3306/sakila"
jdbc_user => "root"
jdbc_password => "123456"
jdbc_driver_library => "E:/TomcatServer/apache-tomcat-8.0.43/123/iserm_server/WEB-INF/lib/mysql-connector-java-5.1.41.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
#添加增量类配置
record_last_run => "true"
use_column_value => "true"
tracking_column => "country_id"
tracking_column_type => numeric
clean_run => "false"
jdbc_page_size => "50000"
#获取到记录的SQL查询语句
statement => "SELECT * FROM country"
#定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
}
}
output {
stdout {
codec => json_lines
}
if[type]=="tongbu01"{
elasticsearch {
#ESIP地址与端口
hosts => "localhost:9200"
#ES索引名称(自己定义的)
index => "tongbu01-test-increment"
#文档类型
document_type => "tongbu01"
#文档类型id
document_id => "%{actor_id}"
}
}
if[type]=="tongbu02"{
elasticsearch {
#ESIP地址与端口
hosts => "localhost:9200"
#ES索引名称(自己定义的)
index => "tongbu02-test-increment"
#文档类型
document_type => "tongbu02"
#文档类型id
document_id => "%{country_id}"
}
}
}
然后在bin目录下运行 logstash.bat -f mySQL-logStash-MultiTable.conf
即可。
③:自定义mapping
关于mapping:
摘自:http://blog.csdn.net/lvhong84/article/details/23936697
一个mapping由一个或多个analyzer组成, 一个analyzer又由一个或多个filter组成的。当ES索引文档的时候,它把字段中的内容传递给相应的analyzer,analyzer再传递给各自的filters。
总的来说,mapping就是借助自身的(或用户自定义)的过滤器和分析规则把你传给它的数据解析出来,呈现给你。mapping的作用就是执行一系列的指令将输入的数据转成可搜索的索引项。
这里需要注意的是,如果是需要以别名的方式(驼峰命名法那种)同步数据的,记得要在上述的conf文件中加入一句配置说明:
如果不那样做的,logstash会全部给你映射成小写的列。从而导致你在映射id时出错。
与其相对应的SQL语句可以设定为:
如果上述的方法都不能满足你要求的,还可以考虑用mapping,es支持自定义mapping。
下方是代码片段参考
/*创建索引*/
CreateIndexRequestBuilder cib=client.admin().indices().prepareCreate(article);
/*添加映射*/
XContentBuilder mapping = XContentFactory.jsonBuilder()
.startObject()
.startObject("properties") //设置之定义字段
.startObject("Author")
.field("type","string") //设置数据类型
.endObject()
最终的结果:
自定义mapping(正常情况下)
大小写区分:
想查看更多的自定义mapping细节,请看下方链接:
elasticsearch__1__java操作之连接es,创建Mapping,保存数据 - CSDN博客
http://blog.csdn.net/xiaohulunb/article/details/37572763
④:集群健康值
我自己是在黄色的状态下同步的数据,红色状态下还没尝试过。但是,红色状态并非是个好的状态,需要去调整。如果有需要的,请看这里-->http://blog.csdn.net/laoyang360/article/details/78443006
------分-----------割----------线--------
写在最后:
如果是遇到了问题,先别着急。静下心来切看(实际上,你着急也没什么卵用,只会自乱阵脚)。
先自己思考下,然后再去搜相关的解决方案,你会更有收获的。
写的不是很好,若是有能帮到你的地方,那即是我莫大荣幸!