前言
調研了ELK技術棧,發現新一代的logstash-forward即Filebeat,使用了golang,性能超logstash,部署簡單,占用資源少,可以很友善的和logstash和ES對接,作為日志檔案采集元件。是以決定使用ELK+Filebeat的架構進行平台搭建。Filebeat是Beats家族的一員,後續可以使用Packetbeat進行網絡資料采集、Winlogbeat進行Windosw事件采集、Heartbeat進行心跳采集、Metricbeat進行系統名額采集。這種架構解決了 Logstash 在各伺服器節點上占用系統資源高的問題。相比 Logstash,Beats 所占系統的 CPU 和記憶體幾乎可以忽略不計。另外,Beats 和 Logstash 之間支援 SSL/TLS 加密傳輸,用戶端和伺服器雙向認證,保證了通信安全。
各元件承擔的角色和功能:
Elasticsearch:分布式搜尋和分析引擎,具有高可伸縮、高可靠和易管理等特點。基于 Apache Lucene 建構,能對大容量的資料進行接近實時的存儲、搜尋和分析操作。通常被用作某些應用的基礎搜尋引擎,使其具有複雜的搜尋功能;
Logstash:資料處理引擎,它支援動态的從各種資料源搜集資料,并對資料進行過濾、分析、豐富、統一格式等操作,然後存儲到 ES;
Kibana:資料分析和可視化平台。與 Elasticsearch 配合使用,對資料進行搜尋、分析和以統計圖表的方式展示;
Filebeat:ELK 協定棧的新成員,一個輕量級開源日志檔案資料搜集器,使用 golang 基于 Logstash-Forwarder 源代碼開發,是對它的替代。在需要采集日志資料的 server 上安裝 Filebeat,并指定日志目錄或日志檔案後,Filebeat 就能讀取資料,迅速發送到 Logstash 進行解析。
ELK 常用架構及使用場景介紹
在這個章節中,我們将介紹幾種常用架構及使用場景。
All-In-One
在這種架構中,隻有一個 Logstash、Elasticsearch 和 Kibana 執行個體,集中部署于一台伺服器。Logstash 通過輸入插件從多種資料源(比如日志檔案、标準輸入 Stdin 等)擷取資料,再經過濾插件加工資料,然後經 Elasticsearch 輸出插件輸出到 Elasticsearch,通過 Kibana 展示。詳見圖 1。
All-in-One
這種架構非常簡單,使用場景也有限。初學者可以搭建這個架構,了解 ELK 如何工作。
Logstash 分布式采集
這種架構是對上面架構的擴充,把一個 Logstash 資料搜集節點擴充到多個,分布于多台機器,将解析好的資料發送到 Elasticsearch server 進行存儲,最後在 Kibana 查詢、生成日志報表等。詳見圖 2。
Logstash 分布式采集
這種結構因為需要在各個伺服器上部署 Logstash,而它比較消耗 CPU 和記憶體資源,是以比較适合計算資源豐富的伺服器,否則容易造成伺服器性能下降,甚至可能導緻無法正常工作。
Beats 分布式采集
這種架構引入 Beats 作為日志搜集器。目前 Beats 包括四種:
Packetbeat(搜集網絡流量資料);
Topbeat(搜集系統、程序和檔案系統級别的 CPU 和記憶體使用情況等資料);
Filebeat(搜集檔案資料);
Winlogbeat(搜集 Windows 事件日志資料)。
Beats 将搜集到的資料發送到 Logstash,經 Logstash 解析、過濾後,将其發送到 Elasticsearch 存儲,并由 Kibana 呈現給使用者。詳見圖 3。
Beats 分布式采集
這種架構解決了 Logstash 在各伺服器節點上占用系統資源高的問題。相比 Logstash,Beats 所占系統的 CPU 和記憶體幾乎可以忽略不計。另外,Beats 和 Logstash 之間支援 SSL/TLS 加密傳輸,用戶端和伺服器雙向認證,保證了通信安全。
是以這種架構适合對資料安全性要求較高,同時各伺服器性能比較敏感的場景。
引入消息隊列機制的 Logstash 分布式架構
這種架構使用 Logstash 從各個資料源搜集資料,然後經消息隊列輸出插件輸出到消息隊列中。目前 Logstash 支援 Kafka、Redis、RabbitMQ 等常見消息隊列。然後 Logstash 通過消息隊列輸入插件從隊列中擷取資料,分析過濾後經輸出插件發送到 Elasticsearch,最後通過 Kibana 展示。詳見圖 4。
引入消息隊列機制的 Logstash 分布式架構
這種架構适合于日志規模比較龐大的情況。但由于 Logstash 日志解析節點和 Elasticsearch 的負荷比較重,可将他們配置為叢集模式,以分擔負荷。引入消息隊列,均衡了網絡傳輸,進而降低了網絡閉塞,尤其是丢失資料的可能性,但依然存在 Logstash 占用系統資源過多的問題。
引入消息隊列機制的 Filebeat + Logstash 分布式架構
截至到我們調研為止,Filebeat 已經支援 kafka 作為 ouput,5.2.1 版本的 Logstash 已經支援 Kafka 作為 Input,和上面的架構不同的地方僅在于,把 Logstash 日志搜集發送替換為了 Filebeat。這種架構是目前最為完美的,有極低的用戶端采集開銷,引入消息隊列,均衡了網絡傳輸,進而降低了網絡閉塞,尤其是丢失資料的可能性。
引入消息隊列機制的 Filebeat + Logstash 分布式架構
對于綠灣的架構選型來說,高品質的資料傳輸、日志采集的低資源開銷都需要考慮,同時,也需要logstash強大的插件支援靈活的日志資料過濾處理。确定采用引入消息隊列機制的 Filebeat + Logstash 分布式架構。
接下來我們進行初步的探視,利用測試環境體驗下ELK Stack + Filebeat,測試環境我們就不進行 Kafka 的配置了,因為他的存在意義在于提高可靠性。
測試環境
CentOS 7.2
JDK 1.8.0_65
Filebeat 5.2.1
Log stash 5.2.1
ES 5.2.1
Kibana 5.2.1
機器分布
IP Role
172.16.134.2 Logstash, ES, Kibana
172.16.134.3 Filebeat
172.16.134.8 Filebeat
浏覽器支援
Kibana 4.x 不支援 IE9 及以下;Kibana 3.1 雖然支援 IE9,但是不支援 Safari(iOS)和 Chrome(Android)。具體對浏覽器的支援,請看這裡。
部署步驟
ELK 官網對于每種軟體提供了多種格式的安裝包(zip/tar/rpm/DEB),以 Linux 系列系統為例,如果直接下載下傳 RPM,可以通過 rpm -ivh path_of_your_rpm_file直接安裝成系統 service。以後就可以使用 service 指令啟停。比如service elasticsearch start/stop/status。很簡單,但缺點也很明顯,就是不能自定義安裝目錄,相關檔案放置比較分散。
實際使用中更常用是使用 tar 包安裝,每種軟體産品的安裝過程非常相似。
Step1. SSH免密鑰
假設所有步驟都在admin賬戶下執行,所有伺服器的admin賬戶密碼統一,需要打通172.16.134.2至所有agent的SSH免密登入,假設list_all已經包含了所有agent機器的清單:
172.16.134.2
172.16.134.3
172.16.134.8
進行密鑰打通:
ssh-keygen
for agent in
cat list_all
;do ssh-copy-id -i /home/admin/.ssh/id_rsa.pub admin@${agent};done;
Step2. JDK安裝
JDK 是 IBM Java 8。ELK 需要 Oracle 1.7(或者是 OpenJDK 1.7) 及以上,如果是 IBM Java,則需要 8 及以上的版本。具體資訊。
pssh -h list_all “sudo yum install -y java-1.8.0-openjdk.x86_64”
修改環境變量:
.bash_profile
Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
User specific environment and startup programs
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64
PATH= JAVAHOME/bin: PATH
export PATH JAVA_HOME
分發環境變量配置:
pscp -h list_all ~/.bash_profile /tmp
pssh -h list_all “sudo cp /tmp/.bash_profile ~/”
Step3. 服務安裝
安裝ElasticSearch
下載下傳安裝包,如果待安裝機器能通路外網,可以直接用以下指令下載下傳安裝包。
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.1.tar.gz
否則下載下傳好後用 ftp 用戶端等工具把包傳過去。
解壓到172.16.134.2指定目錄/home/admin/soft:
tar zxvf elasticsearch-5.2.1.tar.gz -C /home/admin/soft/
這時就能在 /home/admin/soft 下看到剛才解壓出來的 elasticsearch-5.2.1 檔案夾。
修改配置config/elasticsearch.yml:
cluster.name: lw-test
node.name: v134002.yn1.lwsite.net
path.data: /home/admin/soft/elasticsearch-5.2.1/data
path.logs: /home/admin/soft/elasticsearch-5.2.1/logs
network.host: 172.16.134.2
http.port: 9200
Elasticsearch預設使用混合mmapfs / niofs目錄來存儲其索引。 對mmap計數的預設作業系統限制可能過低,這可能導緻記憶體不足異常。修改核心參數vm.max_map_count:
sudo sysctl -w vm.max_map_count=262144
sudo vim /etc/sysctl.conf
vm.max_map_count = 262144
确認核心參數是否生效:
sysctl vm.max_map_count
修改 /etc/security/limits.conf,添加:
admin soft nofile 65536
admin hard nofile 65536
修改 /etc/security/limits.d/90-nproc.conf,添加:
admin soft nproc 2048
重新以admin登入後運作:
/home/admin/soft/elasticsearch-5.2.1/bin/elasticsearch &
驗證是否啟動:
curl ‘http://172.16.134.2:9200’
看到如下輸出表示啟動成功:
{
“name” : “luOq_eh”,
“cluster_name” : “elasticsearch”,
“cluster_uuid” : “mIcflXKsR3-ER66MCTSJzA”,
“version” : {
“number” : “5.2.1”,
“build_hash” : “db0d481”,
“build_date” : “2017-02-09T22:05:32.386Z”,
“build_snapshot” : false,
“lucene_version” : “6.4.1”
},
“tagline” : “You Know, for Search”
}
可以看到,它跟其他的節點的傳輸端口為9300,接受HTTP請求的端口為9200。
安裝ElasticSearch Head (可選)
Head是一個用浏覽器跟ES叢集互動的插件,可以檢視叢集狀态、叢集的doc内容、執行搜尋和普通的Rest請求等,本文不複述,這個不是重點。
安裝Logstash
下載下傳安裝包,如果待安裝機器能通路外網,可以直接用以下指令下載下傳安裝包。
wget https://artifacts.elastic.co/downloads/logstash/logstash-5.2.1.tar.gz
否則下載下傳好後用 ftp 用戶端等工具把包傳過去。
解壓到172.16.134.2指定目錄/home/admin/soft:
tar -zxvf logstash-5.2.1.tar.gz -C /home/admin/soft
一個Logstash的pipeline由3部分組成:input, filter, output。
Basic Logstash Pipeline
為了進行安裝完成後的測試,我們運作下最基本的pipeline:
cd logstash-5.2.1
bin/logstash -e ‘input { stdin { } } output { stdout {} }’
-e 可以允許進行指令行的直接配置,而無需進行檔案配置。這個pipeline例子從标準輸入擷取資料 stdin,并把結構化資料輸出到标準輸出stdout。在啟動後,看到日志Pipeline main started後,在終端中輸入hello world,可以在終端中看到對應輸出:
hello world
2017-02-18T09:48:22.414Z v134002.yn1 hello world
在我們的架構中,Logstash的input是beat,output是ES,需要對應的插件。
安裝beat input插件:
./bin/logstash-plugin prepare-offline-pack logstash-input-beats
./bin/logstash-plugin install file:///home/admin/soft/logstash-5.2.1/logstash-offline-plugins-5.2.1.zip
配置 5044 端口作為 Filebeat 的連接配接和建立 ES 索引。修改 logstash.conf 配置檔案,儲存在 config 目錄:
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => “172.16.134.2:9200”
manage_template => false
index => “%{[@metadata][beat]}-%{+YYYY.MM.dd}”
document_type => “%{[@metadata][type]}”
}
}
Logstash 使用該配置使用 ES 的索引,和 Filebeat 做的事情是一樣的,不過擁有了額外的緩存以及強大豐富的插件庫。
啟動 logstash :
./bin/logstash -f config/logstash.conf &
安裝Kibana
Kibana 從 ES 擷取資料做前端的可視化展示。 它提供了使用者體驗極佳的高定制化 UI,可以靈活配置出你需要的 Dashboard。 Dashboard 可以輕易的儲存、連結和分享。
測試環境,筆者把 Kibana 和 ES 進行了混部,但是在實際生産環境中是沒有必要的。我們可以通過配置檔案 config/kibana.yml 中的URL(IP:PORT) 去指定需要通路的 ES 服務端。
curl -L -O https://artifacts.elastic.co/downloads/kibana/kibana-5.2.1-linux-x86_64.tar.gz
tar xzvf kibana-5.2.1-linux-x86_64.tar.gz
cd kibana-5.2.1-linux-x86_64/
./bin/kibana
修改配置 config/kibana.yml:
elasticsearch.url: “http://172.16.134.2:9200”
server.host: “172.16.134.2”
啟動服務:
./bin/kibana &
在浏覽器中通路,确認是否正常啟動:
http://172.16.134.2:5601/
安裝Filebeat
在 172.16.134.3, 172.16.134.8 上進行Filebeat的安裝,采集 Filebeat 自身的運作日志:/home/admin/soft/filebeat-5.2.1-linux-x86_64/logs/filebeat。
在安裝之前,需要确認以上服務已經正常運作:
存儲和索引資料的 Elasticsearch 已經啟動。
UI 展示的 Kibana 已經啟動。
寫入和過濾資料的 Logstash 已經啟動。
下載下傳安裝包,安裝服務:
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.2.1-linux-x86_64.tar.gz
tar zxvf filebeat-5.2.1-linux-x86_64.tar.gz -C /home/admin/soft/
修改配置:
cp filebeat.full.yml filebeat.yml
修改配置
filebeat.prospectors:
- input_type: log
paths:
- /home/admin/soft/filebeat-5.2.1-linux-x86_64/logs/filebeat
output.logstash:
hosts: [“172.16.134.2:5044”]
logging.level: debug 這個配置一般情況下不要開,因為會把所有 message 都會明文列印出來,一來不安全,二來磁盤壓力大。
測試配置是否正确:
./filebeat -configtest -e
有如下輸出表示正常:
Config OK
在 Elasticsearch 中, Index Pattern 用于定義字段應如何分析的設定和映射。Filebeat 的預設 Index Pattern 由軟體包安裝。 如果在 filebeat.yml 配置檔案中接受模闆加載的預設配置,則 Filebeat 在成功連接配接到Elasticsearch後會自動加載模闆。 如果模闆已存在,預設不會覆寫,但是可以通過配置進行覆寫。如果要禁用自動模闆加載,或者要加載自己的模闆,可以在Filebeat配置檔案中更改模闆加載的設定。 如果選擇禁用自動模闆加載,則需要手動加載模闆。
配置模闆加載 - 僅Elasticsearch輸出支援。
手動加載模闆 - Logstash輸出所需。
由于我們需要的是輸出到 Logstash,是以我們使用手動模闆加載:
curl -XPUT ‘http://172.16.134.2:9200/_template/filebeat’ -d@/home/admin/soft/filebeat-5.2.1-linux-x86_64/filebeat.template.json
如果已經使用 Filebeat 将資料索引到 Elasticsearch 中,則索引可能包含舊文檔。 加載 Index Pattern 後,您可以從filebeat- * 中删除舊文檔,以強制 Kibana 檢視最新的文檔。 使用此指令:
curl -XDELETE ‘http://172.16.134.2:9200/filebeat-*’
啟動服務:
./filebeat start &
如果對于生産環境,我們應該用 systemd 來管理程序,修改 /usr/lib/systemd/system/filebeat.service :
[Unit]
Description=Filebeat
Documentation=https://www.elastic.co/guide
After=network.target
[Service]
Type=Simple
ExecStart=/home/admin/soft/filebeat-5.2.1-linux-x86_64/filebeat -c /home/admin/soft/filebeat-5.2.1-linux-x86_64/filebeat.yml -httpprof 0.0.0.0:6060
ExecStop=/bin/kill -WINCH ${MAINPID}
Restart=always
RestartSec=0
WatchdogSec=1min
LimitNOFILE=100
LimitNPROC=100
[Install]
WantedBy=multi-user.target
其中filebest-current隻是軟連接配接,連接配接到真實目錄,便于後續維護更新。
腳本 filebeat-stop.sh:
!/bin/bash
pid=
ps aux | grep filebeat | grep -v grep | awk '{print$2}'
sudo kill -9 $pid
分發 filebeat.service filebeat-stop.sh
pscp -h list_filebeat filebeat.service /tmp
pssh -h list_filebeat “sudo cp /tmp/filebeat.service /usr/lib/systemd/system/”
pscp -h list_filebeat filebeat-stop.sh /home/admin/soft/filebeat-current/
pssh -h list_filebeat “sudo systemctl daemon-reload”
pssh -h list_filebeat “sudo systemctl enable filebeat”
啟動/停止腳本:
sudo systemd start filebeat
sudo systemd stop filebeat
注意,所采集的日志需要有 admin 使用者的讀權限,并且路徑必須有執行權限。
Step4. Kibana 中加載 Index Pattern
在 Kibana 的 Discover 子產品中,可以添加 filebeat-* 作為 Index Pattern。看到如下界面,說明添加成功:
Index Pattern 添加成功
我們可以根據 Fields 進行日志索引,還可以對其進行排序。
Q & A
Q: Discover: Fielddata is disabled on text fields by default. Set fielddata=true on [message] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.
A: Fielddata 會使用大量的堆記憶體,尤其是加載了大量的 text fileds。一旦 fileddata 被加載進入了堆,在生命周期内會一直常駐。同時,加載 fileddata 非常耗時,影響使用者體驗。這就是為什麼預設禁止了 fielddata。如果嘗試對 text field 進行排序、聚合,就會報錯如上。在嘗試開啟 fielddata 之前應該想想為什麼要這麼做,因為通常情況下不需要。
使用 Kibana Discover 搜尋日志
Discover界面主要是通過各種過濾器搜尋日志,如時間、type、loglevel等,并對所搜尋到的日志做簡單統計。界面如下所示,index 欄顯示目前選擇的 elasticsearch 中的 index。以下隻做引導式介紹。
Discover 界面
Search 表示的是搜尋欄,輸入想要搜尋的關鍵字;
filebeat 表示的是 index pattern 欄,我們之前導入的是 filbeat-*;
Selected Fields 表示的是已選字段,右側的内容框隻會顯示已選字段資料;
Available Fileds 可以對預定義字段進行篩選,可以對 Popular 中顯示的可選字段進行篩選;
Popular 顯示的是最常用的字段;
右上角的 Last 15 minutes 是用來選擇時間區間的,也可以選擇定時重新整理 Auto Refresh;
搜尋欄的使用
全字段比對:搜尋功能的背景支援是elasticsearch,屬于全文搜尋引擎,可以通過雙引号進行任何字元串的比對,如”write_bytes=383”,搜尋結果為 message 字段包含了該字元串的 日志資料:
全字段比對
使用字段和邏輯表達:Elasticsearch的資料源是經過logstash格式化的日志,該格式通過elasticsearch的mapping API對應到kibana的字段。在文檔欄的 source 中可以檢視到格式化後的日志,以及原日志。搜尋時可以使用字段和邏輯表達,如type: log等。這裡注意,輸入過程中kibana的搜尋欄會動态解析搜尋内容,搜尋表達式輸入過程中可能會顯示紅框,提示無法解析,待全部輸入完全即可:
使用字段和邏輯表達
使用過濾器:過濾器可以疊加使用,左側邊欄隻能夠對已有字段進行設定。滑鼠移動到對應字段,字段會變灰,并顯示該字段統計量前五的資料,如下所示:
使用過濾器
點選對應+(正向過濾)、-(反向過濾)進行過濾。對所有字段的過濾,可以在文檔欄的 source 中進行選擇,如下所示:
所有字段過濾
選擇後的過濾器會顯示在搜尋欄下方,便于進行設定:
編輯過濾器
圖示和文字可以達到相同的功能,分别是過濾器 Enable、Disable、反選、鎖定(更改搜尋内容不變更)和删除。
工具欄的使用
過濾器設定好後,可以對該設定在工具欄中進行儲存,作為visualize的資料源。三個圖示分别是開始一個新的搜尋(New)、儲存搜尋(Save)、打開搜尋(Open)、分享搜尋(Share)。
工具欄
柱狀圖統計
柱狀圖實時對搜尋内容進行統計,以時間作為橫坐标,顯示搜尋到的總日志條數。也可以通過箭頭按鈕展開或折疊顯示相應的文本記錄。預設一頁最多顯示500條。滑鼠移動到相應柱狀,可顯示對應條數,數遍變為十字,可以進行放大(zoom in)或縮小(zoom out)。
文檔欄字段選擇
預設文檔欄顯示所有字段,需要調整顯示字段,可以在頁面左邊字段選擇框添加和删除。滑鼠移動到相應字段,字段變灰,同時出現add或remove按鈕。所選字段也可以進行移動布局,或排序。字段是否作為popular field,在settings中進行設定。
結合 Discover 和 Visualize 進行可視化圖示展示
假設我們需要對來自2台 Filebeat 采集到的 message 數量按照 host 進行差別統計 sum。
首先我們在 Discover 中定義一個 Search , Selected Fields 選擇 host message:
定義 Search
點選 Save 進行儲存,命名為 test1。
然後我們在 Visualize 裡 Vertical Bar Chart ,在右側的 Or, From a Saved Search 裡搜尋 test1,并且進入編輯。Y-Axis 和 X-Axis 分别配置如下:
Y 軸配置
X 軸配置
點選Apply Changes所得到的圖表如下:
柱狀圖
作者:大資料之心
連結:http://www.jianshu.com/p/934c457a333c
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。