如果logstash需要读取数据库,首先需要下载对应的Mysql数据库驱动包
mysql-connector-java-5.1.46.jar
可以查看mysql-connector-java驱动包与mysql数据库版本的对应关系
根据实际使用的数据库版本找到自己所需要的Mysql数据库驱动包,maven仓库下载对应的驱动包地址
https://repo1.maven.org/maven2/mysql/mysql-connector-java/两者版本的对应关系官网文档地址:
https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-versions.html (MySQL Connector/J 5.1 Developer Guide)
https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-versions.html (MySQL Connector/J 8.0 Developer Guide)
如果linux不可联外网,进入官网地址找自己所需要的版本下载压缩包
https://www.elastic.co/cn/downloads/past-releases#logstash
下载所需要对应的linux版本的logstash压缩包到本地,然后使用rz命令上传压缩文件到linux服务器上
可以联网的情况下,使用wget命令直接在服务器上下载压缩包,然后解压
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.9.2.zip
进入解压后的config目录下
cd /usr/local/elk/logstash/config
可自定义创建一个新的文件或者在原本的logstash-sample.conf文件上做修改
自定义一个jdbc的配置文件
vim jdbc.conf
内容如下:
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.
input {
stdin {
}
jdbc {
type => "test_user"
# 数据库连接地址
jdbc_connection_string => "jdbc:mysql://192.168.1.1:3306/test_database?characterEncoding=utf8&useSSL=false&Asia/Shanghai&rewriteBatchedStatements=true&tinyInt1isBit=false"
# 数据库连接账号密码;
jdbc_user => "test"
jdbc_password => "123456"
# MySQL依赖包路径;
jdbc_driver_library => "/usr/local/elk/mysql/mysql-connector-java-5.1.46.jar"
# the name of the driver class for mysql
jdbc_driver_class => "com.mysql.jdbc.Driver"
# 数据库重连尝试次数
connection_retry_attempts => "3"
# 判断数据库连接是否可用,默认false不开启
jdbc_validate_connection => "true"
# 数据库连接可用校验超时时间,默认3600S
jdbc_validation_timeout => "60000"
# 开启分页查询(默认false不开启);
jdbc_paging_enabled => "true"
# 单次分页查询条数(默认100000,若字段较多且更新频率较高,建议调低此值);
jdbc_page_size => "5000"
# statement为查询数据sql,如果sql较复杂,建议配通过statement_filepath配置sql文件的存放路径;
# sql_last_value为内置的变量,存放上次查询结果中最后一条数据tracking_column的值,此处即为ModifyTime;
#statement => "SELECT id,user_id,user_name,
#### 以下sql中DATE_FORMAT的操作为了数据库时间字段按照字符串的格式存储数据到ES索引,避免存储变成UTC时区格式
# DATE_FORMAT(create_time,'%Y-%m-%d %H:%i:%s') AS create_time,
# DATE_FORMAT(update_time,'%Y-%m-%d %H:%i:%s') AS update_time FROM test_user WHERE update_time>= :sql_last_value order by update_time asc"
# 由于设定sql查询返回字段值,使用自定义sql文件地址,test_user.sql文件就是一个select * from test_user类似的查询操作
statement_filepath => "/usr/local/elk/mysql/test_user.sql"
# 是否将字段名转换为小写,默认true(如果有数据序列化、反序列化需求,建议改为false);
lowercase_column_names => false
# Value can be any of: fatal,error,warn,info,debug,默认info;
sql_log_level => error
#
# 是否记录上次执行结果,true表示会将上次执行结果的tracking_column字段的值保存到last_run_metadata_path指定的文件中;
record_last_run => true
# 需要记录查询结果某字段的值时,此字段为true,否则默认tracking_column为timestamp的值;
use_column_value => true
# 需要记录的字段,用于增量同步,需是数据库字段
tracking_column => "update_time"
# Value can be any of: numeric,timestamp,Default value is "numeric"
tracking_column_type => timestamp
# record_last_run上次数据存放位置
# test_user_update_time.txt文件保存最后的更新时间,但数据库update_time字段更新时间大于该文件中的时间时,自动触发同步操作
last_run_metadata_path => "/usr/local/elk/mysql/test_user_update_time.txt"
# 是否清除last_run_metadata_path的记录,需要增量同步时此字段必须为false;
clean_run => false
#
# 同步频率(分 时 天 月 年),默认每分钟同步一次;该时间表达式根据实际需求自定义
schedule => "*/10 * * * *"
}
jdbc {
type => "test_role"
# 数据库连接地址
jdbc_connection_string => "jdbc:mysql://192.168.1.1:3306/test_database?characterEncoding=utf8&useSSL=false&Asia/Shanghai&rewriteBatchedStatements=true&tinyInt1isBit=false"
# 数据库连接账号密码;
jdbc_user => "test"
jdbc_password => "123456"
# MySQL依赖包路径;
jdbc_driver_library => "/usr/local/elk/mysql/mysql-connector-java-5.1.46.jar"
# the name of the driver class for mysql
jdbc_driver_class => "com.mysql.jdbc.Driver"
# 数据库重连尝试次数
connection_retry_attempts => "3"
# 判断数据库连接是否可用,默认false不开启
jdbc_validate_connection => "true"
# 数据库连接可用校验超时时间,默认3600S
jdbc_validation_timeout => "60000"
# 开启分页查询(默认false不开启);
jdbc_paging_enabled => "true"
# 单次分页查询条数(默认100000,若字段较多且更新频率较高,建议调低此值);
jdbc_page_size => "500"
# statement为查询数据sql,如果sql较复杂,例如有join关联查询,需要一个索引冗余另一个索引一部分数据的情况,避免有些项目页面查询时需要查询两个索引
# 建议配通过statement_filepath配置sql文件的存放路径;
# sql_last_value为内置的变量,存放上次查询结果中最后一条数据tracking_column的值,此处即为ModifyTime;
#statement => "SELECT id,role_id,role_name,
#DATE_FORMAT(create_time,'%Y-%m-%d %H:%i:%s') AS create_time,
#DATE_FORMAT(update_time,'%Y-%m-%d %H:%i:%s') AS update_time FROM `test_role` WHERE update_time>= :sql_last_value order by update_time asc"
statement_filepath => "/usr/local/elk/mysql/test_role.sql"
# 是否将字段名转换为小写,默认true(如果有数据序列化、反序列化需求,建议改为false);
lowercase_column_names => false
# Value can be any of: fatal,error,warn,info,debug,默认info;
sql_log_level => error
#
# 是否记录上次执行结果,true表示会将上次执行结果的tracking_column字段的值保存到last_run_metadata_path指定的文件中;
record_last_run => true
# 需要记录查询结果某字段的值时,此字段为true,否则默认tracking_column为timestamp的值;
use_column_value => true
# 需要记录的字段,用于增量同步,需是数据库字段
tracking_column => "update_time"
# Value can be any of: numeric,timestamp,Default value is "numeric"
tracking_column_type => timestamp
# record_last_run上次数据存放位置;
last_run_metadata_path => "/usr/local/elk/mysql/test_role_update_time.txt"
# 是否清除last_run_metadata_path的记录,需要增量同步时此字段必须为false;
clean_run => false
#
# 同步频率(分 时 天 月 年),默认每分钟同步一次;
schedule => "*/10 * * * *"
}
}
output {
if [type] == "test_user" {
elasticsearch {
hosts => ["http://192.168.1.1:9200"]
# 配置ES集群地址
#hosts => ["192.168.1.1:9200", "192.168.1.2:9200", "192.168.1.3:9200"]
# 索引名字,必须小写
index => "test_user"
# 数据唯一索引(建议使用数据库KeyID)
document_id => "%{id}"
}
}
if [type] == "test_role" {
elasticsearch {
hosts => ["http://192.168.1.1:9200"]
# 配置ES集群地址
#hosts => ["192.168.1.1:9200", "192.168.1.2:9200", "192.168.1.3:9200"]
# 索引名字,必须小写
index => "test_role"
# 数据唯一索引(建议使用数据库KeyID)
document_id => "%{id}"
}
}
stdout {
codec => rubydebug
}
}
配置好后保存该文件
启动logstash,指定jdbc.conf配置文件启动
nohup ./logstash -f /usr/local/elk/logstash/config/jdbc.conf &