logstash实现mysql和oracle的全量和增量更新

一、logstash概述:
概述就不多做细说了,具体详情可以参考其他大佬的总结,下面可以百度一哈

二、配置说明:

1.首先logstash需要启用jdbc插件,可以通过在线安装和离线安装。网上不少小伙伴说在线安装失败,但我测试了10台机器都成功了,可能是网络等问题影响了。

在线安装命令 logstash-plugin install logstash-input-jdbc / logstash-output-jdbc

离线安装教程  logstash安装和logstash-input-jdbc插件_摸着你的大鼻子的博客-CSDN博客_logstash 安装jdbc安装logstashlogstash的安装和elasticsearch的安装是一样简单的,就是那种拆箱即用的。目前最新的版本是5.5.0,注意这个版本需要和elasticsearch的版本一致。下载安装wget https://artifacts.elastic.co/downloads/logstash/logstash-5.5.0.zip1下载完之后unzip logstash-5.5.0.z...https://blog.csdn.net/weixin_40397083/article/details/80605182

2.在安装成功后,画面会提示安装完成,此时jdbc插件就安装完成,但是想要调取数据库操作还需要配置对应的驱动,可以存放在logstash下的任意文件夹内。

3.全量配置文件

input {
	jdbc {
        jdbc_driver_library => "/home/logstash-7.2.0/tools/ingest-converter/build/libs/ojdbc8-21.5.0.0.jar"  #指定数据库驱动的位置
        jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver"    
        jdbc_connection_string => "jdbc:oracle:thin:@ip/databaseName"    
        jdbc_user => "dbusername"
        jdbc_password =>dbpassword ""
        schedule => "* * * * *"    # 定时模块
        jdbc_page_size=> 5000      
        jdbc_paging_enabled => true 
		statement => "查询DDL语句"   
	}
}
output {
	jdbc {
        driver_jar_path => "/home/logstash-7.2.0/tools/ingest-converter/build/libs/mysql-connector-java-8.0.27.jar"
        driver_class => "com.mysql.cj.jdbc.Driver"
        connection_string => "jdbc:mysql://mysqldip/databaseName?characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&useSSL=false"
        username => "dbusername"
        password => "dbpassword"
		statement => [ "插入或更新DDL语句"]
	}
	# stdout { codec => rubydebug }
	stdout { codec => json_lines }
}

增量配置文件

input {
    jdbc {
        jdbc_driver_library => "/home/logstash-7.2.0/tools/ingest-converter/build/libs/ojdbc8-21.5.0.0.jar"
        jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver"
        jdbc_connection_string => "jdbc:oracle:thin:@ip/databaseName"
        jdbc_user => "dbusername"
        jdbc_password => "dbpassword"
        schedule => "* * * * *"
        jdbc_page_size=> 5000
        jdbc_paging_enabled => "true"
        statement => "查询DDL语句 > :sql_last_value "  
        use_column_value => "true"  #启用增量更新
        tracking_column => "字段名"  #增量更新字段名
        tracking_column_type => "值可以是任何一个:numeric,timestamp"
        record_last_run => "true"   #记录 tracking_column值作为:sql_last_value
        last_run_metadata_path => "/home/logstash-7.2.0/metadata/increase_product"
         }
}
output {
	jdbc {
        driver_jar_path => "/home/logstash-7.2.0/tools/ingest-converter/build/libs/mysql-connector-java-8.0.27.jar"
        driver_class => "com.mysql.cj.jdbc.Driver"
        connection_string => "jdbc:mysql://mysqldip/databaseName?characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&useSSL=false"
        username => "dbusername"
        password => "dbpassword"
		statement => [ "插入或更新DDL语句"]
	    }
	# stdout { codec => rubydebug }
	stdout { codec => json_lines }
}

其中定时模块经过测试,全*表示每分钟均运行,(*/n * * * *)代表每n分钟运行一次,如果要具体到某时某刻就替换成实际的时间即可。

4.完成相关文件配置后,可以通过config下的pipeline.yml将所有配置文件填写上去,然后直接运行logstash,程序会根据改yml文件上的路径自动匹配所有配置文件,如果需要打印日志或者信息可在运行时自行设置。 

———————————————————————————————————————————

在测试环境下,数据量不大的前提这套配置没问题,但在生产环境下,读写数据量大的情况下,logstash经常出现报错:

lconnection is not available,request time out after 30000ms

关于这个问题,翻查了前辈和logstash的output说明后,对相关配置进行二次修改:

一、在mysql的my.ini文件(默认C:\PragramData\MySQL\MySQLServer 5.7目录下)中增加skip-name-resolve,重启mysql服务后,问题解决。原因是

MySQL处理用户连接时进行如下过程来验证用户的合法性(参考http://www.cnblogs.com/timeship/archive/2013/02/28/2937730.html):

When a new client connects to mysqld, mysqld spawns a new thread to handle the request. This thread first checks whether the host name is in the host name cache. If not, the thread attempts to resolve the host name: 
The thread takes the IP address and resolves it to a host name (using gethostbyaddr()). It then takes that host name and resolves it back to the IP address (using gethostbyname()) and compares to ensure it is the original IP address.

二、对每个配置文件优化:

input {
    jdbc {
        jdbc_driver_library => "/home/logstash-7.2.0/tools/ingest-converter/build/libs/ojdbc8-21.5.0.0.jar" 
        jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver"
        jdbc_connection_string => "jdbc:oracle:thin:@ip/databaseName"
        jdbc_user => "dbusername"
        jdbc_password => "dbpassword"
        schedule => "* * * * *"
        jdbc_page_size=> 5000
        jdbc_paging_enabled => "true"
        statement => "查询DDL语句 > :sql_last_value "  
        use_column_value => "true"  #启用增量更新
        tracking_column => "字段名"  #增量更新字段名
        tracking_column_type => "值可以是任何一个:numeric,timestamp"
        record_last_run => "true"   #记录 tracking_column值作为:sql_last_value
        last_run_metadata_path => "/home/logstash-7.2.0/metadata/increase_product"
         }
}
filter  {
        ruby  {
                 code => "event.timestamp.time.localtime"
               }  #logstash时间同步与实际相差8小时,强制将时间同步
output {
	jdbc {
        driver_jar_path => "/home/logstash-7.2.0/tools/ingest-converter/build/libs/mysql-connector-java-8.0.27.jar"
        driver_class => "com.mysql.cj.jdbc.Driver"
        connection_string => "jdbc:mysql://mysqldip/databaseName?characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&useSSL=false"
        username => "dbusername"
        password => "dbpassword"
		statement => [ "插入或更新DDL语句"]
	    connection_timeout => 30000  #配置连接超时
        connection_test_query => "SELECT 1" #连接测试和初始化查询字符串
        max_pool_size => 5  #配置连接池数量
        }
	# stdout { codec => rubydebug }
	stdout { codec => json_lines }
}

后续生产环境稳定运行,暂时没发现有异常报错或者闪退现象

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值