在咱们平常生活中,咱们常常须要回顾之前发生的一些事情;或者,当出现了一些问题的时候,能够从某些地方去查找缘由,寻找发生问题的痕迹。无可避免须要用到文字的、图像的等等不一样形式的记录。用计算机的术语表达,就是 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 是一个不停发展的产品,但愿可以经过本文帮助你们了解它们,并在从此的工做中深刻理解。谢谢