multiple inputs on logstash jdbc

前端 未结 3 1890
故里飘歌
故里飘歌 2020-12-04 20:12

I am using logstash jdbc to keep the things syncd between mysql and elasticsearch. Its working fine for one table. But now I want to do it for multiple tables. Do I need to

相关标签:
3条回答
  • 2020-12-04 20:48

    If you need to run more than one pipeline in the same process, Logstash provides a way to do this through a configuration file called pipelines.yml and using multiple pipelines

    multiple pipeline

    Using multiple pipelines is especially useful if your current configuration has event flows that don’t share the same inputs/filters and outputs and are being separated from each other using tags and conditionals.

    more helpfull resource

    0 讨论(0)
  • 2020-12-04 20:52

    You can definitely have a single config with multiple jdbc input and then parametrize the index and document_type in your elasticsearch output depending on which table the event is coming from.

    input {
      jdbc {
        jdbc_driver_library => "/Users/logstash/mysql-connector-java-5.1.39-bin.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        jdbc_connection_string => "jdbc:mysql://localhost:3306/database_name"
        jdbc_user => "root"
        jdbc_password => "password"
        schedule => "* * * * *"
        statement => "select * from table1"
        type => "table1"
      }
      jdbc {
        jdbc_driver_library => "/Users/logstash/mysql-connector-java-5.1.39-bin.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        jdbc_connection_string => "jdbc:mysql://localhost:3306/database_name"
        jdbc_user => "root"
        jdbc_password => "password"
        schedule => "* * * * *"
        statement => "select * from table2"
        type => "table2"
      }
      # add more jdbc inputs to suit your needs 
    }
    output {
        elasticsearch {
            index => "testdb"
            document_type => "%{type}"   # <- use the type from each input
            hosts => "localhost:9200"
        }
    }
    
    0 讨论(0)
  • 2020-12-04 20:58

    This will not create duplicate data. and compatible logstash 6x.

    # YOUR_DATABASE_NAME : test
    # FIRST_TABLE :  place  
    # SECOND_TABLE :  things    
    # SET_DATA_INDEX : test_index_1, test_index_2
    
    input {
        jdbc {
            # The path to our downloaded jdbc driver
            jdbc_driver_library => "/mysql-connector-java-5.1.44-bin.jar"
            jdbc_driver_class => "com.mysql.jdbc.Driver"
            # Postgres jdbc connection string to our database, YOUR_DATABASE_NAME
            jdbc_connection_string => "jdbc:mysql://localhost:3306/test"
            # The user we wish to execute our statement as
            jdbc_user => "root"
            jdbc_password => ""
            schedule => "* * * * *"
            statement => "SELECT  @slno:=@slno+1 aut_es_1, es_qry_tbl.* FROM (SELECT * FROM `place`) es_qry_tbl, (SELECT @slno:=0) es_tbl"
            type => "place"
            add_field => { "queryFunctionName" => "getAllDataFromFirstTable" }
            use_column_value => true
            tracking_column => "aut_es_1"
        }
    
        jdbc {
            # The path to our downloaded jdbc driver
            jdbc_driver_library => "/mysql-connector-java-5.1.44-bin.jar"
            jdbc_driver_class => "com.mysql.jdbc.Driver"
            # Postgres jdbc connection string to our database, YOUR_DATABASE_NAME
            jdbc_connection_string => "jdbc:mysql://localhost:3306/test"
            # The user we wish to execute our statement as
            jdbc_user => "root"
            jdbc_password => ""
            schedule => "* * * * *"
            statement => "SELECT  @slno:=@slno+1 aut_es_2, es_qry_tbl.* FROM (SELECT * FROM `things`) es_qry_tbl, (SELECT @slno:=0) es_tbl"
            type => "things"
            add_field => { "queryFunctionName" => "getAllDataFromSecondTable" }
            use_column_value => true
            tracking_column => "aut_es_2"
        } 
    }
    
    # install uuid plugin 'bin/logstash-plugin install logstash-filter-uuid'
    # The uuid filter allows you to generate a UUID and add it as a field to each processed event.
    
    filter {
    
        mutate {
                add_field => {
                        "[@metadata][document_id]" => "%{aut_es_1}%{aut_es_2}"
                }
        }
    
        uuid {
            target    => "uuid"
            overwrite => true
        }    
    }
    
    output {
        stdout {codec => rubydebug}
        if [type] == "place" {
            elasticsearch {
                hosts => "localhost:9200"
                index => "test_index_1_12"
                #document_id => "%{aut_es_1}"
                document_id => "%{[@metadata][document_id]}"
            }
        }
        if [type] == "things" {
            elasticsearch {
                hosts => "localhost:9200"
                index => "test_index_2_13"
                document_id => "%{[@metadata][document_id]}"
                # document_id => "%{aut_es_2}"
                # you can set document_id . otherwise ES will genrate unique id. 
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题