为什么要这样同步到es查es而不直接去查mysql呢????其实原因很简单,就是为了减少mysql的压力,比如说我现在业务需要查一个看课历史,这个看课历史总是导致慢sql或者同一时间总是调用很多,导致mysql的cpu总是很高,这个时候就可以使用logstash将数据同步到es中,直接从es中查数据
废话不多说开始配置
1.首先使用以下命令安装logstash
brew install logstash
2.看网上有很多教程要下载安装logstash-input-jdbc,好像7.0.0版本以上的logstash都好像自带了这个,所以无需下载
3.进入安装目录配置logstash
/usr/local/Cellar/logstash/7.6.1/libexec/config
4.打开文件logstash-sample.conf
vim logstash-sample.conf
内容如图
5.我们将这个文件复制一份然后修改他
cp logstash-sample.conf my-logstash.conf
vim my-logstash.conf
6.my-logstash.conf 的内容为下
input {
jdbc {
type => "id"
#数据库连接信息
jdbc_connection_string => "jdbc:mysql://www.xintujing.cn:33061/xtj_edu?&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true"
#设置时区
jdbc_default_timezone => "Asia/Shanghai"
#数据库用户名
jdbc_user => "root"
#数据库密码
jdbc_password => "qidaoyun1686806800@qdy"
#数据库驱动路径
jdbc_driver_library => "/Users/luziyuan/.m2/repository/mysql/mysql-connector-java/8.0.15/mysql-connector-java-8.0.15.jar"
#驱动类名
jdbc_driver_class => "com.mysql.jdbc.Driver"
#定时执行频率 每分钟
schedule => "* * * * *"
#使用字段追踪
use_column_value => true
#追踪字段
tracking_column => "updated_at"
#追踪字段类型
tracking_column_type => "timestamp"
#是否记录上一次执行到的追踪字段的值
record_last_run => true
#上一次执行到的追踪字段的值存放路径 手动创建
last_run_metadata_path => "./logs/logstash_default_last_time.log"
#是否清除last_run_metadata_path记录,如果为true,每次都从头开始查询所有数据,增量更新设置为false
clean_run => false
#是否将字段强制转为小写
lowercase_column_names => false
#sql语句,可用 statement_filepath 参数代替,值为执行的sql文件,注意要查询追踪字段
statement => "SELECT * from course_house"
}
}
filter {
}
output {
if[type] == "id" {
elasticsearch {
#ES地址:端口
hosts => ["127.0.0.1:9200"]
#自定义索引
index => "house"
#设置自增主键ID
document_id => "%{id}"
#user => "elastic"
#password => "changeme"
}
}
stdout {
#以JSON格式输出
codec => json_lines
}
}
说明:
input中都是配置的一些数据库的一些内容
type=>一般都写成数据库中的主键
tracking_column=> 一般都是写表中的更新时间字段(注意这里是指mysql中的时间字段)像我这里就是写的updated_at字段,一般类型都是timestamp
output中都是配置es的内容
index => 表示将这个mysql表中的数据存储到es中的索引名称
document_id => 表示设置es中的_id的值,我这里直接取数据库中的主键id给它赋值
7.配置好如上以后就可以启动了
./bin/logstash -f ./libexec/config/my-logstash.conf
如果启动logstash并没有一直处于运行,而是直接shut down了回到命令行这个表示启动失败,
可能是由于你.config文件中写的东西有误,或者是可能你写了些东西导致系统无法读取现有文件yml
如果启动logstash成功并没有直接shut down,查看es日志也没有报错,但是es中只存储有一条数据,这个可能是你的 document_id读取的字段有问题,可能它并不是唯一的,导致es读取了一个以后下一条读取的内容和之前一样无法继续赋值给_id,所以只存储了一条就没法继续存储了。