天天看點

ELK技術棧.bash_profileGet the aliases and functionsUser specific environment and startup programs修改配置!/bin/bash

前言

調研了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

來源:簡書

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

繼續閱讀