摘要
通过日志分析解决系统故障,是发现问题的主要手段。日志包含多种类型,包括程序日志,系统日志以及安全日志等等。通过对日志进行分析,可以预防故障的发生,又可以在故障发生时,寻找到蛛丝马迹,快速定位故障点,及时解决问题。
在分布式系统下,假如一个后端服务部署了几十个节点,这时候你想要查看日志、分析日志就会异常麻烦,所以非常需要这样一个专门收集各个系统日志的平台,对于这个场景,业界最受欢迎的应该就是这个elk的解决方案了。
组件介绍
Filebeat
隶属于Beats,轻量级数据收集引擎。基于原先Logstash-forwarder的源码改造出来。换句话说:Filebeat就是新版的Logstash-forwarder,也会是ELK Stack在Agent的第一选择
KafKa
数据缓冲队列。作为消息队列解耦了处理过程,同时提高了可扩展性。具有峰值处理能力,使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃.(因为日志量非常庞大,所以采用kafka异步收集日志)
Zookeeper
ZooKeeper是一个分布式协调服务,它的主要作用是为分布式系统提供一致性服务,提供的功(Kafka的运行依赖它)
logstash
主要是用来日志的搜索、分析、过滤日志的工具。用于管理日志和事件的工具,你可以用它去收集日志、转换日志、解析日志并将他们作为数据提供给其它模块调用,例如搜索、存储等
Elasticsearch
是一个基于Lucene的搜索服务器。提供搜集、分析、存储数据三大功能。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便
Kibana
是一个优秀的前端日志展示框架,它可以非常详细的将日志转化为各种图标,为用户提供强大的数据可视化支持,它能够搜索、展示存储在Elasticsearch中索引数据。使用它可以很方便的使用图表、表格、地图展示和分析数据
环境搭建
Filebeat安装
- 将filebeat-6.6.0-linux-x86_64.tar.gz传到应用服务器上(每个应用服务器都需要配一个fileBeat)
- 解压filebeat-6.6.0-linux-x86_64.tar.gz到指定文件
tar -zxvf filebeat-6.6.0-linux-x86_64.tar.gz -C /home/app
- 去除filebeat.yml的分组权限
chmod go-w /home/app/filebeat-6.6.0-linux-x86_64/filebeat.yml
- 进入filebeat-6.6.0-linux-x86_64文件夹修改fileBeat.yml配置文件
vim /home/app/filebeat-6.6.0-linux-x86_64/filebeat.yml
打开按照如下编辑(注意冒号后面要有空格,不然会报错)
filebeat.inputs:
-type: log
enabled: true
paths:
- /home/application/gateway.log #应用的日志路径
fields:
type: gateway #区分不同应用的日志一般按应用名称来取
fields_under_root: true
multiline.pattern: '^[0-9]{4}[0-9]{2}[0-9]{2}' #错日日志合并为一行,表达式兼容正则,根据正常日志的前缀来配置
multiline.negate: true
multiline. after
-type: log
enabled: true
paths:
- /home/application/sso.log #应用的日志路径
fields:
type: sso #区分不同应用的日志一般按应用名称来取
fields_under_root: true
multiline.pattern: '^[0-9]{4}[0-9]{2}[0-9]{2}' #错日日志合并为一行,表达式兼容正则,根据正常日志的前缀来配置
multiline.negate: true
multiline. after
- 启动脚本
nohup /home/app/filebeat-6.6.0-linux-x86_64/filebeat -e -c /home/app/filebeat-6.6.0-linux-x86_64/filebeat.log 2>&1 &
- 出现关闭命令界面程序就停止时,需要用命令 exit来退出
KafKa安装
- 将kafka_2.12-2.1.1.tgz传到目标服务器上
- 解压kafka_2.12-2.1.1.tgz到指定文件
tar -zxvf kafka_2.12-2.1.1.tgz -C /home/app
- 进入kafka_2.12-2.1.1/config/修改sever.properties配置文件
vim /home/app/kafka_2.12-2.1.1/sever.properties
修改如下配置
brocker.id=1
advertised.listeners=PLAINTEXT://128.33.18.12:9092 #改为本机的IP端口号用默认的9092
log.dirs=/data/kafka-logs #设置日志输出目录
- 启动脚本
nohup /home/app/kafka_2.12-2.1.1/bin/kafka-sever-start.sh /home/app/kafka_2.12-2.1.1/kafka.log 2>&1 &
Zookeeper安装
- 将zookeeper.3.14.13.tar.gz传到目标服务器上
- 解压zookeeper.3.14.13.tar.gz到指定文件
tar zookeeper.3.14.13.tar.gz -C /home/app
- 创建配置文件
cp zoo_sample.cfg zoo.cfg
- 编辑配置文件
dataDir=/usr/local/zookeeper/data #配置ZK的数据目录
clientPort=2181 #用于接收客户端请求的端口号
dataLogDir=/usr/local/zookeeper/logs #配置ZK的日志目录
- 启动脚本
./zkSever.sh start
logstash安装
- 将logstash-6.6.0.tar.gz传到目标服务器上
- 解压logstash-6.6.0.tar.gz到指定文件
tar logstash-6.6.0.tar.gz -C /home/app
- 配置文件jvm.options文件
vim /home/app/logstash-6.6.0/config/jvm.options
配置如下属性
-Xms:256
-Xmx:256
- 修改主配置文件
vim /home/app/logstash-6.6.0/config/logstash.conf
数据源配置
input {
kafka{
boostrap_severs => "128.33.18.12:9092"
topics => ["test"] #消息主题配置
group_id => "logstash"
codec => "json"
}
}
过滤器配置
filter {
if[type] == "sso" { #对应filebeat设置的type
grok{ #由于存入es中的@timestamp的时间是logstash的消费时间,这里设置过滤,把它改成日志里日志产生的时间
match => {"message" => "(?<datetime>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})"}
}
date{
match => ["datetime","yyyy-MM-dd HH:mm:ss"]
target => "的@timestamp"
}
mutate{ #过滤存入es中的字段
remove_field => ["beat","beat","offset","source","input","log","prospector","@version","ecs","agent","datetime"]
}
}
}
输出配置
output{
if[type] == "sso" {
elasticsearch{
hosts => ["128.33.18.12:9200"]
index => "%{YYYY-MM-dd}" #这里按日期索引
}
}
}
- 启动脚本
nohup /home/app/logstash-6.6.0/bin/logstash -f /home/app/logstash-6.6.0/logstash.log 2>&1 &
Elasticsearch安装
- 将elasticsearch-6.6.0.tar.gz传到目标服务器上
- 将elasticsearch-6.6.0.tar.gz到指定文件
tar 将elasticsearch-6.6.0.tar.gz -C /home/app
- 修改系统配置参数(需要root用户)
vim /etc/security/limits.conf
修改如下配置
* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096
修改内核参数
vim /etc/sysctl.conf
按如下修改
vm.max_map_count=655360
让命令修改生效
sysctl -p
- 修改主配置文件
vim /home/app/elasticsearch-6.6.0/config/elasticsearch.yml
按如下修改
path.data: /home/app/elasticsearch-6.6.0/data
path.logs: /home/app/elasticsearch-6.6.0/logs
network.host: 0.0.0.0
http.port: 9200
node.name: es-node1
cluster.initial_master_nodes: ["es-node1"]
vim /home/app/elasticsearch-6.6.0/config/jvm.options
按如下修改
-Xms2g
-Xmx2g
- 启动脚本
./elasticsearch -d
Kibana安装
- 将kibana-6.6.0.tar.gz传到目标服务器上
- 将kibana-6.6.0.tar.gz到指定文件
tar 将kibana-6.6.0.tar.gz -C /home/app
- 修改配置文件
vim /home/app/将kibana-6.6.0/config/kibana.yml
按如下修改
#提供服务的端口,监听端口
server.port: 5601
#主机地址,可以是ip,主机名
server.host: 128.33.18.12
#kibana访问es服务器的URL,就可以有多个,以逗号","隔开
elasticsearch.hosts: ["http://128.33.18.12:9200"]
#中文配置
i18n.locale: "zh-CN"
- 启动脚本
nohup /home/app/kibana-6.6.0/bin/kibana /home/app/kibana-6.6.0/kibana.log 2>&1 &
- 进入管理界面http://128.33.18.12:5601查看日志