在咱們平常生活中,咱們常常須要回顧之前發生的一些事情;或者,當出現了一些問題的時候,能夠從某些地方去查找緣由,尋找發生問題的痕跡。無可避免須要用到文字的、圖像的等等不一樣形式的記錄。用計算機的術語表達,就是 LOG,或日誌。html
日誌,對於任何系統來講都是及其重要的組成部分。在計算機系統裏面,更是如此。可是因爲如今的計算機系統大多比較複雜,不少系統都不是在一個地方,甚至都是跨國界的;即便是在一個地方的系統,也有不一樣的來源,好比,操做系統,應用服務,業務邏輯等等。他們都在不停產生各類各樣的日誌數據。根據不徹底統計,咱們全球天天大約要產生 2EB(1018)的數據。java
面對如此海量的數據,又是分佈在各個不一樣地方,若是咱們須要去查找一些重要的信息,難道仍是使用傳統的方法,去登錄到一臺臺機器上查看?看來傳統的工具和方法已經顯得很是笨拙和低效了。因而,一些聰明人就提出了創建一套集中式的方法,把不一樣來源的數據集中整合到一個地方。node
一個完整的集中式日誌系統,是離不開如下幾個主要特色的。linux
基於上述思路,因而許多產品或方案就應運而生了。好比,簡單的 Rsyslog,Syslog-ng;商業化的 Splunk ;開源的有 FaceBook 公司的 Scribe,Apache 的 Chukwa,Linkedin 的 Kafak,Cloudera 的 Fluentd,ELK 等等。webpack
在上述產品中,Splunk 是一款很是優秀的產品,可是它是商業產品,價格昂貴,讓許多人望而卻步。nginx
直到 ELK 的出現,讓你們又多了一種選擇。相對於其餘幾款開源軟件來講,本文重點介紹 ELK。web
ELK 其實並非一款軟件,而是一整套解決方案,是三個軟件產品的首字母縮寫,Elasticsearch,Logstash 和 Kibana。這三款軟件都是開源軟件,一般是配合使用,並且又前後歸於 Elastic.co 公司名下,故被簡稱爲 ELK 協議棧,見圖 1。apache
Elasticsearch 是一個實時的分佈式搜索和分析引擎,它能夠用於全文搜索,結構化搜索以及分析。它是一個創建在全文搜索引擎 Apache Lucene 基礎上的搜索引擎,使用 Java 語言編寫。目前,最新的版本是 2.1.0。json
主要特色centos
Logstash 是一個具備實時渠道能力的數據收集引擎。使用 JRuby 語言編寫。其做者是世界著名的運維工程師喬丹西塞 (JordanSissel)。目前最新的版本是 2.1.1。
主要特色
它由三個主要部分組成,見圖 4:
Kibana 是一款基於 Apache 開源協議,使用 JavaScript 語言編寫,爲 Elasticsearch 提供分析和可視化的 Web 平臺。它能夠在 Elasticsearch 的索引中查找,交互數據,並生成各類維度的表圖。目前最新的版本是 4.3,簡稱 Kibana 4。
完整的 ELK 協議棧體系結構見圖 5。基本流程是 Shipper 負責從各類數據源裏採集數據,而後發送到 Broker,Indexer 將存放在 Broker 中的數據再寫入 Elasticsearch,Elasticsearch 對這些數據建立索引,而後由 Kibana 對其進行各類分析並以圖表的形式展現。
ELK 三款軟件之間互相配合使用,完美銜接,高效的知足了不少場合的應用,而且被不少用戶所採納,諸如路透社,臉書(Facebook),StackOverFlow 等等。
這一部分,我將描述一下如何安裝配置 ELK 協議棧。
選取的實驗平臺爲
其中用到的軟件以下
實驗系統架構見圖 6。
值得注意的是,在咱們的實驗中,使用了 Nginx 的反向代理,使得用戶能夠從外部訪問到 Kibana,而且它自己具備負載均衡的做用,也可以提升性能。
特別還提到一下 Logstash-forwarder,這是一款使用 Go 語言編寫的日誌傳輸工具。因爲 Logstash 是使用 Java 來運行,爲了提高網絡傳輸效率,咱們並不在客戶系統上面使用 Logstash 來傳輸數據。這款軟件就是原來的 Lumberjack,從此慢慢將被 Elastic.co 公司的另一款產品 Beat 吸取合併到 Filebeat 中,這個超出本文敘述的範疇,就不在這裏詳細討論了。
注意:如下全部操做都是在兩個平臺上完成。
Elasticsearch 要求至少 Java 7。通常推薦使用 Oracle JDK 1.8 或者 OpenJDK 1.8。咱們這裏使用 OpenJDK 1.8。
Ubuntu 14.04
加入 Java 軟件源(Repository)
1
|
$ sudo add-apt-repository ppa:openjdk-r/ppa
|
更新系統並安裝 JDK
1
2
|
$ sudo apt-get update
$ sudo apt-get install openjdk-8-jdk
|
驗證 Java
1
2
3
4
|
$ 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 源
1
2
|
$ cd /etc/yum.repos.d
$ sudo vi centos.repo
|
加入如下內容
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[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=<
a
href
=
"../../../../../etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7"
><
code
>file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7</
code
></
a
>
|
安裝 JDK
1
|
$ sudo yum install java-1.8.0-openjdk
|
驗證 Java
1
2
3
4
|
$ 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)
|
Ubuntu 14.04
下載 Elasticsearch 軟件
解壓
1
|
$ tar xzvf elasticsearch-2.1.0.tar.gz
|
文件目錄結構以下:
1
2
3
4
|
$ pwd
/home/elk/elasticsearch-2.1.0
$ ls
bin config lib LICENSE.txt NOTICE.txt README.textile
|
修改配置文件
1
2
|
$ cd config
$ vi elasticsearch.yml
|
找到 # network.host 一行,修改爲如下:
1
|
network.host: localhost
|
啓動 elasticsearch
1
2
|
$ cd ../bin
$ ./elasticsearch
|
驗證 elasticsearch
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$ 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 安裝徹底一致
Ubuntu 14.04
下載 Kibana 安裝軟件
$ wget
https://download.elastic.co/kibana/kibana/kibana-4.3.0-linux-x64.tar.gz
解壓
1
|
$ tar xzvf kibana-4.3.0-linux-x64.tar.gz
|
文件目錄結構以下:
1
2
3
4
5
|
$ 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
|
修改配置文件
1
2
|
$ cd config
$ vi kibana.yml
|
找到 # server.host,修改爲如下:
1
|
server.host:「localhost」
|
啓動 Kibana
1
2
3
4
5
|
$ cd ../bin
$ ./kibana
[…]
log [07:50:29.926] [info][listening] Server running at http://localhost:5601
[…]
|
驗證 Kibana
因爲咱們是配置在 localhost,因此是沒法直接訪問 Web 頁面的。
可使用 netstat 來檢查缺省端口 5601,或者使用 curl:
1
2
3
4
5
6
7
8
9
10
|
$ 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 安裝徹底一致。
Nginx 提供了反向代理服務,可使外面的請求被髮送到內部的應用上。
Ubuntu 14.04
安裝軟件
1
|
$ sudo apt-get install nginx apache2-utils
|
修改 Nginx 配置文件
1
|
$ sudo vi /etc/nginx/sites-available/default
|
找到 server_name,修改爲正確的值。或者使用 IP,或者使用 FQDN。
而後在加入下面一段內容:
1
2
3
4
5
6
7
8
9
10
11
12
|
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 服務
1
|
$ sudo service nginx restart
|
驗證訪問
http://FQDN 或者 http://IP
CentOS 7.1
配置 Nginx 官方 yum 源
1
2
3
4
5
6
|
$ sudo vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
|
安裝軟件
1
|
$ sudo yum install nginx httpd-tools
|
修改 Nginx 配置文件
1
|
$ sudo vi /etc/nginx/nginx.conf
|
檢查是否 http 塊(http{...})含有下面這一行:
1
|
include /etc/nginx/conf.d/*conf
|
爲 Kibana 建立一個配置文件
1
|
$ sudo vi /etc/nginx/conf.d/kibana.conf
|
加入如下這一段內容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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 服務
1
2
|
$ sudo systemctl enable nginx
$ sudo systemctl start nginx
|
驗證訪問
http://FQDN 或者 http://IP
Ubuntu 14.04
下載 Logstash 安裝軟件
1
|
$ wget https://download.elastic.co/logstash/logstash/logstash-2.1.1.tar.gz
|
解壓
1
|
$ tar xzvf logstash-2.1.1.tar.gz
|
文件目錄結構以下:
1
2
3
4
5
|
$ pwd
/home/elk/logstash-2.1.1
$ ls
bin CHANGELOG.md CONTRIBUTORS Gemfile Gemfile.jruby-1.9.lock lib LICENSE NOTICE.TXT vendor
|
驗證 Logstash
1
2
3
4
|
$ cd bin
$ ./logstash -e 'input { stdin { } } output { stdout {} }'
Settings: Default filter workers: 1
Logstash startup completed
|
顯示以下:
1
2
|
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 安裝徹底一致。
咱們須要配置 Logstash 以指明從哪裏讀取數據,向哪裏輸出數據。這個過程咱們稱之爲定義 Logstash 管道(Logstash Pipeline)。
一般一個管道須要包括必須的輸入(input),輸出(output),和一個可選項目 Filter。見圖 7。
標準的管道配置文件格式以下:
1
2
3
4
5
6
7
8
9
10
|
# 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
1
2
|
$ sudo mkdir -p /etc/pki/tls/certs etc/pki/tls/private
$ sudo vi /etc/ssl/openssl.cnf
|
找到 [v3_ca] 段,添加下面一行,保存退出。
1
|
subjectAltName = IP: logstash_server_ip
|
執行下面命令:
1
2
3
|
$ 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 管道文件
1
2
3
|
$ cd /home/elk/logstash-2.1.1
$ mkdir conf
$ vi simple.conf
|
添加如下內容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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
1
2
|
$ cd /home/elk/logstash-2.1.1/bin
$ ./logstash -f ../conf/simple.conf
|
CentOS 7.1
在 CentOS 7.1 上配置 Logstash,只有一步配置 SSL 是稍微有點不一樣,其餘所有同樣。
1
|
$ sudo vi /etc/pki/tls/openssl.cnf
|
找到 [v3_ca] 段,添加下面一行,保存退出。
1
2
3
4
5
|
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 的時候使用到。
注意:Logstash-forwarder 也是一個開源項目,最先是由 lumberjack 更名而來。在做者寫這篇文章的時候,被吸取合併到了 Elastic.co 公司的另一個產品 Beat 中的 FileBeat。若是是用 FileBeat,配置稍微有些不同,具體須要去參考官網。
Ubuntu14.04
安裝 Logstash-forwarder 軟件
注意:Logstash-forwarder 是安裝在另一臺機器上。用來模擬客戶機傳輸數據到 Logstash 服務器。
配置 Logstash-forwarder 安裝源
執行如下命令:
1
2
|
$ 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 -
安裝軟件包
1
2
|
$ sudo apt-get update
$ sudo apt-get install Logstash-forwarder
|
配置 SSL
1
|
$ sudo mkdir -p /etc/pki/tls/certs
|
把在步驟六中在 Logstash 服務器上產生的 ssl 證書文件拷貝到剛剛建立出來的目錄下:
1
|
$ sudo scp user@logstash_server:/etc/pki/tls/certs/logstash_forwarder.crt /etc/pki/tls/certs/
|
配置 Logstash-forwarder
1
|
$ sudo vi /etc/logstash-forwarder.conf
|
在 network 段("network": {),修改以下:
1
2
3
|
"servers": [ "logstash_server_private_address:5043" ],
"ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt",
"timeout": 15
|
在 files 段("files": [),修改以下:
1
2
3
4
5
6
7
|
{
"paths": [
"/var/log/syslog",
"/var/log/auth.log"
],
"fields": { "type": "syslog" }
}
|
啓動 Logstash-forwarder
1
|
$ sudo service logstash-forwarder start
|
驗證 Logstash-forwarder
1
2
|
$ sudo service logstash-forwarder status
logstash-forwarder is running
|
若是有錯誤,則須要去/var/log/logstash-forwarder 目錄下面檢查。
CentOS 7.1
配置 Logstash-forwarder 安裝源
執行如下命令:
1
2
3
|
$ sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch
$ sudo vi /etc/yum.repos.d/logstash-forwarder.repo
|
加入如下內容:
1
2
3
4
5
6
|
[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
|
存盤退出。
安裝軟件包
1
|
$ sudo yum -y install logstash-forwarder
|
剩餘步驟和上述在 Ubuntu 14.04 上面的作法徹底同樣。
在前面安裝 Kibana 的時候,曾經有過驗證。不過,當時沒有數據,打開 Web 頁面的時候,將以下所示:
如今,因爲 logstash-forwarder 已經開始傳輸數據了,再次打開 Web 頁面,將以下所示:
點擊建立按鈕(Create),在選擇 Discover,能夠看到以下畫面:
至此,全部部件的工做均可以正常使用了。關於如何具體使用 Kibana 就不在本文中加以描述了,有興趣的同窗能夠參考官網。
限於篇幅,本文只是用一個相對簡單的例子來闡述 ELK 協議棧在集中式日誌的做用。在實際的工做中,其實他們都是能夠相對自由組合,這些就不在本文介紹了。
另外,ELK 協議棧能夠很方便的在大型生產系統中擴充集羣以提升性能,好比,使用多個實例來增長 Logstash 的寫入能力;若是單個節點的 Elasticsearch 知足不了讀取,還能夠採用 AMQP 技術來緩衝,等等。諸如此類的話題,但願有機會在之後的文章中討論。
ELK 是一個不停發展的產品,但願可以經過本文幫助你們瞭解它們,並在從此的工做中深刻理解。謝謝