Logstash连接远程MySQL数据库,收集日志

logstash jdbc 各种数据库配置

MySQL数据库

Driver ="path/to/jdbc-drivers/mysql-connector-java-5.1.35-bin.jar"   //驱动程序
Class  ="com.mysql.jdbc.Driver"; 
URL  ="jdbc:mysql://localhost:3306/db_name";                           //连接的URL,db_name为数据库名

SQL server数据库

Driver ="path/to/jdbc-drivers/sqljdbc4.jar"
Class  ="com.microsoft.jdbc.sqlserver.SQLServerDriver";
URL   ="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_name";     //db_name为数据库名

Oracle数据库

Driver ="path/to/jdbc-drivers/ojdbc6-12.1.0.2.jar"
Class  ="oracle.jdbc.driver.OracleDriver";
URL   ="jdbc:oracle:thin:@loaclhost:1521:orcl";     //orcl为数据库的SID

DB2数据库

//连接具有DB2客户端的Provider实例 
Driver ="path/to/jdbc-drivers/jt400.jar"
Class  ="com.ibm.db2.jdbc.app.DB2.Driver"; 
URL   ="jdbc:db2://localhost:5000/db_name";     //db_name为数据可名

PostgreSQL数据库

Driver ="path/to/jdbc-drivers/postgresql-9.4.1201.jdbc4.jar"
Class  ="org.postgresql.Driver";            //连接数据库的方法 
URL   ="jdbc:postgresql://localhost/db_name";      //db_name为数据可名

原文:https://www.cnblogs.com/a-du/p/7612671.html


一、logstash安装mysql的JDBC驱动

1、官网下载地址:https://dev.mysql.com/downloads/connector/j/

2、下载下来后使用 rz命令 上传到linux中(没有该命令就安装:yum -y install lrzsz )

3、移动、解压到映射到docker中logstash的配置路径中

cp mysql-connector-java-5.1.48.tar.gz /opt/elk-data/conf/

cd /opt/elk-data/conf/

tar -zxvf mysql-connector-java-5.1.48.tar.gz 

解压后文件夹中的这个jar文件就是我们需要的驱动包啦

二、logstash配置JDBC

root@6b7e8249a524:/opt/conf# vim jdbc.conf 

input {
    stdin {
    }
    jdbc {jdbc_user => "admin"
      jdbc_connection_string => "jdbc:mysql://10.10.88.4:3306/zerotrust_db?useSSL=false&useUnicode=true&characterEncoding=GB2312&zeroDateTimeBehavior=convertToNull&autoReconnect=true"
      jdbc_password => "1Qazxsw2#"
      jdbc_driver_library => "/opt/conf/mysql-connector-java-5.1.48/mysql-connector-java-5.1.48-bin.jar"
      jdbc_driver_class => "com.mysql.jdbc.Driver"
      jdbc_paging_enabled => "true"
      jdbc_page_size => "50000"
      statement => "SELECT * from audit"
      schedule => "* * * * *"
      type => "jdbc"
    }
}
output {
    stdout { codec => rubydebug }
    elasticsearch {
        hosts => ["localhost:9200"]
        index => "jdbc-%{+YYYY.MM.dd}"
    }
}

 启动命令:

/opt/logstash/bin/logstash -f /opt/conf/jdbc.conf --config.reload.automatic

在xshell控制台中文乱码了(暂时没有解决,要是有哪位大佬知道原因请告知一下,谢谢~)

但是在kibana是正常的中文显示


三、数据同步常见问题

1 elasticsearch数据重复以及增量同步

在默认配置下,tracking_column这个值是@timestamp,存在elasticsearch就是_id值,是logstash存入elasticsearch的时间,这个值的主要作用类似mysql的主键,是唯一的,但是我们的时间戳其实是一直在变的,所以我们每次使用select语句查询的数据都会存入elasticsearch中,导致数据重复。
解决方法:在要查询的表中,找主键或者自增值的字段,将它设置为_id的值,因为_id值是唯一的,所以,当有重复的_id的时候,数据就不会重复

 

  // 是否记录上次执行结果, 如果为真,将会把上次执行到的 tracking_column 字段的值记录下来,保存到 last_run_metadata_path 指定的文件中
  record_last_run => "true"

  // 是否需要记录某个column 的值,如果record_last_run为真,可以自定义我们需要 track 的 column 名称,此时该参数就要为 true. 否则默认 track 的是 timestamp 的值.
  use_column_value => "true"

  // 如果 use_column_value 为真,需配置此参数. track 的数据库 column 名,该 column 必须是递增的. 一般是mysql主键
  tracking_column => "autoid"

2 数据同步频繁,影响mysql数据库性能

我们写入jdbc.sql文件的mysql语句是写死的,所以每次查询的数据库有很多是已经不需要去查询的,尤其是每次select * from table;的时候,对mysql数据库造成了非常大的压力

解决:
(1)根据业务需求,可以适当修改定时同步时间,我这里对实时性相对要求较高,因此设置了10分钟

 

  // 这里类似crontab,可以定制定时操作,比如每10分钟执行一次同步(分 时 天 月 年)
  schedule => "*/10 * * * *"

(2)设置mysql查询范围,防止大量的查询拖死数据库

 

  // 如果 use_column_value 为真,需配置此参数. track 的数据库 column 名,该 column 必须是递增的. 一般是mysql主键
  tracking_column => "autoid"

  // 上次执行数据库的值,该值是上次查询时tracking_column设置的字段最大值
  last_run_metadata_path => "/opt/logstash/conf/last_id"

  // 是否清除 last_run_metadata_path 的记录,如果为真那么每次都相当于从头开始查询所有的数据库记录
  clean_run => "false"

在sql语句这里设置select * from WHERE autoid > :sql_last_value;
注意:如果你的语句比较复杂,autoid > :sql_last_value一定要写在WHERE后面,然后接AND即可。

3 增量同步和mysql范围查询导致mysql数据库有修改时无法同步到以前的数据

增量同步解决了,mysql每次都小范围查询,解决了数据库压力的问题,不过却导致无法同步老数据的修改问题

解决:可根据业务状态来做,如果你数据库是修改频繁类型,那只能做全量更新了,但是高频率大范围扫描数据库来做的索引还不如不做索引了(因为建立索引也是有成本的),我们做索引主要是针对一些数据量大,不常修改,很消耗数据库性能的情况。我这里是数据修改较少,而且修改也一般是近期数据,因为同步时,我在mysql范围上面稍微调整一下

如:autoid > (:sql_last_value-100000),每次扫描上次扫描范围往之前再多10W行,这样扫描的数据量相对较小,也照顾到了可能会修改的数据类型

但是范围扫描还存在一个问题,就是过往的数据写入了elasticsearch之后,如果有修改,而又不在范围扫描以内,那么elasticsearch就不会同步到。因此,我们还可以定期做一次全量或者更大范围的同步,只需要修改范围值即可。具体的值当然可以根据业务来定。

4、Jdbc配置

input {
    stdin {
    }
    jdbc {
      // mysql相关jdbc配置
      jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/your_mysql_database"
      jdbc_user => "mysql_user"
      jdbc_password => "mysql_password"
 
      // jdbc连接mysql驱动的文件目录,可去官网下载:https://dev.mysql.com/downloads/connector/j/
      jdbc_driver_library => "/opt/logstash/conf/mysql-connector-java/mysql-connector-java-5.1.44-bin.jar"
      # the name of the driver class for mysql
      jdbc_driver_class => "com.mysql.jdbc.Driver"
      jdbc_paging_enabled => "true"
      jdbc_page_size => "50000"

      // mysql文件, 也可以直接写SQL语句在此处,如下:
      // statement => "SELECT * from Table_test;"
      statement_filepath => "/opt/logstash/conf/jdbc.sql"

      // 这里类似crontab,可以定制定时操作,比如每10分钟执行一次同步(分 时 天 月 年)
      schedule => "*/10 * * * *"
      type => "jdbc"

      // 是否记录上次执行结果, 如果为真,将会把上次执行到的 tracking_column 字段的值记录下来,保存到 last_run_metadata_path 指定的文件中
      record_last_run => "true"

      // 是否需要记录某个column 的值,如果record_last_run为真,可以自定义我们需要 track 的 column 名称,此时该参数就要为 true. 否则默认 track 的是 timestamp 的值.
      use_column_value => "true"

      // 如果 use_column_value 为真,需配置此参数. track 的数据库 column 名,该 column 必须是递增的. 一般是mysql主键
      tracking_column => "autoid"

      last_run_metadata_path => "/opt/logstash/conf/last_id"

      // 是否清除 last_run_metadata_path 的记录,如果为真那么每次都相当于从头开始查询所有的数据库记录
      clean_run => "false"

      //是否将 字段(column) 名称转小写
      lowercase_column_names => "false"
    }
}

// 此处我不做过滤处理,如果需要,也可参考elk安装那篇
filter {}

output {
    // 输出到elasticsearch的配置
    elasticsearch {
        hosts => ["127.0.0.1:9200"]
        index => "jdbc"

        // 将"_id"的值设为mysql的autoid字段
        document_id => "%{autoid}"
        template_overwrite => true
    }

    // 这里输出调试,正式运行时可以注释掉
    stdout {
        codec => json_lines
    }
}

sql语句为:

SELECT  *  FROM  Table_test  WHERE  autoid > :sql_last_value


作者:我是一名搬运工
链接:https://www.jianshu.com/p/2b236f454323
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


实测有效:

input {
    stdin {
    }
    jdbc {
      jdbc_user => "admin"
      jdbc_connection_string => "jdbc:mysql://10.10.88.4:3306/zerotrust_db"
      jdbc_password => "1Qazxsw2#"
      jdbc_driver_library => "/opt/conf/mysql-connector-java-5.1.48/mysql-connector-java-5.1.48-bin.jar"
      jdbc_driver_class => "com.mysql.jdbc.Driver"
      jdbc_paging_enabled => "true"
      jdbc_page_size => "50000"
      statement => "SELECT * from audit"
      schedule => "* * * * *"
      type => "jdbc"

      lowercase_column_names => "true"
      record_last_run => "true"
      use_column_value => "true"
      tracking_column => "id"
      last_run_metadata_path => "/opt/conf/last_id"
      clean_run => "false"
    }
}
output {
    stdout { codec => rubydebug }
    elasticsearch {
        hosts => ["localhost:9200"]
        index => "jdbc-%{+YYYY.MM.dd}"
        document_id => "%{id}"
        template_overwrite => true
    }
}

 将数据库的主键当做ES中的_id,数据就不会出现重复的问题,而且也会实时更新

数据库添加三条数据,数据量变成5658:

刷新kibana,数据量也变成5658,实时更新成功

欧耶!

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值