分享写 logstash 定时同步drds数据到es的小心得

一个同步的样例:

input {
  jdbc {
   jdbc_driver_library => "/home/mysql5.7/mysqlDriver/mysql-connector-java-8.0.13.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    # 8.0以上版本:一定要把serverTimezone=UTC天加上
    jdbc_connection_string => "jdbc:mysql://192.168.124.8:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"
    jdbc_user => "root"
    jdbc_password => "root"
    # 数据库重连尝试次数
    connection_retry_attempts => "3"
    # 数据库连接可用校验超时时间,默认3600S
    jdbc_validation_timeout => "3600"
    # 开启分页查询(默认false不开启);
    jdbc_paging_enabled => "true"
    # 单次分页查询条数(默认100000,若字段较多且更新频率较高,建议调低此值);
    jdbc_page_size => "10000"
    # 如果sql较复杂,建议配通过statement_filepath配置sql文件的存放路径;
    #statement_filepath => "/logstash/logstash-7.10.2/config/tosql.sql"
    # 需要记录查询结果某字段的值时,此字段为true,否则默认tracking_column为timestamp的值;
    use_column_value => true
    # 是否将字段名转换为小写,默认true(如果有数据序列化、反序列化需求,建议改为false);
    #lowercase_column_names => false
    # 需要记录的字段,用于增量同步,需是数据库字段
    tracking_column => update_time
    # Value can be any of: numeric,timestamp,Default value is "numeric"
    tracking_column_type => timestamp
    # record_last_run记录最后一次运行的结果()
    record_last_run => true
    #上一个sql_last_value值的存放文件路径, 必须要在文件中指定字段的初始值
    last_run_metadata_path => "/logstash/logstash-7.10.2/config/test.txt"
    # 是否清除last_run_metadata_path的记录,需要增量同步时此字段必须为false;
    clean_run => false
    schedule => "* * * * *"
    statement => "SELECT a,b from test WHERE update_time > :sql_last_value"
    #jdbc_default_timezone => "Asia/Shanghai"
    #使用本地时区为local,否则sql_last_value如果是timestamp,时间会提前8小时
    #值可以是任何的:utc,local,默认值为 "utc"
    plugin_timezone => "local"
  }

}

filter {
        # 因为时区问题需要修正时间
    ruby { 
        code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)" 
    }
    ruby {
        code => "event.set('@timestamp',event.get('timestamp'))"
    }
   # ruby {
   #    code => "event.set('create_time', event.get('create_time').time.localtime + 8*60*60)" 
   #}    
        ## 转换成日期格式
   # ruby {
   #     code => "event.set('create_time', event.get('create_time').time.localtime.strftime('%Y-%m-%d'))"
   # }
    mutate {
                #把数据库的auto_id赋给es的id
           #rename => {"auto_id" => "id"}
           
           remove_field => ["timestamp"]
        }
}

output {
    elasticsearch {
        # ES集群地址(如果是单机的填一个就行)
        hosts => ["192.1.1.1:0000"]
        user => "elastic"
        password => "pass"
        # 索引名称
        index => "test"
        # 需要关联的数据库中有有一个id字段,对应类型中的id
        document_id => "%{haoma}"
    }
    #stdout {
    #    # 输出为json数据
    #    codec => json_lines
    #}
    
 stdout{codec => rubydebug}
     file{
       path => "/home/intelligent_upgrade/logstash/logstashStorage/secure/%{+YYYY.MM.dd}.log"
       codec => json_lines
         }
}

需要关注的几个点:

  1. schedule => "* * * * *",不设置默认每分钟进行一次抽取,"*/5 * * * *"是5分钟抽取一次,"10 11 * * *"是11:10开始抽取一次。
  2. 增量更新时可使用:sql_last_value在sql里
  3. use_column_value=true,则最后更新时间记录为update_time字段的值,如果是false,记录为系统时间。
  4. last_run_metadata_path是在增量更新时记录最后一次更新时间的文件。
  5. 在filter里,需要进行时间的调整,否则时间会差8个小时
  6. 输出stdout,如果不注释会打印出所有抽取的数据到控制台,加上file是把输出写到xxx文件里。

如有问题,欢迎评论区讨论,最近研究这个颇有心得