前言
ELK是最近比较流行的免费的日志系统解决方案,注意,ELK不是一个软件名,而是一个解决方案的缩写,即Elasticsearch+Logstash+Kibana(ELK Stack)
。这哥几个都是java系的产品,但是众所周知,java的东西很吃内存和CPU,Logstash在当作为收集日志的Agent时,就显得太过臃肿了。听说直播平台“斗鱼”团队很为logstash占用资源的情况很而苦恼,后来为了解决这个问题,他们自己写了一个agent。不过后来官方在logstash-forwarder的基础上推出了beat系列,里面包括四个兄弟,分别是:Packetbeat(搜集网络流量数据);Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据);Filebeat(搜集文件数据);Winlogbeat(搜集 Windows 事件日志数据)。而Filebeat也就这样加入了“日志收集分析”的团队里,所以虽然大家还是习惯性的叫ELK,其实准确的说法已经是ELKB了。
ELKB这几个哥们的分工如下:
- Elasticsearch:分布式搜索和分析引擎,具有高可伸缩、高可靠和易管理等特点。基于 Apache Lucene 构建,能对大容量的数据进行接近实时的存储、搜索和分析操作。通常被用作某些应用的基础搜索引擎,使其具有复杂的搜索功能;
- Logstash:数据收集额外处理和数据引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置;
- Kibana:数据分析和可视化平台。通常与 Elasticsearch 配合使用,对其中数据进行搜索、分析和以统计图表的方式展示;
- Filebeat:ELK 协议栈的新成员,在需要采集日志数据的 server 上安装 Filebeat,并指定日志目录或日志文件后,Filebeat 就能读取数据,迅速发送到 Logstash 进行解析,亦或直接发送到 Elasticsearch 进行集中式存储和分析。
设计架构
本文的设计结构就是这样,其中红色的redis/RebbitMQ部分可以省略(我这个例子里暂省略),让日志直接传递到logstash,如果日志量较大,最好还是添加上redis,同时再横向扩容Elasticsearch,搞成一个集群。
对于这几个模块服务器多说几句:
1)Logstash要选择计算能力强的,CPU和内存比较丰满的;
2)Elasticsearch要选择磁盘容量大的,同时CPU和内存也比较丰满的;
实验软件版本
Elasticsearch 5.6.4
Logstash 5.6.4
Kibana 5.6.4
Filebeat 5.6.4
Java 1.8+,安装方法:http://blog.51cto.com/chenx1242/2043924
由于ELKB这几个东西都是墙外的,墙内的下载可能会比较费劲。所以我稍后会把所有ELKB的5.6.4程序都放在51CTO的存储空间里,需要的朋友可以去下载,还是那话,虽然ELK升级频率很快,但是5.6.4已经足够稳定了。
实验服务器情况
安装Elasticsearch 5.6.4
以下所有操作都是root下进行的:
1 | curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.4.rpm |
然后编辑/etc/elasticsearch/elasticsearch.yml
,不然的话logstash无法与之相连:
1 | cluster.name: my-application #如果是集群的es就把这个打开,Elasticsearch 启动时会根据配置文件中设置的集群名字(cluster.name)自动查找并加入集群,端口是9300 |
保存之后,启动并且添加开机启动:
1 | systemctl start elasticsearch |
使用 办公室curl localhost:9200
能看到这样的情景就证明已经成功启动了:
安装kibana 5.6.4
以下所有操作都是root下进行的:
1 | curl -L -O https://artifacts.elastic.co/downloads/kibana/kibana-5.6.4-linux-x86_64.tar.gz |
把kibana.yml里的server.host: localhost
改成server.host: 0.0.0.0
,然后保存退出,在kibana的bin文件夹里执行./kibana
即可。如果要后台启动就是nohup /kibana安装路径/bin/kibana &
。
启动之后,如图: 办公室
安装Logstash 5.6.4
以下所有操作都是root下进行的:
1 | curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-5.6.4.rpm |
如果安装的时候爆错: 办公室/usr/share/logstash/vendor/jruby/bin/jruby: line 388: /usr/bin/java: No such file or directory
。那么就先which java
查看一下java的文件,然后做一个软连接过去,然后重装logstash即可,如图:
用户可以使用TLS双向认证加密Filebeat和Logstash的连接,保证Filebeat只向可信的Logstash发送加密的数据(如果你的logstash和filebeat是内网通信,而且你认可当前内网的安全度,这一步可以省略)。同样的,Logstash也只接收可信的Filebeat发送的数据。这个功能默认是关闭的,要开启的话需要先 办公室vim /etc/pki/tls/openssl.cnf
,如图:
找到[ v3_ca ]
的字段,在底下添加subjectAltName = IP:logstash的内网IP
字段,保存退出来到/etc/pki/tls/,执行下面命令:
1 | openssl req -x509 -days 365 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt |
来生成一个期限为365天的IP SAN证书对,如果想生成一个十年的证书,就把365改成3650即可,如图:
安装完毕之后, 办公室vim /etc/logstash/logstash.yml
,编辑成如下的样子:
然后在/etc/logstash/
下手动建立一个目录conf.d,在conf.d里新建一个logstash.conf
的文件,如下:
1 | $ cat /usr/local/logstash/config/conf.d/logstash.conf |
然后就是启动并且添加开机自启动:
1 | systemctl start logstash |
安装filebeat
以下所有操作都是root下进行的,在模块服务器上安装filebeat的方法如下:
1 | curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.6.4-x86_64.rpm |
之前在logstash上生成了一个IP SAN证书,现在需要把这个证书传递给filebeat的机器里,使用scp语句如下:
1 | scp -pr root@10.162.80.171:/etc/pki/tls/certs/logstash-forwarder.crt /etc/ssl/certs/ #10.162.80.171就是logstash的内网IP |
输入logstash的密码,并且密钥文件复制完毕之后,需要修改filebeat.yml,于是#vim /etc/filebeat/filebeat.yml:
1 | [root@func-auc-001 log]# grep -iv '#' /etc/filebeat/filebeat.yml | grep -iv '^$' |
注意!Filebeat的配置文件采用YAML格式,这意味着缩进非常重要!请务必使用与这些说明相同数量的空格。
保存之后,使用 办公室/etc/init.d/filebeat start
启动filebeat,如图:
故障解决
ELK几个部件现在都已经启动了,并且互相telnet端口都是通的,在elasticsearch的服务器上使用 办公室curl -XGET 'http://elasticsearch内网IP:9200/filebeat-*/_search?pretty'
却出现这样的情况:
而使用 办公室tailf /var/log/filebeat/filebeat
去查看filebeat的日志是这样的:
再看看logstash-plain.log,里面的情况是这样的: 办公室
从此可见,filebeat与logstash的联系是error状态,那么停止filebeat的进程,改用 办公室/etc/init.d/filebeat start -c /etc/filebeat/filebeat.yml
,重新在elasticsearch的服务器上使用curl -XGET 'http://elasticsearch内网IP:9200/filebeat-*/_search?pretty'
发现已经成功读到了我们之前配置的目录“/mng/hswx/auc/log”,如图:
配置kibana
在浏览器输入 办公室kibana服务器外网IP:5601
打开kibana的web界面,把idenx pattern
的地方改成filebeat-*
(同之前配置的index索引一致),然后点击create
,如图:
然后就得到了细节的web界面,如图: 办公室
点击左侧框的 办公室Discover
,就会看到梦寐以求的日志web界面,如图:
看一下红色框的内容里面有时间,有host主机,有source来源,还有具体的日志信息,我们再去func-auc-001这个日志源主机上查询一下日志: 办公室
两个日志是一样的,可见实现了预期的日志展示的目标!
最后一步,就是把kibana与nginx联系起来(也可以把kibana做阿里云负载均衡的后端服务器),这样通过nginx/负载均衡来访问kibana的界面,对kibana来说更安全。配置端口监听如图,再把kibana服务器挂在负载均衡后面即可。 办公室
参考资料
https://www.ibm.com/developerworks/cn/opensource/os-cn-elk-filebeat/index.html
https://www.ibm.com/developerworks/cn/opensource/os-cn-elk/
http://www.jinsk.vip/2017/05/24/elksetup/
https://renwole.com/archives/661
https://www.zybuluo.com/dume2007/note/665868
https://www.elastic.co/guide/en/beats/libbeat/5.6/getting-started.html
https://discuss.elastic.co/search?q=ERR%20Failed%20to%20publish%20events%20caused%20by%3A%20read%20tcp
http://jaminzhang.github.io/elk/ELK-config-and-use-Filebeat/ (这个博主很好,但是就是博客无法留言,这点比较坑)