一、什么是ELK
ELK是Elasticsearch + Logstash + Kibana 这种架构的简写。这是一种日志分平台析的架构。从前我们用shell三剑客(grep, sed, awk)来分析日志, 虽然也能对付大多数场景,但当日志量大,分析频繁,并且使用者可能不会shell三剑客的情况下, 配置方便,使用简单,并且分析结果更加直观的工具(平台)就诞生了,它就是ELK。 ELK是开源的,并且社区活跃,用户众多。当然国内也有一些收费的,比较好用的日志分析平台,比如日志易(日志易的同事赶紧给我打钱,毕竟这广告打的好)。
二、ELK常见的几种架构
1 Elasticsearch + Logstash + Kibana
这是一种最简单的架构。这种架构,通过logstash收集日志,Elasticsearch分析日志,然后在Kibana(web界面)中展示。这种架构虽然是官网介绍里的方式,但是往往在生产中很少使用。
2 Elasticsearch + Logstash + filebeat + Kibana
与上一种架构相比,这种架构增加了一个filebeat模块。filebeat是一个轻量的日志收集代理,用来部署在客户端,优势是消耗非常少的资源(较logstash), 所以生产中,往往会采取这种架构方式,但是这种架构有一个缺点,当logstash出现故障, 会造成日志的丢失。
3 Elasticsearch + Logstash + filebeat + redis(也可以是其他中间件,比如kafka) + Kibana
这种架构是上面那个架构的完善版,通过增加中间件,来避免数据的丢失。当Logstash出现故障,日志还是存在中间件中,当Logstash再次启动,则会读取中间件中积压的日志。目前我司使用的就是这种架构,我个人也比较推荐这种方式。
架构图:
ELK架构图说明: logstash节点和elasticsearch节点可以根据日志量伸缩数量, filebeat部署在每台需要收集日志的服务器上。
三、安装部署
1. redis安装部署
这个不做介绍,但是因为redis在这里充当中间件,所以最好先安装redis,并且启动
2. filebeat安装部署
filebeat是一款轻量级的数据采集器,需要部署在每台需要收集日志的机器上。安装和配置过程很方便,如果机器很多,可以配合使用批量部署工具进行安装。
1) 安装
linux 平台使用 rpm安装
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.2.2-x86_64.rpmsudo rpm -vi filebeat-5.2.2-x86_64.rpm
上面安装的是5.2.2版本。这个版本要和后面的其他组件版本保持一致,否则可能会出现兼容性问题。其他平台的安装方法,可以在官方文档中找到 filebeat安装
2) 配置
配置文件是yml格式的,对格式有严格的要求,因为简书排版的问题,我就直接贴图片了。
典型filebeat.yml配置1) 日志输入:
filebeat.prospectors模块用来指定日志文件的来源。在这个配置文件中, 总共接收三个日志文件,分别是
/data/logs/php/errors.log /data/logs/nginx/www_error.log /data/logs/php/www.slow.log
input_type 指定日志类型,在这里是log, 应该也可以是json。
paths指定日志文件路径。
document_type:这个字段是用来给日志打标记的。
fields: 也是打标记,主要为了后面日志分析查找的方便,存储的时候也会根据fields分类存储,相同fields的数据存在同一个redis key中
fields_under_root: 如果该选项设置为true, 则该fields会存储在top-level中。
tail_files: 这个选项如果设置为true,则读取日志文件的新内容,而忽略原有的内容,一般要设置为true
2)日志输出
output.redis:指定输出到redis
hosts:指定redis主机,可以指定多台。
password:redis密码,redis默认没有密码,在这里设为空就行
fields_under_root: 和前面对应,top-level的存储key
tail_files: 和前面对应
keys:指定存入redis中的key, 在这个配置文件中,不同的日志文件被存到不同的key。
db: 指定存在redis中的db编号(redis默认安装有16个databases,0~15, 默认是存储在db0中的)
3) 启动
配置完成后,就可以启动filebeat了,但是如果日志量很大的话,千万要注意redis可能会被撑爆,因为现在还未配置Logstash,即现在只有filebeat往redis中写数据,有生产者,没有消费者,就会造成数据积压。所以如果日志量很大,先不要启动。
我们生产环境是用supervisor管理fielbeat的,配置好supervisisor之后,执行
supervisorctl start filebeat
启动filebeat 。如果你对supervisor不熟,又想用它的话,可以去了解下,这是一个不错的任务管理工具。supervisor的配置
[program:filebeat]
command=/data/app/filebeat/filebeat -e -c filebeat.yml
directory=/data/app/filebeat
logfile=/data/app/filebeat/run.log
autorestart=true
3 logstash 安装配置
1) 环境准备
安装logstash需要依赖于java环境,具体需要安装哪个版本的jdk,请参考官方文档。 我这边logstash版本是5.2. 查看官方文档,需要的是jdk1.8.0
jdk环境如何安装jdk,不在这里介绍,网上一大堆教程。
2) 安装
先下载指定版本
wget https://artifacts.elastic.co/downloads/logstash/logstash-5.2.2.tar.gz
解压到指定目录
tar xf logstash-5.2.0.tar.gz -C /data/app/
值得一提的是,这种安装方式无需编译,解压后就可以使用。你也可以使用yum安装。
解压后查看一下目录结构
logstash目录结构其中config一般用来存放日志文件, bin用来存放logstash启动文件或者二进制文件。
logstash启动方式
bin/log -f config/你的配置文件
-f用来指定配置文件。ok, 那接下来我们来写一个配置文件。
logstash典型配置logstash配置文件最基本的需要指定日志的输入和日志的输出。可以把logstash理解成一个处理日志的中间件,所以需要input和output
在这个配置文件里:
input是redis, 需要指定redis的host 和port以及db,还要指明数据的类型,list表示这是一个redis的list对象。key指明redis中的key名称。
output 是elasticsearch, hosts指明elasticsearch的ip和端口,index指明这个日志存在elasticsearch中的索引名称。
这是最简单的配置,这样配置即可启动logstash,但如果你想针对日志做一些预处理,或者一些信息的过滤,可以使用logstash提供的模块,具体参见官方文档。
这里介绍下filter模块
带filter的logstash配置文件input和output和上面一样,不做介绍。 filter模块中有个grok,可以用来匹配日志。根据你日志的格式来编写match规则。怎么书写规则,可以参考官方文档,这里大概讲下。 使用%{} 这种形式匹配一个变量,DATA匹配任何字符, 比如上面的 %{DATA:timestamp} 表示这个日志第一域是时间, 大括号后面有个空格,空格前面表示第一域) 将时间赋值给timestamp变量(名称可以自定义), 后面同理, 第二域是代表告警级别(赋值给level), 第三域是告警信息(赋值给msg), 第四域是客户ip地址(赋值给client_ip)...
这个匹配规则刚开始写起来可能有些费劲,需要调试。我当时调试也花了不少时间。
ok,现在我们有了配置文件,即可启动logstash。
./bin/logstash -f ./config/conf.d/error.log.nginx
建议使用supervisor管理进程。
supervisor中的logstash配置如果启动有报错,根据报错一步步解决问题。
4 elasticsearch安装
1)依赖
和logstash一样,elasticsearch 同样需要依赖jdk,因为前面已经安装jdk环境,所以这一步可以跳过。
2)下载安装包并解压
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.2.tar.gz
tar -xvf elasticsearch-5.2.2.tar.gz -C /data/app/
和logstash一样,不需要编译,解压后既可以使用。但需要配置文件
3)配置
elasticsearch典型配置文件配置文件说明:
cluster.name: 指定elasticsearch 集群的名称,集群内的所有elasticsearch需要配置相同的cluster.name
node.name: 当前节点名称,需要集群内唯一。
path.data: 数据存放位置
path.logs: elasticsearch的日志存放位置
http.port: 端口
discovery.zen.ping.unicast.hosts: elasticsearch节点。
下面两个应该是elasticsearch处理相关的配置,可以参考官方文档。
关于elasticsearch节点,这里说明下,最好配置成单数,且数量要大于等于3. 因为集群需要选举主从。
4)启动
配置完之后,启动elasticsearch。 注意,如果你使用root用户启动elasticsearch,就会报错,启动失败,这是因为elasticsearch不允许用root用户启动。可以创建一个用户,用来启动elasticsearch
groupadd elasticsearch
useradd -g elasticsearch elasticsearch
上面命令用来创建elasticsearch组和用户。创建完之后,因为默认对刚才的elasticsearch安装目录没有相关权限,还需要权限赋值(更改目录所属组和用户)。
chown -R elasticsearch:elasticsearch /data/app/elasticsearch/
ok,现在可以启动了。
/data/app/elasticsearch/bin/elasticsearch -d
-d 表示后台运行。
还是一样,如果有报错,就解决报错。
5 kibana安装配置
1) 下载安装包并解压
和上面的logstash以及elasticsearch一样,无需编译,下载并解压即可使用。
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.2.2-linux-x86_64.tar.gz
tar -xzf kibana-5.2.2-linux-x86_64.tar.gz -C /data/app/
2) 配置
解压后,进入到kibana目录,修改配置文件
kibana典型配置server.host:指明服务运行的地址
elasticsearch.uri: 指明elasticsearch运行的地址和端口
kibana.index: 指明kibana使用的索引,这个是自定义的。
tilemap.uri:指明了使用地图api, 在这里使用了高德地图的api
配置完成。
3) 启动
/data/app/kibana/bin/kibana
如果正常启动,则可以通过默认的5601端口访问kibana 的web界面。
6 nginx
上一步,当kibana安装启动之后,并且可以正常访问,ELK的架构算是完成了。但是,如果是生产环境,我的建议是用nginx代理kibana web。 nginx安装配置很简单,网上一大堆,请自行安装配置。
至此,我们完成了filebeat + redis + logstash + elasticsearch + kibana + nginx 的这种架构。通过访问网页, 即可查询相关日志。
至于kibana怎么使用,如何创建索引,这个该教程就不作介绍了,可以参考网上的一些资料,或者如果你英文水平过关,直接看官方文档吧。
kibana截图
网友评论