ELK入門與簡單應用
ELK,也就是Elasticsearch、Logstash、Kibana三者的結合,是一套開源的分布式日誌管理方案.
更多詳情,請見https://github.com/jeanphorn/elk-stack
Elasticsearch:負責日誌存儲、檢索和分析
LogStash:負責日誌的收集、處理
Kibana:負責日誌的可視化
方案:
2. 環境搭建
為整體環境創建一個合適的目錄,mkdir $project_path/ELK
, project_path 根據情況而定,例如”/usr/local”。
2.1 安裝依賴
logstash和elasticsearch均依賴java,所以安裝這兩個之前,我們應該先安裝好java,版本 > java7. java的安裝這裏不做贅述。
2.2 logstash
2.2.1 基礎安裝配置
首先,去Elastic官網下載對應平臺安裝文件,可下載的文件類型有zip、rpm、deb、tgz等,個人建議直接下載zip包,解壓即用,方便。
wget https://download.elastic.co/logstash/logstash/logstash-all-plugins-2.4.0.zip
unzip logstash-all-plugins-2.4.0.zip
解壓之後,進入logstash目錄,創建”conf”目錄,編寫配置文件。下面以收集分析nginx access 日誌為例。
配置文件分為三個部分:input,filter,output。三部分文件寫,也可寫一塊
input
定義輸入,file為輸入的文件,可以有多個。出file外,還有stdin、TCP、syslog、collectd等。filter
過濾配置,可以將日誌整理成自己想要的格式。logstash有豐富的過濾插件,date處理、grop正則捕獲、GeoIP、JSON編碼、key-value切分等等。
grok是logstash最重要的插件,在grok中定義好正在表達式,可以在其他地方引用它。語法這裏不過多介紹,需要可以自己從網上學習。這裏我們要抓取Nginx日誌,需要根據Nginx的日誌格式寫一個過濾的正則表達式,將其保存在”.logstash/patterns/nginx”文件中,內容如下:
1
2
註意: 此處的正則表達式要和nginx的日誌格式相對應,否則會匹配失敗,無法將nginx日誌離散取值。
nginx 日誌格式例子:
output
logstash的輸出也有多種,標準輸出,輸出到elasticsearch,redis等等, 可以同時指定多個輸出,stdout方便調試,查看實時的日誌。
輸出到es說明:hosts 為es的ip和端口;index為索引名稱,按日期分方便管理;運行logstsh:
./bin/logstash -f conf/logstash-nginx.conf
選項”-f”是logstahsh的配置文件,如果有多個配置文件,也可以是一個目錄。
%{NUMBER:status:int} 將status字段設為整型,
%{NUMBER:request_time:float} 將Request_time設為float類型,[重要],方便kibana計算可視化
logstash 2.2.2 分角色部署
將logstash按功能分成三個角色:shipper、broker和indexer。每個角色使用不同的logstash配置。
shipper角色(日誌收集)
input部分配置要收集的日誌文件或原始日誌來源
filter部分可以用grok過濾日誌
output部分將格式化的日誌輸出到broker角色中(此處以redis為例,作為緩沖消息隊列)
broker角色(消息隊列)
需要為此角色啟動一個redis服務,可以去redis官網進行下載,然後編譯安裝,這裏不再做詳細介紹。
啟動服務時,先修改或新建一個redis配置文件(如,redis.conf), 安全起見,配置下端口和密碼,其他的可使用默認配置。
./redis-server /path/to/redis.conf
indexer角色
功能:從redis中取出日誌,然後存儲到elasticsearch集群中。
提示:為提高數據的寫入效率,可以根據機器硬件因素適當提高threads和works的數量,也可以多設置幾個indexer角色,同時運行。
2.3 elasticsearch部署
2.3.1 下載
首先下載es文件,和logstash類似,這裏直接下載zip文件
2.3.2 配置es
主要是配置elasticsearch.yml文件,主要有network,node,path,memory等幾個方面,單機模式下主要配置network,其他采用默認即可。
2.3.3 運行elasticsearch
./bin/./bin/elasticsearch
2.3.4 elasticsearch 集群部署
在日誌量比較大時候,單機模式滿足我們的需求,這時候可以選擇將elasticsearch集群化部署。
通過配置elasticsearch.yml文件,配置各個節點。es2.4的版本是可以自動發現節點的,可以將節點的ip(多個或其中一個)放在discovery.zen.ping.unicast.hosts中即可。 下面是一個節點配置的例子:
“node.master”和”node.data”可以選擇性配置
master為true,data為false:節點不存儲數據,作為協調者
master為false,data為true:節點作為數據存儲節點,不會被選為master節點
master為false,data為false:均衡負載
默認都為true
使用以下命令查看節點的狀態:
curl 10.16.59.99:9200/_cat/nodes?v
2.3.5 使用head插件管理和查看集群狀態
安裝head插件,進入elasticsearch目錄下,運行如下命令:
./bin/plugin install mobz/elasticsearch-head
安裝之後可以便可通過流量器進行訪問了,註意是否需要設置防火墻,也可以配置nginx 反向代理通過80端口訪問。
2.4 kibana部署
2.4.1 下載解壓kibana文件
wget https://download.elastic.co/kibana/kibana/kibana-4.6.1-linux-x86_64.tar.gz
tar -zxvf kibana-4.6.1-linux-x86_64.tar.gz -C ./
2.4.2 配置kibana.yml文件
打開kibana.yml文件,主要修改以下三個點(找到對應的地方修改):
2.4.3 運行kibana
./bin/kibana
運行以後可通過瀏覽器用地址加端口打開kibana的可視化頁面。(網絡開放情況下)
2.4.4 為kibana服務配置反向代理(非必須)
有些情況下,很多服務器只開發80,443等少量常用端口,這時候如果還想通過80端口訪問,需要配置反向代理,這裏以nginx為例。
在nginx的配置目錄中(include),添加”kibana_proxy.conf”文件,內容如下:
將此文件包含到nginx.conf中
“`
http {
include mime.types;
default_type application/octet-stream;
}
“`
如果已包含include目錄,則直接重新加載nginx
$nginx_path/sbin/nginx -s reload
3. kibana使用簡單說明
3.1 設置index
首次訪問kibana的時候,會被要求定義一個index pattern用來匹配一個或者多個索引名。之後還可以從頂部導航欄中的“settings”添加更多的index pattern。通過瀏覽器訪問kibana界面,初次使用跳轉到如下界面:
我們可以指定一個或者匹配多個elasticsearch所以的index pattern。通配符”*”匹配索引名中0到多個字符。選擇一個包含時間戳的索引字段可以用來做基於時間處理。新索引中帶有時間戳,定期生成,再選擇”Use event times to create index names”選項,然後選擇”Index pattern interval”可以提高搜索性能。
3.2 Discover查詢數據
進入kibana的Discover,在這裏可以提交搜索請求,過濾搜索結果,返回檢索數據。Discover屬於交互式查詢數據,我們可以看到匹配搜索請求的文檔總數,獲取字段值得統計情況。
時間過濾器
在界面的右上角有個時間過濾器的設置,默認值為最近15分鐘,它將搜索結果限定在特定的時間範圍內。打開時間過濾器,有三種方式可供選擇,一是快速選擇一個時間段(今天,這周,最近15分鐘,最近半小時,最近1小時等等); 二是相對時間選擇,可以選擇自多長時間到現在;三是絕對時間選擇,自主選擇時間段的數據。
搜索數據
支持的語法:Lucene 查詢語法和基於JSON的query DSL。主要操作步驟點:
a) 簡單文本搜索,直接輸入文本字符串。
b) 搜索特定字段值,在值前面加上字段的值。例如,“status:200”將會顯示所有status字段為200的內容。
c) 搜索一個值的範圍,使用範圍查詢語法, [Start_value TO End_value], 例如要查找4xx的狀態碼,可以輸入”status:[400 TO 499]”.
d) 更復雜的搜索,可以使用and,or和not。
新建查詢、保存查詢、加載已保存的查詢
3.3 可視化功能
Visualize標簽用來設計可視化,可以保存可視化的結果拱以後使用,加載合並到儀表盤裏。界面如下圖所示。
可視化功能基於以下幾種數據源類型:
新的交互式查詢
已保存的查詢
已保存的可視化
可視化操作編輯器。
可視化編輯器用來配置編輯可視化視圖,如下圖所示:
工具欄
工具欄有交互式搜索框,可保存加載可視化,刷新可視化數據。
聚合構建器(Aggregation Builder)
左側有metric和bucket聚合。bucket效果類似於sql group by語句。想進一步了解聚合,可以閱讀elasticsearch aggregation reference.
在柱狀圖或折線圖中,metrics做Y軸,buckets做X軸,餅圖裏metrics做分片大小,buckets做分片數量。
3.4 儀表盤
Kibana中dashboard能夠自由排列已保存的可視化,還可以保存、重載和分享當前的儀表盤。儀表盤主要操作有以下幾方面:
工具欄上
創建一個新的儀表盤
首次進入dashboard,Kibana顯示一個空白儀表盤,可以通過添加可視化視圖構建儀表盤。添加可視化到儀表盤
點擊右側的“+”號按鈕,從Visualize容器中選擇合適的可視化放入儀表盤中,可以通過拖拽調整視圖的位置和大小。保存和加載儀表盤
容器
可進行的操作有移動容器、改變容器大小、刪除容器、查看容器詳細信息。
還可以修改可視化,即對可視化視圖進行編輯。
4. 參考資料
[1]. https://www.elastic.co
[2]. 《ELK stack權威指南》
[3]. https://discuss.elastic.co/t/nginx-log-filter-problem/46744
[4]. http://grokdebug.herokuapp.com/
[5]. https://chenjiehua.me/linux/elk-log-system-setup.html
ELK入門與簡單應用