ElasticSearch是一款基於Lucene的功能強大的開源分佈式搜索與數據分析引擎,它具有高性能、易於擴展的優點,不僅可以從海量數據中快速找到相關信息,還被廣泛運用於大數據近實時的分析,包括日誌分析、指標監控、信息安全等多個領域。
相關鏈接:
常聽的ELK,即ElasticSearch、Logstash、Kibana,可以搭建一個完整的數據採集、存儲、可視化的平臺,這裏來先動手實踐,對其流程有一個感官的理解,後面再慢慢去深入瞭解ElasticSearch的各種高級用法。首先,需要下載ELK三件套,注意,這三者的版本必須一致,否則無法正常進行數據採集,我這裏採用的是7.5.0版本的:
另外還需要注意的是,安裝之前需要JDK環境的支持,JAVA_HOME的配置這裏就不多說了。
安裝ElasticSsearch
下載ES壓縮包,解壓後目錄結構如下所示:
目錄說明:
bin | ES的各種功能的腳本文件 |
config | elasticsearch.yml文件重點關注,配置ES的,另外還有登錄用戶的配置文件 |
data | ES節點存儲數據文件的目錄 |
jdk | 7.x版本後自帶JDK依賴,方便配置環境 |
lib | Java類庫 |
logs | 運行日誌輸出的目錄 |
modules | 包含的ES模塊 |
plugins | 包含ES已安裝的插件 |
配置elasticsearch.yml:
配置jvm.options:
還有一點要注意,上面值得設置不要超過30GB大小。
配置完成後,運行bin目錄下的腳本文件:
檢查確認啓動成功:
注意這裏,cluster_name,是ES集羣的名稱,這裏只是單機的一個實例,單一個集羣有多個節點時,需要確保集羣名稱一樣,可以通過如下方式在本機啓動一個集羣的多個節點:
elasticsearch.bat -E node.name=linjk_1 -E cluster.name=linjk -E path.data=xxx -E http.port=3358
elasticsearch.bat -E node.name=linjk_2 -E cluster.name=linjk -E path.data=xxx -E http.port=3359
elasticsearch.bat -E node.name=linjk_3 -E cluster.name=linjk -E path.data=xxx -E http.port=3360
然後可通過URL查看當前集羣有多少個節點:
爲了後面方便,這裏安裝了IK中文分詞器:
elasticsearch-plugin.bat install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.5.0/elasticsearch-analysis-ik-7.5.0.zip
安裝完成後,重啓ES,查看安裝的插件:
ES配置用戶名密碼:
提示需要配置X-Pack,配置如下:
重啓ES,重新配置密碼:(這裏我都用了一個密碼`ljk121`)
這是再訪問http://localhost:3358,就會彈出登錄對話框了:
安裝Kibana
上面是通過瀏覽器去調用ES提供的一些API,但是隻能發GET請求,後面需要發POST請求去查詢一些數據就不方便了,這裏可以藉助Kibana這個工具,啓動Kibana很簡單,修改其配置文件,然後執行bin目錄下的bat或sh腳本即可,注意,ES首先需要啓動,在這裏ES是服務端,Kibana是客戶端。
修改配置文件kibana.yml:
啓動:
圈住的Dev Tools很有用,如下所示:
可以很方便運行ES提供的一些API函數。這裏暫時就用到Kibana的Dev Tools,其他功能後面再慢慢探索。
安裝Logstash
有了存儲數據的ES和可視化工具Kibana,現在就需要從數據庫導入數據到ES了,這裏從MySQL導入數據到ES,以藉助ES強大的搜索和分析能力去進一步實現後面的業務功能。
新建一個測試庫和測試表:
新建Logstash導入數據的配置文件:
input {
jdbc {
jdbc_driver_library => "D:\\usr\\pathvar\\kettle\\lib\\mysql-connector-java-5.1.47.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://localhost:3308/es_test"
jdbc_user => "root"
jdbc_password => "xxxxx"
schedule => "* * * * *"
statement => "SELECT * FROM t_user_account WHERE update_time >= :sql_last_value"
# statement_filepath => "./config/jdbc.sql"
use_column_value => true
tracking_column_type => "timestamp"
tracking_column => "update_time"
last_run_metadata_path => "syncpoint_table"
}
}
output {
elasticsearch {
# ES的IP地址及端口
# hosts => ["localhost:3358", "localhost:3359"]
hosts => "http://localhost:3358"
# 索引名稱
index => "es_test"
# 關聯的數據庫中有一個id字段,對應類型中的id,無則ES自己生成
document_id => "%{id}"
document_type => "user"
}
stdout {
# JSON格式輸出
codec => json_lines
}
}
編寫後最好測試一下配置文件是否有語法問題:
沒問題,啓動:
報錯:
解決:
下載安裝插件:
https://github.com/logstash-plugins/logstash-input-jdbc/releases/tag/v4.3.19
然後安裝:(生成gem文件這一步需要先安裝Ruby)
再次啓動,可以看到,在執行數據同步了:
去ES查詢驗證一下:
可以看到,在ES可以看到了,接下來,在MySQL修改這條數據,看是否也能同步更新ES的數據,同步的時間最小粒度是1分鐘,可以看到,數據也變化了。
好了,從採集數據到存儲到ES的鏈路走通了,後面學習再記錄了。