通过logstash的logstash-input-jdbc插件实现mysql增量导入ES

本文详细介绍了Logstash JDBC插件的配置方法,包括如何修改Gemfile源地址,配置数据库连接、驱动、SQL语句及定时任务。同时,文章还讲解了如何处理字段名冲突、解决时区差异及开启字符转义功能。

安装logstash-input-jdbc插件参考:https://blog.csdn.net/yeyuma/article/details/50240595#quote

重点是要修改: /opt/logstash/Gemfile里面的source值为新的源的地址,源地址以‘/’结束

#logstash的配置文件需要自己创建,一下是我自己的配置文件
cat  mysql_conf/mysql.conf

input {
    stdin {
    }
    jdbc {
      #数据库地址
      jdbc_connection_string => "jdbc:mysql://localhost:3306/user??useSSL=false"
      jdbc_user => "admin"
      jdbc_password => "passwd" 
      #数据库驱动路径
      jdbc_driver_library => "/soft/logstash-5.6.9/mysql-connector-java-5.1.46/mysql-connector-java-5.1.46-bin.jar"
      jdbc_driver_class => "com.mysql.jdbc.Driver"
      #sql路径,也可以是直接指定sql语句,字段需要换成 statement =>
      
      # parameters => {"number" => "200"}  这个我们可以向sql语句传递参数
      # statement_filepath => "/soft/logstash-5.6.9/pay_test.sql"

      # 这个:sql_last_value是last_run_metadata_path中记录的值
      statement => "SELECT * FROM font_element where updated_at > :sql_last_value"

      #是否开启记录追踪
      record_last_run => "true"
      #是否需要追踪字段,如果为true,则需要指定tracking_column,默认是timestamp
      #use_column_value => "true"
      #指定追踪的字段,这里需要注意的是,建议选择主键字段,如果选择日期需要为实时表
      #tracking_column => "id"
      #追踪字段的类型,目前只有数字和时间类型,默认是数字类型
      #tracking_column_type => "number"
      #设置时区
      jdbc_default_timezone =>"Asia/Shanghai"
      #是否每次清除last_run_metadata_path的内容
      clean_run => "false"
      #这里可以手动设置:sql_last_value的值,默认时间是1970-01-01,默认数字是0
      last_run_metadata_path => "/soft/logstash-5.6.9/logstash_jdbc_last_run"  
      # 同步频率(分 时 天 月 年),默认每10分钟同步一次;
      schedule => "* * * * *"
      #是否分页
      jdbc_paging_enabled => "true"
      jdbc_page_size => "50000"
      # 防止自动将大小转为小写
      lowercase_column_names => false
      # 索引类型
      type => "font-element"
    }

    jdbc {
      # mysql 数据库链接
      jdbc_connection_string => "jdbc:mysql:ip-address//:3306/database1?characterEncoding=utf8"
      # 用户名和密码
      jdbc_user => "username"
      jdbc_password => "password"
      # 驱动
      jdbc_driver_library => "/data/mysql-sync/logstash-6.3.0/mysql-test/mysql-connector-java-5.1.6.jar"
      # 驱动类名
      jdbc_driver_class => "com.mysql.jdbc.Driver"
      jdbc_paging_enabled => "true"
      jdbc_page_size => "50000"
      # 执行的sql 文件路径+名称
      statement_filepath => ""
      # 设置监听间隔  各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
      schedule => "0 1 * * *"
      # 索引类型
      type => "TInquiryInfo"
      # 防止自动将大小转为小写
      lowercase_column_names => false
      # 记录上一次运行记录
      record_last_run => true
      # 使用字段值
      use_column_value => true
      # 追踪字段名
      tracking_column => "updateTime"
      # 字段类型
      tracking_column_type => "timestamp"
      # 上一次运行元数据保存路径
      last_run_metadata_path => ""
      # 是否删除记录的数据
      clean_run => false
    }
}

filter {
    #jdbc默认json,暂时没找到修改方法
    json {
        source => "message"
        remove_field => ["message"]
    }
    mutate {  #需要移除的字段
        remove_field => "@timestamp"
        remove_field => "type"
        remove_field => "@version"

    }
}

output {
    if[type] == "font-element" {
        elasticsearch {
            hosts => "localhost:9200" #elasticsearch地址
            index => "user" #elasticsearch索引
            # elasticsearch的id,该值需要唯一,如果不唯一就不要加这个字段,默认生成, 
            # 如果sql语句主键起了别名,这里也要使用别名
            document_id => "%{id}"
            document_type => "log" #elasticsearch的type

            user => elastic
            password => xxxx            
            timeout => 300

            #index => "test-%{+YYYY-MM-dd}"
            #protocol => "http"
            #cluster => "logstash-elasticsearch"
        }
    }
    if [type]=="TInquiryInfo"{
        elasticsearch {
            hosts => ["localhost:9200"]
            # 索引名称
            index => "ca-inquiry"
            # type名称
            document_type => "TInquiryInfo"
            # 文档id,inquiryId为sql文件中查询出的字段名
            document_id => "%{inquiryId}"
            # 自定义分词器
            template_overwrite => true
            template => "/usr/local/logstash-5.5.2/template/logstash-ik.json"
        }     
    }
    stdout {
        codec => json_lines
    }
}

注意事项:

  • 数据库中查询的字段如果有type会报错,需要将type名称as为其他名称
  • 最后一个问题是logstash-input-jdbc插件使用的是UTC时间,比我们晚8个小时,你可以在sql语句中使用date_add函数将时间加上8个小时或者使用convert_tz转换时区函数再和mysql时间比较。
  • 默认情况下,如果处理的字符中含有\t\n等字符,是不生效的,我们需要开启logstash的字符转义功能,如下:

      修改logstash的config/logstash.yml,找到config.support_escapes,去掉之前的注释,将值改为true,默认是false

    config.support_escapes: true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戴国进

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值