ELK實時日誌分析系統

轉自:http://www.ibm.com/developerworks/cn/opensource/os-cn-elk/

ELK 協議棧介紹及體系結構

ELK 其實並不是一款軟件,而是一整套解決方案,是三個軟件產品的首字母縮寫,Elasticsearch,Logstash 和 Kibana。這三款軟件都是開源軟件,通常是配合使用,而且又先後歸於 Elastic.co 公司名下,故被簡稱爲 ELK 協議棧,見圖 1。

圖 1.ELK 協議棧
圖 1.ELK 協議棧

Elasticsearch

Elasticsearch 是一個實時的分佈式搜索和分析引擎,它可以用於全文搜索,結構化搜索以及分析。它是一個建立在全文搜索引擎 Apache Lucene 基礎上的搜索引擎,使用 Java 語言編寫。目前,最新的版本是 2.1.0。

主要特點

  • 實時分析
  • 分佈式實時文件存儲,並將每一個字段都編入索引
  • 文檔導向,所有的對象全部是文檔
  • 高可用性,易擴展,支持集羣(Cluster)、分片和複製(Shards 和 Replicas)。見圖 2 和圖 3
  • 接口友好,支持 JSON
圖 2. 集羣
圖 2. 集羣
圖 3. 分片和複製
圖 3. 分片和複製

Logstash

Logstash 是一個具有實時渠道能力的數據收集引擎。使用 JRuby 語言編寫。其作者是世界著名的運維工程師喬丹西塞 (JordanSissel)。目前最新的版本是 2.1.1。

主要特點

  • 幾乎可以訪問任何數據
  • 可以和多種外部應用結合
  • 支持彈性擴展

它由三個主要部分組成,見圖 4:

  • Shipper-發送日誌數據
  • Broker-收集數據,缺省內置 Redis
  • Indexer-數據寫入
圖 4.Logstash 基本組成
圖 4.Logstash 基本組成

Kibana

Kibana 是一款基於 Apache 開源協議,使用 JavaScript 語言編寫,爲 Elasticsearch 提供分析和可視化的 Web 平臺。它可以在 Elasticsearch 的索引中查找,交互數據,並生成各種維度的表圖。目前最新的版本是 4.3,簡稱 Kibana 4。

ELK 協議棧體系結構

完整的 ELK 協議棧體系結構見圖 5。基本流程是 Shipper 負責從各種數據源裏採集數據,然後發送到 Broker,Indexer 將存放在 Broker 中的數據再寫入 Elasticsearch,Elasticsearch 對這些數據創建索引,然後由 Kibana 對其進行各種分析並以圖表的形式展示。

圖 5.ELK 協議棧體系結構
圖 5.ELK 協議棧體系結構

ELK 三款軟件之間互相配合使用,完美銜接,高效的滿足了很多場合的應用,並且被很多用戶所採納,諸如路透社,臉書(Facebook),StackOverFlow 等等。

ELK 的安裝及配置

這一部分,我將描述一下如何安裝配置 ELK 協議棧。

選取的實驗平臺爲

  • Ubuntu 14.04
  • Centos 7.1

其中用到的軟件如下

  • Elasticsearch 使用的是 2.1.0
  • Logstash 使用的是 2.1.1
  • Kibana 使用的是 4.3.0
  • 除此之外,還需要用到以下軟件,Nginx,Logstash-forwarder 以及 JDK。

實驗系統架構見圖 6。

圖 6. 實驗系統架構
圖 6. 實驗系統架構

值得注意的是,在我們的實驗中,使用了 Nginx 的反向代理,使得用戶可以從外部訪問到 Kibana,並且它本身具有負載均衡的作用,也能夠提高性能。

特別還提到一下 Logstash-forwarder,這是一款使用 Go 語言編寫的日誌傳輸工具。由於 Logstash 是使用 Java 來運行,爲了提升網絡傳輸效率,我們並不在客戶系統上面使用 Logstash 來傳輸數據。這款軟件就是原來的 Lumberjack,今後慢慢將被 Elastic.co 公司的另外一款產品 Beat 吸收合併到 Filebeat 中,這個超出本文敘述的範疇,就不在這裏詳細討論了。

具體安裝過程如下

  • 步驟 1,安裝 JDK
  • 步驟 2,安裝 Elasticsearch
  • 步驟 3,安裝 Kibana
  • 步驟 4,安裝 Nginx
  • 步驟 5,安裝 Logstash
  • 步驟 6,配置 Logstash
  • 步驟 7,安裝 Logstash-forwarder
  • 步驟 8,最終驗證

安裝前的準備

  1. 兩臺 64 位虛擬機,操作系統是 Ubuntu 14.04,2 CPU,4G 內存,30G 硬盤
  2. 兩臺 64 位虛擬機,操作系統是 CentOS 7.1,2 CPU,4G 內存,30G 硬盤
  3. 創建用戶 elk 和組 elk,以下所有的安裝均由這個用戶操作,並授予 sudo 權限
  4. 如果是 CentOS,還需要配置官方 YUM 源,可以訪問 CentOS 軟件包

注意:以下所有操作都是在兩個平臺上完成。

步驟 1,安裝 JDK

Elasticsearch 要求至少 Java 7。一般推薦使用 Oracle JDK 1.8 或者 OpenJDK 1.8。我們這裏使用 OpenJDK 1.8。

Ubuntu 14.04

加入 Java 軟件源(Repository)

$ sudo add-apt-repository ppa:openjdk-r/ppa

更新系統並安裝 JDK

$ sudo apt-get update 
$ sudo apt-get install openjdk-8-jdk

驗證 Java

$ java -version
openjdk version "1.8.0_45-internal"
OpenJDK Runtime Environment (build 1.8.0_45-internal-b14)
OpenJDK 64-Bit Server VM (build 25.45-b02, mixed mode)

CentOS 7.1

配置 YUM 源

$ cd /etc/yum.repos.d
$ sudo vi centos.repo

加入以下內容

[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#released updates 
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

安裝 JDK

$ sudo yum install java-1.8.0-openjdk

驗證 Java

$ java -version
openjdk version "1.8.0_65"
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)

步驟 2,安裝 Elasticsearch

Ubuntu 14.04

下載 Elasticsearch 軟件

$ wget https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.1.0/elasticsearch-2.1.0.tar.gz

解壓

$ tar xzvf elasticsearch-2.1.0.tar.gz

文件目錄結構如下:

$ pwd
/home/elk/elasticsearch-2.1.0
$ ls
bin config lib LICENSE.txt NOTICE.txt README.textile

修改配置文件

$ cd config
$ vi elasticsearch.yml

找到 # network.host 一行,修改成以下:

network.host: localhost

啓動 elasticsearch

$ cd ../bin
$ ./elasticsearch

驗證 elasticsearch

$ curl 'localhost:9200/'
{
 "name" : "Surge",
 "cluster_name" : "elasticsearch",
 "version" : {
 "number" : "2.1.0",
 "build_hash" : "72cd1f1a3eee09505e036106146dc1949dc5dc87",
 "build_timestamp" : "2015-11-18T22:40:03Z",
 "build_snapshot" : false,
 "lucene_version" : "5.3.1"
 },
 "tagline" : "You Know, for Search"
}

CentOS 7.1

步驟和上述 Ubuntu 14.04 安裝完全一致

步驟 3,安裝 Kibana

Ubuntu 14.04

下載 Kibana 安裝軟件

$ wget https://download.elastic.co/kibana/kibana/kibana-4.3.0-linux-x64.tar.gz

解壓

$ tar xzvf kibana-4.3.0-linux-x64.tar.gz

文件目錄結構如下:

$ pwd
/home/elk/kibana-4.3.0-linux-x64
$ ls
bin config installedPlugins LICENSE.txt node node_modules optimize 
                               package.json README.txt src webpackShims

修改配置文件

$ cd config
$ vi kibana.yml

找到 # server.host,修改成以下:

server.host:“localhost”

啓動 Kibana

$ cd ../bin
$ ./kibana
[…]
 log [07:50:29.926] [info][listening] Server running at http://localhost:5601
[…]

驗證 Kibana

由於我們是配置在 localhost,所以是無法直接訪問 Web 頁面的。

可以使用 netstat 來檢查缺省端口 5601,或者使用 curl:

$ curl localhost:5601
<script>var hashRoute = '/app/kibana';
var defaultRoute = '/app/kibana';

var hash = window.location.hash;
if (hash.length) {
 window.location = hashRoute + hash;
} else {
 window.location = defaultRoute;
}</script>

CentOS 7.1

步驟和上述 Ubuntu 14.04 安裝完全一致。

步驟 4,安裝 Nginx

Nginx 提供了反向代理服務,可以使外面的請求被髮送到內部的應用上。

Ubuntu 14.04

安裝軟件

$ sudo apt-get install nginx apache2-utils

修改 Nginx 配置文件

$ sudo vi /etc/nginx/sites-available/default

找到 server_name,修改成正確的值。或者使用 IP,或者使用 FQDN。

然後在加入下面一段內容:

server {
 listen 80;
 server_name example.com;
 location / {
 proxy_pass http://localhost:5601;
 proxy_http_version 1.1;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection 'upgrade';
 proxy_set_header Host $host;
 proxy_cache_bypass $http_upgrade; 
 }
 }

注意:建議使用 IP。

重啓 Nginx 服務

$ sudo service nginx restart

驗證訪問

http://FQDN 或者 http://IP

CentOS 7.1

配置 Nginx 官方 yum 源

$ sudo vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

安裝軟件

$ sudo yum install nginx httpd-tools

修改 Nginx 配置文件

$ sudo vi /etc/nginx/nginx.conf

檢查是否 http 塊(http{...})含有下面這一行:

include /etc/nginx/conf.d/*conf

爲 Kibana 創建一個配置文件

$ sudo vi /etc/nginx/conf.d/kibana.conf

加入以下這一段內容:

server {
 listen 80;

 server_name example.com;

 location / {
 proxy_pass http://localhost:5601;
 proxy_http_version 1.1;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection 'upgrade';
 proxy_set_header Host $host;
 proxy_cache_bypass $http_upgrade; 
 }
}

注意:建議使用 IP。

啓動 Nginx 服務

$ sudo systemctl enable nginx
$ sudo systemctl start nginx

驗證訪問

http://FQDN 或者 http://IP

步驟 5,安裝 Logstash

Ubuntu 14.04

下載 Logstash 安裝軟件

$ wget https://download.elastic.co/logstash/logstash/logstash-2.1.1.tar.gz

解壓

$ tar xzvf logstash-2.1.1.tar.gz

文件目錄結構如下:

$ pwd
/home/elk/logstash-2.1.1

$ ls
bin CHANGELOG.md CONTRIBUTORS Gemfile Gemfile.jruby-1.9.lock lib LICENSE NOTICE.TXT vendor

驗證 Logstash

$ cd bin
$ ./logstash -e 'input { stdin { } } output { stdout {} }'
Settings: Default filter workers: 1
Logstash startup completed

顯示如下:

hello elk stack
2015-12-14T01:17:24.104Z 0.0.0.0 hello elk stack

說明 Logstash 已經可以正常工作了。按CTRL-D 退出

CentOS 7.1

步驟和上述 Ubuntu 14.04 安裝完全一致。

步驟 6,配置 Logstash

我們需要配置 Logstash 以指明從哪裏讀取數據,向哪裏輸出數據。這個過程我們稱之爲定義 Logstash 管道(Logstash Pipeline)。

通常一個管道需要包括必須的輸入(input),輸出(output),和一個可選項目 Filter。見圖 7。

圖 7.Logstash 管道結構示意
圖 7.Logstash 管道結構示意

標準的管道配置文件格式如下:

# The # character at the beginning of a line indicates a comment. Use
# comments to describe your configuration.
input {
}
# The filter part of this file is commented out to indicate that it is
# optional.
#filter {
#}
output {
}

每一個輸入/輸出塊裏面都可以包含多個源。Filter 是定義如何按照用戶指定的格式寫數據。

由於我們這次是使用 logstash-forwarder 從客戶機向服務器來傳輸數據,作爲輸入數據源。所以,我們首先需要配置 SSL 證書(Certification)。用來在客戶機和服務器之間驗證身份。

Ubuntu 14.04

配置 SSL

$ sudo mkdir -p /etc/pki/tls/certs etc/pki/tls/private
$ sudo vi /etc/ssl/openssl.cnf

找到 [v3_ca] 段,添加下面一行,保存退出。

subjectAltName = IP: logstash_server_ip

執行下面命令:

$ cd /etc/pki/tls
$ sudo openssl req -config /etc/ssl/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout 
         private/logstash-forwarder.key -out certs/logstash-forwarder.crt

這裏產生的 logstash-forwarder.crt 文件會在下一節安裝配置 Logstash-forwarder 的時候使用到。

配置 Logstash 管道文件

$ cd /home/elk/logstash-2.1.1
$ mkdir conf
$ vi simple.conf

添加以下內容:

input {
 lumberjack {
 port => 5043
 type => "logs"
 ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
 ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
 }
}
filter {
 grok {
 match => { "message" => "%{COMBINEDAPACHELOG}" }
 }
 date {
 match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
 }
}
output {
 elasticsearch { hosts => ["localhost:9200"] }
 stdout { codec => rubydebug }
}

啓動 Logstsh

$ cd /home/elk/logstash-2.1.1/bin
$ ./logstash -f ../conf/simple.conf

CentOS 7.1

在 CentOS 7.1 上配置 Logstash,只有一步配置 SSL 是稍微有點不同,其他全部一樣。

$ sudo vi /etc/pki/tls/openssl.cnf

找到 [v3_ca] 段,添加下面一行,保存退出。

subjectAltName = IP: logstash_server_ip

$ cd /etc/pki/tls
$ sudo openssl req -config /etc/pki/tls/openssl.cnf -x509 -days 3650 -batch -nodes -newkey 
         rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

這裏產生的 logstash-forwarder.crt 文件會在下一節安裝配置 Logstash-forwarder 的時候使用到。

步驟 7,安裝 Logstash-forwarder

注意:Logstash-forwarder 也是一個開源項目,最早是由 lumberjack 改名而來。在作者寫這篇文章的時候,被吸收合併到了 Elastic.co 公司的另外一個產品 Beat 中的 FileBeat。如果是用 FileBeat,配置稍微有些不一樣,具體需要去參考官網。

Ubuntu14.04

安裝 Logstash-forwarder 軟件

注意:Logstash-forwarder 是安裝在另外一臺機器上。用來模擬客戶機傳輸數據到 Logstash 服務器。

配置 Logstash-forwarder 安裝源

執行以下命令:

$ echo 'deb http://packages.elastic.co/logstashforwarder/debian 
                  stable main' | sudo tee /etc/apt/sources.list.d/logstashforwarder.list

$ wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

安裝軟件包

$ sudo apt-get update
$ sudo apt-get install Logstash-forwarder

配置 SSL

$ sudo mkdir -p /etc/pki/tls/certs

把在步驟六中在 Logstash 服務器上產生的 ssl 證書文件拷貝到剛剛創建出來的目錄下:

$ sudo scp user@logstash_server:/etc/pki/tls/certs/logstash_forwarder.crt /etc/pki/tls/certs/

配置 Logstash-forwarder

$ sudo vi /etc/logstash-forwarder.conf

在 network 段("network": {),修改如下:

"servers": [ "logstash_server_private_address:5043" ],
"ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt",
"timeout": 15

在 files 段("files": [),修改如下:

{
"paths": [
 "/var/log/syslog",
 "/var/log/auth.log"
 ],
 "fields": { "type": "syslog" }
}

啓動 Logstash-forwarder

$ sudo service logstash-forwarder start

驗證 Logstash-forwarder

$ sudo service logstash-forwarder status
logstash-forwarder is running

如果有錯誤,則需要去/var/log/logstash-forwarder 目錄下面檢查。

CentOS 7.1

配置 Logstash-forwarder 安裝源

執行以下命令:

$ sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch

$ sudo vi /etc/yum.repos.d/logstash-forwarder.repo

加入以下內容:

[logstash-forwarder]
name=logstash-forwarder repository
baseurl=http://packages.elastic.co/logstashforwarder/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1

存盤退出。

安裝軟件包

$ sudo yum -y install logstash-forwarder

剩餘步驟和上述在 Ubuntu 14.04 上面的做法完全一樣。

步驟 8,最後驗證

在前面安裝 Kibana 的時候,曾經有過驗證。不過,當時沒有數據,打開 Web 頁面的時候,將如下所示:

圖 8. 無數據初始頁面
圖 8. 無數據初始頁面

現在,由於 logstash-forwarder 已經開始傳輸數據了,再次打開 Web 頁面,將如下所示:

圖 9. 配置索引頁面
圖 9. 配置索引頁面

點擊創建按鈕(Create),在選擇 Discover,可以看到如下畫面:

圖 10. 數據展示頁面
圖 10. 數據展示頁面

至此,所有部件的工作都可以正常使用了。關於如何具體使用 Kibana 就不在本文中加以描述了,有興趣的同學可以參考官網。


發佈了44 篇原創文章 · 獲贊 34 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章