ELKR分布式搭建nginx日志分析系统
一.名词介绍
1、什么是elk
ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写,Elasticsearch,Logstash 和 Kibana。这三款软件都是开源软件,通常是配合使用。
2、Elasticsearch
2.1.Elasticsearch介绍
Elasticsearch 是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,使用 Java 语言编写。
2.2Elasticsearch特点
(1)实时分析
(2)分布式实时文件存储,并将每一个字段都编入索引
(3)文档导向,所有的对象全部是文档
(4)高可用性,易扩展,支持集群(Cluster)、分片和复制(Shards和 Replicas)
(5)接口友好,支持 JSON
3、Logstash
3.1Logstash介绍
Logstash 是一个具有实时渠道能力的数据收集引擎。
3.2Logstash特点
(1)几乎可以访问任何数据
(2)可以和多种外部应用结合
(3)支持弹性扩展
3.3Logstash它组件
(1)Shipper-发送日志数据
(2)Broker-收集数据,缺省内置 Redis
(3)Indexer-数据写入
4、Kibana
4.1Kibana介绍
Kibana 是一款基于 Apache 开源协议,使用JavaScript 语言编写,为 Elasticsearch 提供分析和可视化的 Web 平台。它可以在 Elasticsearch 的索引中查找,交互数据,并生成各种维度的表图。
二.环境介绍
环境介绍:Ubuntu 14.04
elasticsearch-5.2.2.deb kibana-5.2.2-amd64.deb logstash_2.1.3-1_all.deb java1.8 redis2.8.4
2.1ELK 组件的作用
Elasticsearch 抓取日志分析
Logstash 日志格式处理
Kibana 前端数据可视化展示
2.2 ELK
ELK(R) = Elasticsearch + Logstash + Kibana (+ Redis) 是一套完整的工业级日志分析工具。
拓扑图:
三.ELK安装
3.1 安装
3.1.1 系统环境检查
要安装 ELK(R),首先需要检查自身系统环境:
检查当前系统的版本。
[email protected]:/home/hao# cat /etc/issue
Ubuntu 14.04.5 LTS \n \l
其次,Elasticsearch 还依赖 Java 的环境,因此还需要确保 Java 环境:
[email protected]:/home/hao# java -version java version "1.8.0_101" Java(TM) SE Runtime Environment (build 1.8.0_101-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
此外,正如前面所说,Redis 自身并不属于 ELK 技术栈,而是 Logstash 具备的一个插件,属于 Logstash 的依赖。所以我们还要检查 Redis 环境。
[email protected]:/home/hao# redis-server -v Redis server v=2.8.4 sha=00000000:0 malloc=jemalloc-3.4.1 bits=64 build=a44a05d76f06a5d9 如果没有启动,则可以 [email protected]:/home/hao# netstat -antulp | grep 6379 [email protected]:/home/hao# service redis-server start Starting redis-server: redis-server.
关闭 redis,最好的办法就是直接杀掉 redis 的所在进程:
[email protected]:/home/hao# ps -u root -o pid,rss,command | grep redis 363 648 grep --color=auto redisThen kill -9 the_pid
3.1.2用deb包的方式下载和安装
可以使用wget命令下载,这些包可以官网去下载,但是非常的慢,dpkg -i安装,就可以不用管下面的安装方法了
#下载 wget http://labfile.oss.aliyuncs.com/courses/562/elasticsearch-5.2.2.deb wget http://labfile.oss.aliyuncs.com/courses/562/kibana-5.2.2-amd64.deb wget http://labfile.oss.aliyuncs.com/courses/562/logstash_2.1.3-1_all.deb #安装 dpkg -i elasticsearch-5.2.2.deb dpkg -i kibana-5.2.2-amd64.deb dpkg -i logstash_2.1.3-1_all.deb
3.1.3用apt-get的方式下载安装
1.安装 Elasticsearch
无论是 ELK 中的哪个部分,他们都还在快速迭代当中,所以我们要竟可能的选择最新的版本。
安装有很多方式让我们选择,比如自行下载源码安装,比如向软件包源中添加软件源使用 apt-get 来安装。
无论如何,我们都推荐使用 apt-get 进行安装,因为这种方式的安装便于管理和维护。
首先我们需要添加 Key:
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
然后添加官方的安装源:
echo "deb https://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
[email protected]:/home/hao# sudo apt-get update Ign http://mirrors.aliyuncs.com trusty InRelease Get:1 http://mirrors.aliyuncs.com trusty-updates InRelease [65.9 kB] Get:2 http://mirrors.aliyuncs.com trusty-security InRelease [65.9 kB] Hit http://mirrors.aliyuncs.com trusty Release.gpg Hit http://mirrors.aliyuncs.com trusty Release Get:3 http://mirrors.aliyuncs.com trusty-updates/main Sources [496 kB] Get:4 http://mirrors.aliyuncs.com trusty-updates/restricted Sources [6470 B] Get:5 http://mirrors.aliyuncs.com trusty-updates/universe Sources [235 kB] Get:6 http://mirrors.aliyuncs.com trusty-updates/main amd64 Packages [1249 kB] Get:7 https://packages.elastic.co stable InRelease Ign https://packages.elastic.co stable InRelease Get:8 http://mirrors.aliyuncs.com trusty-updates/restricted amd64 Packages [21.2 kB] Get:9 http://mirrors.aliyuncs.com trusty-updates/universe amd64 Packages [541 kB] Get:10 https://packages.elastic.co stable Release Get:11 http://mirrors.aliyuncs.com trusty-security/main Sources [176 kB] Get:12 http://mirrors.aliyuncs.com trusty-security/restricted Sources [5068 B] Get:13 http://mirrors.aliyuncs.com trusty-security/universe Sources [72.1 kB] Get:14 https://packages.elastic.co stable/main amd64 Packages Get:15 http://mirrors.aliyuncs.com trusty-security/main amd64 Packages [799 kB] Get:16 http://mirrors.aliyuncs.com trusty-security/restricted amd64 Packages [17.9 kB] Get:17 http://mirrors.aliyuncs.com trusty-security/universe amd64 Packages [228 kB] Hit http://mirrors.aliyuncs.com trusty/main Sources Hit http://mirrors.aliyuncs.com trusty/restricted Sources Hit http://mirrors.aliyuncs.com trusty/universe Sources Hit http://mirrors.aliyuncs.com trusty/multiverse Sources Hit http://mirrors.aliyuncs.com trusty/main amd64 Packages Hit http://mirrors.aliyuncs.com trusty/restricted amd64 Packages Hit http://mirrors.aliyuncs.com trusty/universe amd64 Packages Hit http://mirrors.aliyuncs.com trusty/multiverse amd64 Packages Fetched 3985 kB in 15s (265 kB/s) Reading package lists... Done W: Size of file /var/lib/apt/lists/mirrors.aliyuncs.com_ubuntu_dists_trusty-updates_restricted_binary-amd64_Packages.gz is not what the server reported 21216 23469 W: Size of file /var/lib/apt/lists/mirrors.aliyuncs.com_ubuntu_dists_trusty-security_restricted_binary-amd64_Packages.gz is not what the server reported 17859 20228
接下来就可以开始安装了:
sudo apt-get install elasticsearch
安装完成后,我们就可以运行 Elasticsearch 服务了:
sudo service elasticsearch start
2.安装 logstash
echo "deb https://packages.elastic.co/logstash/2.3/debian stable main" | sudo tee -a /etc/apt/sources.list
同样的方法:
sudo apt-get update
安装:
sudo apt-get install logstash
运行服务:
sudo service logstash start
3.安装 Kibana
同理,在 /etc/apt/sources.list 中添加 Kibana 的安装源:
echo "deb http://packages.elastic.co/kibana/4.5/debian stable main" | sudo tee -a /etc/apt/sources.list
更新:
sudo apt-get update
安装:
sud apt-get install kibana
运行服务:
sudo service kibana start
报错:
[email protected]:/home/hao# sudo service kibana start
kibana started
[email protected]:/home/hao# sudo service logstash start
/etc/init.d/logstash: 68: ulimit: error setting limit (Operation not permitted)
logstash started.
[email protected]:/home/hao# sudo service elasticsearch start
* Starting Elasticsearch Server /etc/init.d/elasticsearch: line 139: ulimit: open files: cannot modify limit: Operation not permitted
sysctl: setting key "vm.max_map_count": Read-only file system
在启动Logstash 和 Elasticsearch 的时候,有这样几个警告:
Elasticsearch,『ulimit和只读文件系统错误』
Logstash,『ulimit 错误』
第一步:解决 Elasticsearch:
sudo vim /etc/init.d/elasticsearch
在 vim 中使用 :set nu 来开启行号,注释掉 138行至 148行:
其实只需要注释掉报错的部分就好了,可能版本有些不同,所以行号不一定一样,主要看注释掉的内容
重启服务:
sudo service elasticsearch stop
sudo service elasticsearch start
第二步:解决 Logstash:
同理,注释掉 /etc/init.d/logstash 中 68 行 和 69 行的内容:
并重启服务:
sudo service logstash stop
sudo service logstash start
这时候访问 localhost:5601 就能够看到 Kibana 已经在运行,但现在还不能正式使用:
四.部署日志
既然我们要构建日志分析系统,日志是必不可少的,我们所熟知的提供 Web 服务的工具,有 apache 和 nginx。我们这里以 nginx 为例来部署产生日志的环境。
首先我们需要安装 nginx 环境,同样只需要使用 apt-get 即可。
sudo service nginx start
我们需要配置 nginx 来获得用户访问的日志:
而nginx 的配置文件位于:
vi /etc/nginx/sites-available/default
下面修改将nginx 的配置添加:
access_log /home/hao/Code/elk/access.log;
注意, 如果这个路径不存在,Nginx 服务会启动失败,这是权限原因造成的,最好的解决方法就是:[email protected]:/etc/nginx/sites-available# mkdir -p /home/hao/Code/elk/
[email protected]:/etc/nginx/sites-available# touch /home/hao/Code/elk/access.log
这时候重启 nginx 服务:
sudo service nginx stop
sudo service nginx start
然后在浏览器中访问:
http://localhost/
这时候我们可以看到刚才配置的 nginx 日志有新纪录了。每次访问这里就会多一条记录出来
# 检查服务状态
sudo service redis-server status sudo service elasticsearch status sudo service logstash status sudo service kibana status
五.logstash和elasticsearch配置
Logstash 配置基础
要确保每个服务都开启状态
Logstash 是打通日志文件和 Elasticsearch 之间的一个枢纽。和各种服务一样,Logstash 也有着自己的一套配置规则。
Logstash 的配置主要分为三大部分:input, filter, output。
Logstash 的主要命令都安装在了 /opt/logstash/bin 目录下,在这个目录下中,我们先执行:
sudo ./logstash -e ‘input{stdin{}}output{stdout{codec=>rubydebug}}‘
Logstash 的 -e 参数为立即执行的意思
这时,终端会等待输入,我们可以简单的输入 Hello Logstash! 这时会看到有如下输出:
这说明 Logstash 已经顺利工作了。
这里可能等待的比较久,希望大家能够耐心一点,使用 ctrl+c 关闭当前 Logstash 执行的配置。
配置语法
我们先来观察刚才命令中的字符串:
‘input{stdin{}}output{stdout{codec=>rubydebug}}‘
将其格式化后:
input {
stdin {}
}
output {
stdout {
codec => rubydebug
}
}
stdin {} 就是从标准输入
stdout {} 就是从标准输出
在这个字符串中,其实定义了 Logstash 的两个行为input和output。
在 input 中,我们定义了一个标准输入,由于什么都没有,所以 Logstash 会从终端的标准输入中读取字符串,这也是为什么刚才在输入完命令后会出现等待输入的情况。
在 output 中,我们定义了一个标准输出,也就是说 Logstash 在处理完后会将结果从标准输出(终端)中输出,而 codec 字段,则说明了输出会遵循什么样的格式,这里定义的 codec 为 rubydebug,所以我们刚才看到了一套标准的输出格式。
有了对 Logstash 配置语法的基本认识,我们可以开始配置 从 Log 到 Logstash 到 Elasticsearch 的配置文件了。
配置 Log->Logstash->Elasticsearch
由于 Logstash 的配置很长,所以我们不太可能在一行命令中吧整个配置写好,所以我们先在 /etc/logstash/conf.d/logstash-shipper.conf 创建 Logstash 的配置文件:
我们现在要将日志文件作为输入,将日志分析系统elasticsearch作为输出
input { stdin {} file { path => "/home/hao/Code/elk/access.log" start_position => beginning codec => multiline { ‘negate‘ => true ‘pattern‘ => ‘^\d‘ ‘what‘ => ‘previous‘ } } } output { stdout { codec => rubydebug } elasticsearch { hosts=>["localhost:9200"] index=>"logstash-%{+YYYY.MM.dd}" } }
在这份配置中,我们加入了文件输入的配置,加入了elaticsearch分析系统的输入。
我们将 input 定义加入 file (文件)输入,并设置 start_position 从第一行开始,保证能够导入旧数据。
输出,此种举动一方面可以方便我们日后进行调试,另一方面可以将其作为 Logstash 的日志进行输出。
而 elasticsearch 则给出了向 elasticsearch 输入数据的申明。
配置完成后,我们可以使用 -t 参数来测试配置脚本是否配置正确:
/opt/logstash/bin/logstash -t -f /etc/logstash/conf.d/logstash-shipper.conf
但是一旦我们 ctrl+c 便会停止执行,Logstash 不会再向 elasticsearch 传送数据。
这时,我们需要将其挂在后台执行:
nohup /opt/logstash/bin/logstash -t -f /etc/logstash/conf.d/logstash-shipper.conf &
六.Kibana 可视化工具
我们成功的将日志数据写入了 Elasticsearch,配置Kibana 使得我们能够在前端页面上查看并分析这些数据。
创建 Kibana 索引模式
我们已经将 Logstash 进程跑在了后台,现在我们打开浏览器,访问 localhost:5601 便能看到 Kibana 的界面和以往有所不同,Kibana 提示我们可以创建索引模式,这里我们不做过多干涉,直接以时间戳创建索引模式:
看到 Kibana 为我们创建了 18 个字段(Fields)
我们点击顶部的 Discover ,便能来到 Kibana 的全局搜索界面,并能够看到在选定的时段内有多少记录被写入 Elasticsearch:
高级查询
在Kibana 中如果要进行更加精确的查询,则需要使用 Lucene。
例如,我们要在某个字段中搜索某个字符串是否存在。首先我们在终端中构造数据,在 一个 sudo /opt/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-shipper.conf 进程下,依次输入 hello world、how do you do、what‘s wrong with you,chenhao。
这时候 Logstash 会输出四条记录:
下面我们准备搜索在所有的记录中,出现单词 you 的记录。
这时我们可以输入:message: *you*。这里的 message:是指明要搜索的字段,you是要搜索的字符,* 是通配符。
这时我们可以看到,刚才插入的 what‘s worng with you 和 how do you do 这两个满足条件的结果均已被高亮在了下方:
我们搞定了 Kibana 的可视化部分。
将启用 Redis 作为缓存,搭建的分布式 ELK+Redis 日志环境
七.用redis部署分布式ELK
署环境简化为了 nginx Log->Logstash->Elasticsearch->Kibana
5.1 Logstash Redis 插件及其配置
Redis 本身并不属于 ELK 技术栈里的一份子,而是作为一个插件存在于 ELK 技术栈中。Redis 提供了一个很好的缓冲区,它能够很好的帮助我们在主节点上屏蔽掉多个从节点之间不同日志文件的差异,负责管理日志端(从节点)的人可以专注于向 Redis 里生产数据,而负责数据分析聚合端的人则可以专注于从 Redis 内消费数据,达到分层目的。
幸运的是 Redis 插件在最新版的 Logstash 中已经被集成,我们只需要简单的配置 Logstash 的相关文件即可。
首先我们要配置具备日志节点的 Logstash Shipper 的配置文件:
input { stdin { } file { path => "/home/hao/Code/elk/access.log" start_position => beginning codec => multiline { ‘negate‘ => true ‘pattern‘ => ‘^\d‘ ‘what‘ => ‘previous‘ } } } output { stdout { codec => rubydebug } redis { host => "localhost" data_type => "list" key => "logstash" } }
这里配置了 output 的相关逻辑,将 output 指定到 redis 中,输出的数据类型为 list, redis 数据库中的 key 为 logstash。
3.2 配置Logstash Indexer
新建一个配置文件,它的输入是redis数据库,输出是elasticsearch分析系统
然后我们再配置 Logstash Indexer:
input { redis { host => "localhost" type => "redis" data_type => "list" key => "logstash" } } output { stdout { codec => rubydebug } elasticsearch { hosts=>["localhost:9200"] index=>"logstash-%{+YYYY.MM.dd}" } }
当 Shipper 产生新的数据时候(输入hello chenhao),可以看到 Indexer 也会产生新的数据:
sudo /opt/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-shipper.conf
sudo /opt/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-indexer.conf
当这两个配置文件运行在不同服务器上时,便能做到真正的分布式了,唯一需要修改的地方就是 redis 的 host 字段值,其中 Logstash Shipper 中的地址应该填写 Logstash Indexer 所在地址,而 Logstash Indexer 中的 redis host 字段不需要修改,因为 redis 和 Loststash Indexer 运行在同一台机器上。
八.总结
收集nginx日志,集中展示。
不少人对 ELK 的第一印象,容易觉得它这个工具组合似乎挺难上手的,错!只需动手试试就知道啦!
目标分解:
1)熟悉 logstash 的安装和基本操作
2)熟悉 elasticsearch 的安装和基本操作,然后结合 logstash 使用
3)熟悉 kibana 的安装和基本操作,然后结合 elasticsearch 使用
Elasticsearch 是整个日志分析系统的核心,它负责对日志数据进行分析、索引等重要工作;Logstash 则主要用于对日志数据进行初步的过滤和筛选,例如,Logstash 可以将拥有日志数据的从节点(Slave Node)服务器内的日志数据发送到 Elasticsearch 的主服务器。
Kibana 则是为了让 Elasticsearch 更好的与用户进行交互而设计的一个 Web 前端工具,具备强大的数据可视化功能。Redis 本身并不属于 ELK 技术栈里的一份子,而是作为一个插件存在于 ELK 技术栈中。
Redis 提供了一个很好的缓冲区,它能够很好的帮助我们在主节点上屏蔽掉多个从节点之间不同日志文件的差异,负责管理日志端(从节点)的人可以专注于向 Redis 里生产数据,而负责数据分析聚合端的人则可以专注于从 Redis 内消费数据,达到分层目的。
九.报错解析
1.Kibana Unable to connect to Elasticsearch
若是此处显示的是警告没有看到上图所示的画面的话,注意看下方警告中访问的 elasticsearch 的地址与端口是否正确,因为 elasticsearch 默认是绑定在本地 localhost 端口上,所以地址应该是 localhost:9200 或者是 127.0.0.1。若不是可以修改一下 /etc/kibana/kibana.yml 中 elasticsearch 对应的地址与端口,然后重启试试。
2.max virtual memory areas vm.max_map_count[65530]is too low
vi /etc/security/limits.conf
添加如下内容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
vi /etc/sysctl.conf #添加一条
vm.max_map_count=655360
sysctl -p #执行
3. logstash Configuration Contains a Syntax Error
logstash 语法错误,这个问题一般各种各样的。主要是logstash配置文件不对导致的。
解决方法:
在启动logstash前,先检查下logstash配置文件是否有问题,可通过下面命令检测:
/opt/logstash/bin/logstash --configtest -f /etc/logstash/conf.d/
后面指定你自己的配置文件。
十.参考文档
Logstash Redis 配置参考
https://www.elastic.co/guide/en/logstash/current/plugins-inputs-redis.html
Kibana 用户指南
https://www.elastic.co/guide/en/kibana/current/index.html
配置 Logstash
https://www.elastic.co/guide/en/logstash/current/configuration.html