ELK Stack安裝的眉眉角角-Send to Elasticsearch from Logstash with mysql data logs

ELK Stack安裝的眉眉角角-Send to Elasticsearch from Logstash with mysql data logs

ELK是Elasticsearch、Logstash、Kibana的開頭字母組合的簡稱,是近二三年來算是滿火紅的日誌分析系統

Kibana:是一個非常彈性、支援elasticsearch的資料可視化介面,可以產生圖表、報告

Elasticsearch:是一個分散式,基於json文件的搜尋與分析系統

Logstash:是一個動態的資料搜集管線(可以完全整合elasticsearch的資源源)

註…這介紹好商業,因為是從他們官網搬下來了…XD

 

今天在此,記錄一下在docker上建置ELK3大套件的步驟與遇到的狀況,用於評估日誌解決方案,安裝後結果呈現如下:

Elasticsearch

首先,先來安裝elasticsearch,命令如下:

#cd /mnt    (個人習慣將要掛載的volumn放在docker host的/mnt裡面
#mkdir esdata
#docker run -d \
–name elasticsearch1 \
-p 9200:9200 \
-p 9300:9300 \
-v /mnt/esdata:/usr/share/elasticsearch/data \
-e “ES_JAVA_OPTS=-Xms512m -Xmx512m” \
elasticsearch

Logstash

接著是logstash,命令如下:

#mkdir logstash
#sudo nano /mnt/logstash/logstash.conf

logstash.conf文件內容如下:

input {
  jdbc {
            type => "meso_sys_log"
            jdbc_driver_library => "/mnt/lib/mysql-connector-java-5.1.33.jar"
            jdbc_driver_class => "com.mysql.jdbc.Driver"
            jdbc_connection_string => "jdbc:mysql://mysqldb:3306/meso_collections"
            jdbc_user => "root"
            jdbc_password => "123456"
            statement => "SELECT * FROM sys_logs ORDER BY time_stamp, logger, level"
            schedule => "* * * * *"
  }
}
output {
  if [type] == "meso_sys_log" {
      elasticsearch {
        hosts => "elasticsearch:9200"
        index => "meso_sys_log"
        document_id => "%{sequence_id}"
      }
  }
}

ELK的流程,就是從來源匯入log資料,經由logstash轉拋給elasticksearch engine,所以input所表現的就是從mysql的某個表定期的撈sql。坊間已有許多從文字檔案(例如nginx、apache、mysql server的log匯入的範例,這邊我使用的是mysql內部的某個log資料表為例。
input裡面可以定義type,未來可以加入多個輸入源,相對的,output就可以針對輸入源的type來判斷output的行為。
schedule則是定時規則,若schedule => “* * * * *”的話,代表每分鐘會執行一次,以下給一些定期時間範例。

“30 4 * * *”
Run every day at 4:30AM

“0 0 * * *”
Run every day at 12:00AM

“59 23 * * *”
Run every day at 11:59PM

“0 12 * * *”
Run every day at 12:00PM

我這次測試的場景必須連mysql,因此需要掛載jdbc的driver,因為僅需要一個jar檔,我們後續啟動logstash的時候再掛載進去就好了,至於jdbc_driver_library的driver我們可以從這邊載到(傳送門),先把他放在/mnt/lib吧。

在logstash.conf的output字段中,除了host要設定到對應的elasticsearch的host,以下的參數也至關重要,1. elasticsearch的index名稱,後續會用於kibana找到對應的資料集合,務必記住;document_id => “%{sequence_id}”這個是用來作串流資料時候,你希望作為識別的欄位,sequence_id剛好是我table的primary key,若沒有設定這個欄位的話,會遇到重覆新增的問題,所以在前幾次實驗的時候,因為沒有給定這個編號,又重啟好幾次container,導致竟然有2萬多個log記錄,實際上db裡的log也才一千出頭,因此我必須重建elasticsearch環境,或是可以刪除elasticsearch已建立的index,讓他以新的規則重建,來來回回測試時這個指令有夠好用:

$ curl -XDELETE yourhost:9200/xxxx’

接著,我們啟動logsash:

#sudo docker run -d –name logstash \
-p 5044:5044 \
–link elasticsearch1:elasticsearch \
–link mariadb:mysqldb \
-v /mnt/lib:/mnt/lib \
-v /mnt/logstash:/logstash logstash \
-f /logstash/logstash.conf

要檢查是否output有流入elasticsearch,我們可以用這個命令來檢查:

#curl -XPOST http://yourhost:9200/meso_sys_log/_search?pretty=true

Kibana

最後就是kibana:

#sudo docker run \
–name mesolog-kibana \
–link elasticsearch1:elasticsearch \
-p 5601:5601 \
-d kibana

都跑起來以後,我們就連到http://yourhost:5601/app/kibana#/management/kibana/index

一開始就看到的畫面應該是會在這一頁,它會請你設定index,然而,這個index正是剛剛logstash.conf裡面設定流入elasticsearch的index,所以我們帶入meso_sys_log

我設定了建立index-pattern以後,回到左邊的discover,就可以查詢相關的log記錄了,而且因為已經建立索引,所以查詢非常的快。

這邊只有1千多筆,感受效果不大,但依我前公司的情境,我負責的單一系統每日log量可以高達三、四百萬筆,查詢起來也是在數秒之間就完成了,結合時間序也可以自動產生圖表與報告,算是很方便的工具

手動呼叫api產生sys_log,進到db看一下,sys_log有寫了(註:這邊是utc時區)

過不久回到kibana,手動新增的資料馬上就查的到了(讚讚的)

這整整花了我快一個下午的時間,還只是用docker…(懶),沒想到自己架設的時候,遇到這麼多眉眉角角要嘗試+設定,而且我這邊設定都還是single node的版本…看來這條路,還有很多要摸索的

 

參考網址:

https://qbox.io/blog/migrating-mysql-data-into-elasticsearch-using-logstash

http://467754239.blog.51cto.com/4878013/1700828/

https://dotblogs.com.tw/supershowwei/2016/05/13/130023

https://chartio.com/resources/tutorials/how-to-delete-data-from-elasticsearch/

One Reply to “ELK Stack安裝的眉眉角角-Send to Elasticsearch from Logstash with mysql data logs”

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *