1. 程式人生 > >使用 elasticsearch、LogStash、Kibana完成網站流量的監控系統(基於nginx的訪問日誌實現流量監控)

使用 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