傳統系統日誌收集的問題
傳統項目中,如果在生產環境中,有多臺不同的服務器集羣,如果生產環境需要通過日誌定位項目的Bug的話,需要在每臺節點上使用傳統的命令方式查詢,這樣效率非常底下。
通常,日誌被分散在儲存不同的設備上。如果你管理數十上百臺服務器,你還在使用依次登錄每臺機器的傳統方法查閱日誌。這樣是不是感覺很繁瑣和效率低下。當務之急我們使用集中化的日誌管理,例如:開源的syslog,將所有服務器上的日誌收集彙總。
集中化管理日誌後,日誌的統計和檢索又成爲一件比較麻煩的事情,一般我們使用grep、awk和wc等Linux命令能實現檢索和統計,但是對於要求更高的查詢、排序和統計等要求和龐大的機器數量依然使用這樣的方法難免有點力不從心。
查詢命令:
tail -n 300 myes.log | grep 'node-1'
tail -100f myes.log
ELK分佈式日誌收集系統介紹
ElasticSearch 是一個基於Lucene的開源分佈式搜索服務器。它的特點有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java開發的,並作爲Apache許可條款下的開放源碼發佈,是第二流行的企業搜索引擎。設計用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。
Logstash 是一個完全開源的工具,它可以對你的日誌進行收集、過濾、分析,支持大量的數據獲取方法,並將其存儲供以後使用(如搜索)。說到搜索,logstash帶有一個web界面,搜索和展示所有日誌。一般工作方式爲c/s架構,client端安裝在需要收集日誌的主機上,server端負責將收到的各節點日誌進行過濾、修改等操作在一併發往elasticsearch上去。
Kibana 是一個基於瀏覽器頁面的Elasticsearch前端展示工具,也是一個開源和免費的工具,Kibana可以爲 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 界面,可以幫助您彙總、分析和搜索重要數據日誌。
ELK分佈式日誌收集原理
1、每臺服務器集羣節點安裝Logstash日誌收集系統插件
2、每臺服務器節點將日誌輸入到Logstash中
3、Logstash將該日誌格式化爲json格式,根據每天創建不同的索引,輸出到ElasticSearch中
4、瀏覽器使用安裝Kibana查詢日誌信息
環境安裝
1、安裝ElasticSearch
2、安裝Logstash
3、安裝Kibana
Logstash介紹
Logstash是一個完全開源的工具,它可以對你的日誌進行收集、過濾、分析,支持大量的數據獲取方法,並將其存儲供以後使用(如搜索)。說到搜索,logstash帶有一個web界面,搜索和展示所有日誌。一般工作方式爲c/s架構,client端安裝在需要收集日誌的主機上,server端負責將收到的各節點日誌進行過濾、修改等操作在一併發往elasticsearch上去。 核心流程:Logstash事件處理有三個階段:inputs → filters → outputs。是一個接收,處理,轉發日誌的工具。支持系統日誌,webserver日誌,錯誤日誌,應用日誌,總之包括所有可以拋出來的日誌類型。
Logstash工作原理
Logstash事件處理有三個階段:inputs → filters → outputs。是一個接收,處理,轉發日誌的工具。支持系統日誌,webserver日誌,錯誤日誌,應用日誌,總之包括所有可以拋出來的日誌類型。
logstash:輸入(讀取本地文件或者連接數據庫)、輸出Json 格式。
Input:輸入數據到logstash,再由logstatsh輸出(Json格式)數據到es服務器上。
一些常用的輸入爲:
file:從文件系統的文件中讀取,類似於tail -f命令
syslog:在514端口上監聽系統日誌消息,並根據RFC3164標準進行解析
redis:從redis service中讀取
beats:從filebeat中讀取
Filters:數據中間處理,對數據進行操作。
一些常用的過濾器爲:
grok:解析任意文本數據,Grok 是 Logstash 最重要的插件。它的主要作用就是將文本格式的字符串,轉換成爲具體的結構化的數據,配合正則表達式使用。內置120多個解析語法。
mutate:對字段進行轉換。例如對字段進行刪除、替換、修改、重命名等。
drop:丟棄一部分events不進行處理。
clone:拷貝 event,這個過程中也可以添加或移除字段。
geoip:添加地理信息(爲前臺kibana圖形化展示使用)
Outputs:outputs是logstash處理管道的最末端組件。一個event可以在處理過程中經過多重輸出,但是一旦所有的outputs都執行結束,這個event也就完成生命週期。
一些常見的outputs爲:
elasticsearch:可以高效的保存數據,並且能夠方便和簡單的進行查詢。
file:將event數據保存到文件中。
graphite:將event數據發送到圖形化組件中,一個很流行的開源存儲圖形化展示的組件。
Codecs:codecs 是基於數據流的過濾器,它可以作爲input,output的一部分配置。Codecs可以幫助你輕鬆的分割發送過來已經被序列化的數據。
一些常見的codecs:
json:使用json格式對數據進行編碼/解碼。
multiline:將匯多個事件中數據彙總爲一個單一的行。比如:java異常信息和堆棧信息。
Logstash環境安裝
1、上傳 logstash 安裝包,我的目錄爲 /usr/local/es/
2、解壓 tar –zxvf logstash-6.4.3.tar.gz
3、在config目錄下放入test01.conf、test02.conf 讀入並且讀出日誌信息
演示效果
1、啓動./logstash -f ../config/test01.conf、./logstash -f ../config/test01.conf 分別指的是二個不同的配置文件,test01 是控制檯輸出 沒有添加時間 輸出,test02 是打印了時間。
2、啓動./elasticsearch
3、啓動./kibana Logstash 讀取本地文件地址,實時存放在ES中,以每天格式創建不同的索引進行存放。
Kibana 平臺查詢
GET /es-2019.06.12/_search
test01.conf
input {
# 從文件讀取日誌信息 輸送到控制檯
file {
path => "/usr/local/es/elasticsearch-6.4.3/logs/myes.log"
codec => "json" ## 以JSON格式讀取日誌
type => "elasticsearch"
start_position => "beginning"
}
}
# filter {
#
# }
output {
# 標準輸出
# stdout {}
# 輸出進行格式化,採用Ruby庫來解析日誌
stdout { codec => rubydebug }
}
test02.conf
input {
# 從文件讀取日誌信息 輸送到控制檯
file {
path => "/usr/local/es/elasticsearch-6.4.3/logs/myes.log"
codec => "json" ## 以JSON格式讀取日誌
type => "elasticsearch"
start_position => "beginning"
}
}
# filter {
#
# }
output {
# 標準輸出
# stdout {}
# 輸出進行格式化,採用Ruby庫來解析日誌
stdout { codec => rubydebug }
elasticsearch {
hosts => ["192.168.200.135:9200"]
#### 創建索引 根據每天創建索引
index => "es-%{+YYYY.MM.dd}"
}
}
ES與Mysql保持數據一致性原理
logstash包含輸入(讀取本地文件或者連接數據庫)與輸出、過濾器。
如果數據新增或者修改了,ES 與 數據庫如何保持一致性?
logstash做定時任務(每分鐘查詢一次),定時去mysql查詢數據。
原理:根據updateTime字段作爲條件進行查詢。第一次發送Sqli請求的時候,修改時間參數值是爲系統最開始的時間是1970年,可以查詢到所有的數據。會將最後一條數據的updateTime記錄下來,作爲下一次修改時間的條件進行查詢。
第一次查詢 sql: SELECT * FROM user WHERE update_time >= '1970-01-01 08:00:00'; // updateTime 系統開始時間:1970-01-01 08:00:00
第二次查詢 sql: SELECT * FROM user WHERE update_time >= '2019-07-13 11:15:23';// 2019-07-13 11:15:23 是 第一次查詢的所有數據中,最後一條數據的 updateTime
如下圖:可以看到定時任務查詢的sql,還有定時爲1分鐘查一次。
新增數據或者修改數據的時候都會記錄updateTime 時間。
該內容學習來源於螞蟻課堂