使用logstash同步mysql数据到Elasticsearch

未安装es的可以参考这篇文章elasticsearch安装

logstash介绍

logstash是一个开源的数据收集引擎,具有准实时数据收集能力。
logstash能够将不同的数据规范的输出到你的目标仓储,比如elasticsearch;为下游的数据分析以及可视化提供数据清洗
最初logstash创新了日志收集的方式,后来用例就越来越多。

logstash 提供了海量的扩展插件用户丰富数据收集的方式。

这样一组配置就能实现一个数据收集
1、input 数据来源
2、filter数据做怎么处理
3、数据要输出到哪里去

input{}
filter{}
ouput{}

我们现在要介绍的就是 logstash-input-jdbc插件,用于收集来自mysql的数据。

logstash-input-jdbc

这个插件可以用于任何实现jdbc标准接口的数据库的数据,只需要在配置文件中配置相关的驱动以及指定驱动的类即可。该插件并未携带相关驱动,如果你需要使用需要下载相关驱动插件。可以通过以下两种方式指定,插件默认支持,无需单独下载。

  1. 下载mysql 的jdbc驱动包放到logstash-core/lib/jars目录下,在配置文件指定jdbc_driver_class
input {
  jdbc {
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/mydb"
    jdbc_user => "mysql"
    jdbc_password => "123456"
    statement => "SELECT * from songs where id>10"
	schedule => "* * * * *"
  }
}
  1. 在配置文件中指定jdbc_driver_library 、jdbc_driver_class
input {
  jdbc {
    jdbc_driver_library => "/path/mysql-connector-java-5.1.36-bin.jar"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/mydb"
    jdbc_user => "mysql"
    jdbc_password => "123456"
    statement => "SELECT * from songs where id>10"
	schedule => "* * * * *"
  }
}

以上配置中的 schedule => “* * * * *” 星号分别代表分、时、天、周、月 定时任务使用的时 rufus-scheduler

* * * * * 每分钟执行一次
星号代表每,每月的每天的每周的每时的每分钟执行一次
* 1 * * *  每天的1点的每分钟执行
1 1 * * * 每天11分执行一次
1 1 * * 1-3 13月份每周的每天的11分执行

对以上定时任务的使用差不多涵盖了大部分用法。

配置项数据类型是否必填默认值作用
clean_runbooleanNofalse是否保留之前的运行状态
columns_charsethashNo{}针对某多个列进行编码设置
connection_retry_attemptsnumberNo1连接db重试最大次数
connection_retry_attempts_wait_timenumberNo0.5两次连接之间等待时长
jdbc_connection_stringstringYesno defaultjdbc连接串
jdbc_default_timezonestringNono default时区
jdbc_driver_classstringYesno default驱动类
jdbc_driver_librarystringNono default驱动包
jdbc_fetch_sizenumberNono defaultJDBC fetch大小设置,如果没设置将获取默认jdbc的设置
jdbc_page_sizenumberNo100000jdbc分页大小
jdbc_paging_enabledbooleanNofalse是否开启分页
jdbc_passwordpasswordNono default密码
jdbc_password_filepatha valid filesystem pathNono default密码文件
jdbc_pool_timeoutnumberNo5在引发PoolTimeoutError之前等待获取连接的秒数
jdbc_userstringYesno default用户名
jdbc_validate_connectionbooleanNofalse是否验证链接
jdbc_validation_timeoutnumberNo3600验证超时时长
last_run_metadata_pathstringNo“/home/ph/.logstash_jdbc_last_run”最后一次执行数据记录文件
lowercase_column_namesbooleanNotrue列名小写
parametershashNo{}sql参数
record_last_runbooleanNotrue是否记录最后一次执行数据到last_run_metadata_path这个文件
schedulestringNono default定时认去表达式
sequel_optshashNo{}常规配置
sql_log_levelstring, one of [“fatal”, “error”, “warn”, “info”, “debug”]Noinfosql日志级别
statementstringNono defaultsql语句
statement_filepathavalid filesystem pathNono defaultsql文件路径
tracking_columnstringNono default追踪某列值(常用于增量更新)
tracking_column_typestring,one of [“numeric”, “timestamp”]No“numeric”追踪值得类型
use_column_valuebooleanNofalse是否开启追踪

根据以上配置我们就可以很容易得配置一个mysql数据采集得配置文件出来如下:

input{
	stdin{
	}
	jdbc{
		jdbc_connection_string => "jdbc:mysql://127.0.0.1/databaseA?characterEncoding=UTF-8&useSSL=false"
		jdbc_user => "root"
		jdbc_password => "123456"
		jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
		statement => "SELECT id,supplier_name AS name,last_modify_time FROM supplier_data WHERE last_modify_time > :sql_last_value"
		codec => plain { charset => "UTF-8"}
		use_column_value => false
		#tracking_column => last_modify_time
		record_last_run => true
		last_run_metadata_path => "/home/middleware/logstash/data/supplier_data/last-value.txt"
        schedule => "* * * * *"
		type => "supplier_data"
        jdbc_default_timezone => "Asia/Shanghai"
	}
	jdbc{
		jdbc_connection_string => "jdbc:mysql://127.0.0.1/databaseB?characterEncoding=UTF-8&useSSL=false"
		jdbc_user => "root"
		jdbc_password => "123456"
		jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
		statement => "SELECT id,customer_name AS name,last_modify_time FROM customer_data WHERE last_modify_time > :sql_last_value"
		codec => plain { charset => "UTF-8"}
		use_column_value => false
		#tracking_column => last_modify_time
		record_last_run => true
		last_run_metadata_path => "/home/middleware/logstash/data/customer_data/last-value.txt"
        schedule => "* * * * *"
		type => "customer_data"
        jdbc_default_timezone => "Asia/Shanghai"
	}
	jdbc{
		jdbc_connection_string => "jdbc:mysql://127.0.0.1/databaseC?characterEncoding=UTF-8&useSSL=false"
		jdbc_user => "root"
		jdbc_password => "123456"
		jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
		statement => "SELECT id,gc_name AS name,last_modify_time FROM goods_card WHERE last_modify_time > :sql_last_value"
		codec => plain { charset => "UTF-8"}
		use_column_value => false
		#tracking_column => last_modify_time
		record_last_run => true
		last_run_metadata_path => "/home/middleware/logstash/data/goods_card/last-value.txt"
        schedule => "* * * * *"
		type => "goods_card"
        jdbc_default_timezone => "Asia/Shanghai"
	}
	
}
filter{
	json {
        source => "message"
        remove_field => ["message"]
    }
}
output {
	if[type] == "supplier_data" {
        elasticsearch {
            hosts => ["127.0.0.1:9200"]
            index => "supplier_data_index"
            document_id => "%{id}"
            document_type => "supplier_data"
        }
    }
	if[type] == "customer_data" {
        elasticsearch {
            hosts => ["127.0.0.1:9200"]
            index => "customer_data_index"
            document_id => "%{id}"
            document_type => "customer_data"
        }
    }
	if[type] == "goods_card" {
        elasticsearch {
            hosts => ["127.0.0.1:9200"]
            index => "goods_card_index"
            document_id => "%{id}"
            document_type => "goods_card"
        }
    }
    stdout {
        codec => json_lines
    }
}

这里配置三个库得索引,es6以后 每个索引下只能有一个type。

配置好后就可以执行以下命令启动logstash就行了
我们假设以上配置文件保存在 /home/mysql-jdbc-input.conf

logstash -f /home/mysql-jdbc-input.conf

若要守护进程运行请用 nohup 命令

nohup logstash -f /home/mysql-jdbc-input.conf >/dev/null &
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值