使用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_run boolean No false 是否保留之前的運行狀態
columns_charset hash No {} 針對某多個列進行編碼設置
connection_retry_attempts number No 1 連接db重試最大次數
connection_retry_attempts_wait_time number No 0.5 兩次連接之間等待時長
jdbc_connection_string string Yes no default jdbc連接串
jdbc_default_timezone string No no default 時區
jdbc_driver_class string Yes no default 驅動類
jdbc_driver_library string No no default 驅動包
jdbc_fetch_size number No no default JDBC fetch大小設置,如果沒設置將獲取默認jdbc的設置
jdbc_page_size number No 100000 jdbc分頁大小
jdbc_paging_enabled boolean No false 是否開啓分頁
jdbc_password password No no default 密碼
jdbc_password_filepath a valid filesystem path No no default 密碼文件
jdbc_pool_timeout number No 5 在引發PoolTimeoutError之前等待獲取連接的秒數
jdbc_user string Yes no default 用戶名
jdbc_validate_connection boolean No false 是否驗證鏈接
jdbc_validation_timeout number No 3600 驗證超時時長
last_run_metadata_path string No “/home/ph/.logstash_jdbc_last_run” 最後一次執行數據記錄文件
lowercase_column_names boolean No true 列名小寫
parameters hash No {} sql參數
record_last_run boolean No true 是否記錄最後一次執行數據到last_run_metadata_path這個文件
schedule string No no default 定時認去表達式
sequel_opts hash No {} 常規配置
sql_log_level string, one of [“fatal”, “error”, “warn”, “info”, “debug”] No info sql日誌級別
statement string No no default sql語句
statement_filepath avalid filesystem path No no default sql文件路徑
tracking_column string No no default 追蹤某列值(常用於增量更新)
tracking_column_type string,one of [“numeric”, “timestamp”] No “numeric” 追蹤值得類型
use_column_value boolean No false 是否開啓追蹤

根據以上配置我們就可以很容易得配置一個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 &
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章