使用 elasticsearch、LogStash、Kibana完成網站流量的監控系統(基於nginx的訪問日誌實現流量監控)
分散式帶來的變革:
多節點、日誌分散、運維成本高
先看幾個實際的案例。
各自的解決方案
一些比較主流的集中式日誌管理系統
簡單的Rsyslog
商業化的 Splunk
開源的有 Facebook 公司的 Scribe Apache 的 Chukwa、ELK
ELK 是一整套解決方案,是三個軟體產品的首字母的縮寫,能夠自動收集日誌,統一把日誌收集到一個地方,自動收集報表
Elasticsearch、Logstash、Kibana
Elasticsearch:
Java語言編寫的實時的分散式搜尋和分析引擎,他可以用於全文搜尋,結構化搜尋以及分析
Logstash:
Jruby語言編寫,是一個具有實時渠道能力的資料收集引擎,包含輸入、過濾、輸出模組,一般在過濾模組中做日誌格式化的解析工作,把資料進行統一的收集過濾,統一輸出。
Kibana:
為Elasticsearch提供分析和視覺化的 Web平臺。他可以在 Elasticsearch 的索引中查詢,互動資料,並生成各種維度的表圖。
這種結構因為需要在各個伺服器上部署 Logstash,而它比較消耗CPU和記憶體的資源,所以比較適合計算資源比較豐富的伺服器,否則容易造成伺服器效能下降,甚至可能導致無法正常工作,這是不可忍受的。
logstash是一個礦工,挖礦者,因為 logstash 主要承擔日誌收集的工作,日誌來自於業務系統產生的日誌可能是javaee、inet、php 編寫的或者其他語言,只要有日誌就行,logstash還承擔了日誌過濾的功能,過濾日誌的格式,處理結果釋出到
elasticsearch,把所有日誌儲存到倉庫當中,提供全文檢索服務,提供快速檢索操作。提供分散式儲存。
kibana 完成視覺化的工作,資料來源於 elasticsearch,與es建立連線,實時的讀取到 es 中的資料變化,只要資料變化了,圖形就變化了
現場搭建 elk 的環境實現
第一步:
首先在搭建 elasticsearch 的叢集之前我們需要明確的是 easticsearch中的三個節點的資料都是空的,如果不是空的的話,很容易出現下面的這個錯誤:
with the same id but is a different node instance
所以首先要記得備份自己elasticsearch 中的資料,然後刪除掉三臺機器的 elasticsearch 中的data目錄下的nodes資料夾,然後再進行叢集的操作
首先先配置一臺 elasticsearch,來到elasticsearch 中的 config 目錄下,編輯 elasticsearch.yml 這個檔案.
更改下面的屬性引數:
http.cors.enabled : true
http.cors.allow-origin : "*"
http.cors.allow-methods : OPTIONS,HEAD,GET,POST,PUT,DELETE
http.cors.allow-headers : "X-Requested-With,Content-Type,Content-Length,X-User"
cluster.name: tom-test
node.name: master
#這個節點是主節點
node.master: true
network.host: 127.0.0.1
slave1這樣進行配置:
cluster.name: tom-test
node.name: slave-1
network.host: 127.0.0.1
http.port: 8200
#這個配置的是從節點的叢集ip組
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]
slave2這樣進行配置:
cluster.name: tom-test
node.name: slave-2
network.host: 127.0.0.1
http.port: 8201
#這個配置的是從節點的叢集ip組
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]
然後分別進入三個es的bin目錄下執行 elasticsearch.bat
執行之前先改下三臺機器的 elasticsearch.bat 檔案,更改其title 屬性,分別如下,方便等下進行識別的工作
TITLE Elasticsearch 5.1.1 - master
TITLE Elasticsearch 5.1.1 - slave1
TITLE Elasticsearch 5.1.1 - slave2
然後分別啟動三臺 elasticsearch,在瀏覽器上輸入 localhost:9200 localhost:8200 localhost:8201
都能夠看到這樣的介面:
可以啟動一個 elasticsearch 的視覺化介面,需要在 github上下載這個軟體
安裝 node.js 然後 npm run start 進行啟動的從操作
瀏覽器輸入 localhost:9100 可以訪問到視覺化介面如下圖:
出現這樣的介面表示三臺elasticsearch叢集成功,可以看到右邊的叢集健康值是綠色的表示狀態正常,叢集健康還可能出現黃色和紅色,由於剛才刪掉了叢集中data目錄中的資料,所以這裡看到的資料索引 index 值都是空的
第二步:
啟動 logstash :
在logstash的bin目錄下執行下面的命令:
logstash -e 'input { stdin {} } output {stdout {} }'
這是ruby的語法,設定控制檯輸入,控制檯輸出
Logstash非常耗效能,所以可以檢視電腦的cpu和記憶體的效能,消耗比較嚴重的話表示Logstash已經啟動了,在工作管理員中可以檢視
同時啟動的那句命令列會有下面的輸出表示 Logstash 已經啟動成功:
這裡先停掉 Logstash。
第三步:使用logstash作為日誌採集(礦工),elasticsearch作為日誌儲存的系統,在 Logstash 的config目錄下建立一個檔案
logstash.conf檔案,並且在裡面編寫下面的內容:
input{
file{
path => ["D:\java\nginx-1.14.0\logs\access.log"]
type => "nginx_access"
start_position => "beginning"
}
}
output{
stdout{
codec => rubydebug
}
}
注意上面配置中的 file 中的 path,對應的是 nginx的日誌路徑
安裝nginx,然後先把nginx logs目錄下的 access.log 這個檔案刪除
然後再新建一個空的檔案 access.log 這個檔案
然後需要配置nginx的log 具體在這裡配置:
nginx.conf 檔案:
在 http的那個大括號裡面配置下面的兩個屬性
#用來定義記錄日誌的格式(可以定義多種日誌格式,取不同名字即可)
log_format main '$remote_addr - $remote_user [$time_local] "$request"'
#用來指定日誌檔案的路徑以及使用何種日誌格式記錄日誌
access_log logs/access.log main;
nginx的釋出檔案資源路徑在這裡配置,修改 root 和 index即可
server
{
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root F:\uploadImages;
index index.html index.htm;
}
}
然後啟動nginx, windows 平臺可以使用 nginx.exe & 命令 或者 start nginx 命令
可以訪問以下 nginx 中的資源,看到nginx中的access.log 這個檔案中的資料是在不斷變化的
由於剛剛在 Logstash 的logstash.conf 檔案中配置了 nginx的日誌 access.log 檔案的位置,所以我們看到剛剛使用 logstash -f ../config/logstash.conf 這個命令 開啟的 Logstash 的控制端資料也一直在變化
接下來還要配置 Logstash 匹配 nginx 日誌:
(編輯 logstash目錄下的 config\patterns\nginx 這個檔案,沒有這個檔案的話自行建立 )內容如下:
NGINXACCESS %{IPORHOST:clientip} %{HTTPDUSER:ident} %{USER:auth}\[%{HTTPDATE:timestamp}\]
"(?:%{WORD:verb} %{URIPATH:uri}%{URIPARAM:Param} (?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest} )"
%{NUMBER:response} (?:%{NUMBER:bytes} |-)
NGINXACCESSLOG %{NGINXACCESS} %{QS:referrer} %{QS:agent} %{QS:x_forward_for}
然後再編輯一下 logstash.conf 這個檔案,內容如下:
input{
file{
path => ["D:\java\nginx-1.14.0\logs\access.log"]
type => "nginx_access"
start_position => "beginning"
}
}
output{
elasticsearch {
#這裡記得寫的是hosts,因為可能會是叢集的 elasticsearch,但是配置的之後只要寫上主節點就行了
hosts => "localhost:9200"
#規定儲存日誌的索引規則,動態配置,方便管理
index => "logstash_%{type}=%{+YYYY.MM.dd}"
# type 裡的引數 就是上面配置的 nginx_access
document_type => "%{type}"
}
stdout{
codec=>rubydebug
}
}
把logstash收集到的nginx日誌匯入到 elasticsearch當中去:
重啟一下 剛剛配置好的 logstash.conf 檔案 ,然後重新整理訪問 nginx 中的資原始檔,這個時候會發現,日誌已經儲存到 elasticsearch 當中去了,多次重新整理就會出現類似下面的結果。
注意在 elasticsearch 中的 index 和 type 的命令規則是在前面的 logstash.conf 檔案中定義好的
接下來我們使用 kibana對es收集到的日誌進行圖形化的展示操作。(kibana的版本必須和 elasticsearch的版本一致)
啟動 kibana,預設埠號 5601,可以在 config 目錄下的 kibana.yml 檔案當中進行配置
啟動之後介面如下所示:
按照圖上標註的步驟進行操作,建立完了 pattern 之後重新整理頁面,點選第一個選單 Discover,可以看到收集的日誌已經被當做圖表的形式進行了展示。
這個時候重新整理訪問 nginx 釋出的資源,然後再重新整理這個介面,可以看到對應的生成統計圖會發生變化
可以使用 kibana 生成不同形態的圖形(點選第二個選單 Visualize):介面如下:
這裡選擇一個折線圖 LineChart,會到達這個介面,選擇 logstash_* 就是最開始進入kibana時候建立的pattern。
然後也可以選擇橫座標 x 軸按照時間進行展示,點選執行的三角按鈕即可看到下面的圖:
按照上圖點選兩下 save 按鈕可以儲存影象:
點選主選單第三個 Dashboard ,點選 add ,選擇 Default ,然後再點save save Dashboard
於是就可以在 kibana當中成功的儲存了這個生成的影象,每次啟動進入 Dashboard便可進行檢視
在實際的使用過程中一般使用者訪問的是 html 的時候才是網站的真正流量。需要對日誌進行過濾
再次來到 elasticsearch 的 dashboard 那個面板,新增搜尋的條件。
輸入*.html 即可查詢到 只包含html引數資訊的流量。
Filebeat 簡介:
Filebeat可以理解為是一個 Logstash 的輕裝上陣,對資源的要求更低,可以保證高採集效率
使用了 FileBeat 之後監控系統的架構就會變成下面這樣的。
一般在使用監控系統的時候,elk會採用下面的部署方案:
叢集的話架構配置如下:
海量日誌部署的架構:
日誌吞吐量越來越多,日誌複雜度變高,這樣的架構師不能滿足需求的,需要升級。
引入kafka或者activemq