當(dāng)MySQL數(shù)據(jù)到一定的數(shù)量級,而且索引不能實現(xiàn)時,查詢就會變得非常緩慢,所以使用ElasticSearch來查詢數(shù)據(jù)。本篇博客介紹使用Logstash同步MySQL數(shù)據(jù)到ElasticSearch,再進行查詢。
測試環(huán)境
- Windows系統(tǒng)
- MySQL 5.7
- Logstash 7.0.1
- ElasticSearch 7.0.1
- Kibana 7.0.1
ELK工具下載可訪問:https://www.elastic.co/cn/downloads/
ELK同步環(huán)境搭建
ElasticSearch、Kibana啟動
將下載的ElasticSearch、Kibana解壓,并依次啟動,Windows目錄下,ElasticSearch啟動可點擊bin/elasticsearch.bat
,Kibana啟動可點擊kibana.bat
。
Logstash配置啟動
核心是Logstash的配置。
1、解壓Logstash
2、將MySQL的JDBC的連接包放入lib包下
3、在bin目錄下新建配置文件-logstash_sync_mysql.conf,需要注意該配置文件需要UTF-8 無BOM格式,不然會報錯。
4、編寫配置文件
input {
jdbc {
# 索引類型
type => "product"
# 驅(qū)動包位置
jdbc_driver_library => "D:\ELk_SYNC_MYSQL\logstash-7.0.1\lib\mysql\mysql-connector-java-5.1.43.jar"
# 驅(qū)動
jdbc_driver_class => "com.mysql.jdbc.Driver"
# 數(shù)據(jù)庫名稱
jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/clothingsale?useUnicode=true&characterEncoding=UTF-8&useSSL=true"
# 用戶名
jdbc_user => "root"
# 密碼
jdbc_password => "root"
# SQL文件
# statement_filepath => "filename.sql"
# SQL語言 SELECT * FROM product WHERE update_time > :last_sql_value
statement => "SELECT * from product"
# 設(shè)置時區(qū)
jdbc_default_timezone => "Asia/Shanghai"
# 是否分頁
jdbc_paging_enabled => "true"
# 分頁數(shù)量
jdbc_page_size => "500"
# 追蹤字段
tracking_column => "update_time"
# 這里如果是用時間追蹤比如:數(shù)據(jù)的更新時間或創(chuàng)建時間等和時間有關(guān)的這里一定不能是true
use_column_value => false
# 設(shè)置監(jiān)聽間隔 各字段含義(由左至右)分、時、天、月、年,全部為*默認(rèn)含義為每分鐘都更新
schedule => "* * * * *"
}
jdbc {
# 索引類型
type => "message"
# 驅(qū)動包位置
jdbc_driver_library => "D:\ELk_SYNC_MYSQL\logstash-7.0.1\lib\mysql\mysql-connector-java-5.1.43.jar"
# 驅(qū)動
jdbc_driver_class => "com.mysql.jdbc.Driver"
# 數(shù)據(jù)庫名稱
jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/clothingsale?useUnicode=true&characterEncoding=UTF-8&useSSL=true"
# 用戶名
jdbc_user => "root"
# 密碼
jdbc_password => "root"
# SQL文件
# statement_filepath => "filename.sql"
# SQL語言 SELECT * FROM product WHERE update_time > :last_sql_value
statement => "SELECT * from message"
# 設(shè)置時區(qū)
jdbc_default_timezone => "Asia/Shanghai"
# 是否分頁
jdbc_paging_enabled => "true"
# 分頁數(shù)量
jdbc_page_size => "500"
# 追蹤字段
tracking_column => "update_time"
# 這里如果是用時間追蹤比如:數(shù)據(jù)的更新時間或創(chuàng)建時間等和時間有關(guān)的這里一定不能是true
use_column_value => false
# 設(shè)置監(jiān)聽間隔 各字段含義(由左至右)分、時、天、月、年,全部為*默認(rèn)含義為每分鐘都更新
schedule => "* * * * *"
}
}
# 修改@timestamp默認(rèn)時間
filter {
ruby {
code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)"
}
ruby {
code => "event.set('@timestamp',event.get('timestamp'))"
}
mutate {
remove_field => ["timestamp"]
}
}
output {
# 目前使用的elasticsearch7.x,所以一個index只能存儲一種type,所以以下的index需要不一樣
if [type]=="product" {
elasticsearch {
hosts => "127.0.0.1:9200"
# 索引名稱 相當(dāng)于數(shù)據(jù)庫名稱
index => "cloproduct"
# 類型名稱 相當(dāng)于數(shù)據(jù)庫中的數(shù)據(jù)表
document_type => "product"
document_id => "%{id}"
}
}
if [type]=="message" {
elasticsearch {
hosts => "127.0.0.1:9200"
# 索引名稱 相當(dāng)于數(shù)據(jù)庫名稱
index => "clomessage"
# 類型名稱 相當(dāng)于數(shù)據(jù)庫中的數(shù)據(jù)表
document_type => "message"
document_id => "%{id}"
}
}
}
上述是多表同步,每行都有注釋,意思比較明了,就是input中多表使用jdbc隔開,然后output中用type區(qū)分。
5、啟動
logstash -f logstash_sync_mysql.conf >> C:\Users\Panlf\Desktop\log.txt
這樣還能看到實時日志產(chǎn)生,方便查看錯誤和進程。文章來源:http://www.zghlxwxcb.cn/news/detail-788651.html
注意
上述即可實現(xiàn)MySQL的數(shù)據(jù)同步,但是存在問題 - 時區(qū)問題,MySQL是時間比ElasticSearch晚8個小時,我試了各種方式還是不能解決把時間調(diào)整過來。目前可以在取數(shù)據(jù)的時候,進行時間調(diào)整,應(yīng)該問題不是很大。文章來源地址http://www.zghlxwxcb.cn/news/detail-788651.html
到了這里,關(guān)于Logstash同步MySQL數(shù)據(jù)到ElasticSearch的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!