未安裝es的可以參考這篇文章elasticsearch安裝
logstash介紹
logstash是一個開源的數據收集引擎,具有準實時數據收集能力。
logstash能夠將不同的數據規範的輸出到你的目標倉儲,比如elasticsearch;爲下游的數據分析以及可視化提供數據清洗
最初logstash創新了日誌收集的方式,後來用例就越來越多。
logstash 提供了海量的擴展插件用戶豐富數據收集的方式。
這樣一組配置就能實現一個數據收集
1、input 數據來源
2、filter數據做怎麼處理
3、數據要輸出到哪裏去
input{}
filter{}
ouput{}
我們現在要介紹的就是 logstash-input-jdbc插件,用於收集來自mysql的數據。
logstash-input-jdbc
這個插件可以用於任何實現jdbc標準接口的數據庫的數據,只需要在配置文件中配置相關的驅動以及指定驅動的類即可。該插件並未攜帶相關驅動,如果你需要使用需要下載相關驅動插件。可以通過以下兩種方式指定,插件默認支持,無需單獨下載。
- 下載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 => "* * * * *"
}
}
- 在配置文件中指定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 * * * 每天1點1分執行一次
1 1 * * 1-3 1到3月份每週的每天的1點1分執行
對以上定時任務的使用差不多涵蓋了大部分用法。
配置項 | 數據類型 | 是否必填 | 默認值 | 作用 |
---|---|---|---|---|
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 &