ELK
目前ELK是业界比较流行的集中式日志解决方案,分别是ElasticSearch,Logstash,Kibana,他们都是elastic公司旗下的产品,所以也被成为ELK stack。
传统解决方案
- Elastic Search:分布式搜索和分析引擎,具有高可伸缩、高可靠和易管理等特点。基于 Apache Lucene 构建,能对大容量的数据进行接近实时的存储、搜索和分析操作。通常被用作某些应用的基础搜索引擎,使其具有复杂的搜索功能
- Logstash: 数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置;
- Kibana:数据分析和可视化平台。通常与 Elasticsearch 配合使用,对其中数据进行搜索、分析和以统计图表的方式展示;
目前大部分公司也都在使用这三个软件来解决日志问题,其逻辑架构如下图所示:
如果是收集多个服务器上的日志源,那么会扩展架构为如下所示
在需要收集日志的服务器上部署logstash进行日志收集,但是这样架构有一个很大的不足,由于logstash是用java编写,在运行期间非常耗费CPU和内存资源,很容易造成服务器性能下降,甚至导致无法正常工作。
FileBeat
FlieBeat也是elastic公司的一份子,其替换logstash-forwarder成为了ELK stack的新日志采集器,其优势主要体现在以下几个方面
- 轻量级:filebeat使用golang编写,运行时占用的cpu和内存与logstash相比可以忽略不及。
- 健壮:在任何环境中,应用程序停机总是时不时的停机。在读取和转发日志行的过程中,如果被中断,Filebeat会记录中断的位置。并且,当重新联机时,Filebeat会从中断的位置开始。
- 反压力敏感(backpressure-sensitive):当发送数据到Logstash或Elasticsearch时,Filebeat使用一个
反压力敏感(backpressure-sensitive)
的协议来解释高负荷的数据量。当Logstash数据处理繁忙时,Filebeat放慢它的读取速度。一旦压力解除,Filebeat将恢复到原来的速度,继续传输数据。
基于以上这些优点,我们就可以把之前架构修改为下图所示:
部署
这四个软件都可以直接到www.elastic.co上面下载。这里就不多说。下面主要说说软件的配置和启动,由于是验证阶段,每个节点只部署了一个应用,集群部署以及生产环境调优,后续会再说明
elasticsearch
解压tar包,到config路径下,修改elasticsearch.yml文件,主要修改network相关配置,为了部署在其他机器上的应用可以访问到es
network.host设置为0.0.0.0
http.port根据实际情况设置
启动直接在bin目录下运行以下命令即可,会自动找到我们刚刚修改过的yml文件1
./elasticsearch &
kibana
解压tar包,到config路径下,修改kibana.yml文件主要修改
server.port: 5601
server.host: “0.0.0.0”
如果你之前已经修改的es的端口,那么在这里需要把es的url修改下
elasticsearch.url: “http://localhost:9200"
启动直接在bin目录下运行1
./kibana &
logstash
解压tar包,到config目录下,创建logstash.conf文件,添加内容如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22input {
beats {
port => 51015
ssl => false
}
}
filter {
if [fields][logtype] == "patrick-log" {
json {
source => "message"
target => "data"
}
}
}
output {
if [fields][logtype] == "patrick-log"{
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "patrick-log-%{+YYYY.MM.dd}"
}
}
}
input
使用beats作为接入,端口可以根据自己的情况进行修改。如果你的filebeat没有配置ssl,这里可以设置ssl => false
filter
根据产品的实际情况配置,这里就不多描述了。output
将收集过滤的数据指向具体的存储中,比如es
启动在bin目录下1
./logstash -f ../config/logstash.conf
有些人在启动后会报如下错误1
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x000000008a660000, 1973026816, 0) failed; error='Cannot allocate memory' (errno=12)
这个问题主要是host的内存太小,无法启动logstash,话说这家伙还真是吃性能呀。修改方案如下1
vi /etc/sysctl.conf
添加vm.max_map_count=262144
保存退出,执行1
sudo sysctl -p
使生效即可解决
filebeat
解压tar包,在软件的根目录下修改filebeat.yml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32filebeat.prospectors:
- type: log
# Change to true to enable this prospector configuration.
enabled: true
scan_frequency: 10s
encoding: utf-8
tail_files: true
# Paths that should be crawled and fetched. Glob based paths.
paths:
- /home/guankai/logs/patrick/*.log
#- c:\programdata\elasticsearch\logs\*
document_type: "patrick-log"
multiline:
pattern: '^\s*("{)'
negate: true
match: after
max_lines: 10
timeout: 30s
fields:
logsource: node1
logtype: patrick-log
output.logstash:
# The Logstash hosts
hosts: ["localhost:51015"]
由于我们只扫描一个文件夹下的内容,所以filebeat.prospectors
只配置了一条,enabled
: true 表示filebeat会采用这个prospector的配置scan_frequency
扫描频率tail_files
是否从文件的末端开始
fileds:logtype
为后面的logstash提供参考