ELK是三款软件的总称,包括了elasticsearch、logstash、kibana,其实在生产使用中,我们还需要使用到其他的更多辅助软件来更好更合理的收集展示数据。
Elasticsearch:一个分布式的搜索查询服务器,提供了rest接口
Logstash:收集处理并传出日志,他安装在需要被收集日志的服务器上(暂时)
Kibana:一个web展示操作页面,从Elasticsearch提供的接口获取数据并做一些常用操作
使用ELK解决的问题:
- 开发人员可以完全不登录服务器也可以拿到需要的日志了
- 各个系统、集群日志分散,不统一,需要一台台去专门查询
- 日志量过大,常规查询分析方法太慢
那么我们现在来规划下,三台节点,node1、node2、node3。其中node1、node2作为Elasticsearch的分布式集群节点,并且都安装Kibana来提供web页面,而node3则为我们需要收集日志的目标机器,他只需要安装Logstash即可
首先我们要先去获取安装包,我们三种软件全部都下载同一版本(5.6.5)的rpm包,下载网址https://www.elastic.co/downloads/past-releases,然后分别上传到对应服务器上
然后回到node1上
1 [[email protected] ~]# yum install java elasticsearch-5.6.5.rpm kibana-5.6.5-x86_64.rpm –y 2 [[email protected] ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml 3 cluster.name: elk-cluster-1 # 集群名称,用来区分不同elk集群 4 node.name: node-1 # 集群内该节点名称,不可重复 5 path.data: /elk/data # 数据目录,即分散着被检索的日志 6 path.logs: /elk/logs # 日志目录 7 network.host: 192.168.56.11 # 自己的ip 8 http.port: 9200 # 对外访问端口。集群内部进行选举、通讯用的是9300端口 9 discovery.zen.ping.unicast.hosts: ["192.168.56.11", "192.168.56.12"] # 自动广播的目标,因为是广播,如果广播的机器过多,可能会影响到网络质量,所以规定好只向某些机器广播即可 10 [[email protected]]# mkdir /elk 11 [[email protected]node1]# systemctl start elasticsearch.service 12 [[email protected]]# ls /elk/ # 发现神马都木有 13 这是因为我们的elasticsearch默认的启动用户是elasticsearch,此时的/elk目录权限不够 14 [[email protected]]# chown elasticsearch:elasticsearch -R /elk 15 [[email protected]node1]# systemctl restart elasticsearch.service 16 [[email protected] ~]# ls /elk/ 17 data logs 18 [[email protected] ~]# grep "^[a-Z]" /etc/kibana/kibana.yml 19 server.port: 5601 # 打开的端口,默认就是5601 20 server.host: "192.168.56.11" # 监听的ip地址,默认是localhost 21 elasticsearch.url: http://192.168.56.11:9200 # 从该elasticsearch的获取数据来展示 22 [[email protected] ~]# systemctl start kibana.service 23 [[email protected] ~]# ss –tln # 发现9200、9300、5601都有啦 24 State Recv-Q Send-Q Local Address:Port Peer Address:Port 25 LISTEN 0 128 *:111 *:* 26 LISTEN 0 128 *:80 *:* 27 LISTEN 0 128 *:22 *:* 28 LISTEN 0 128 *:4505 *:* 29 LISTEN 0 128 *:4506 *:* 30 LISTEN 0 30 *:8000 *:* 31 LISTEN 0 128 192.168.56.11:5601 *:* 32 LISTEN 0 128 :::111 :::* 33 LISTEN 0 128 ::ffff:192.168.56.11:9200 :::* 34 LISTEN 0 128 ::ffff:192.168.56.11:9300 :::* 35 LISTEN 0 128 :::22 :::* 36 LISTEN 0 50 ::ffff:127.0.0.1:9600 :::*
此时node1上的操作就完成了,但是现在elasticsearch里并没有数据供我们检索查询,所以我们要去配置node3收集点日志,不过在此之前我们先去配置node2
1 [[email protected] ~]# yum install java elasticsearch-5.6.5.rpm kibana-5.6.5-x86_64.rpm -y 2 [[email protected] ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml 3 cluster.name: elk-cluster-1 # 让他们处于统一elk集群里 4 node.name: node-2 # 这个要变 5 path.data: /elk/data 6 path.logs: /elk/logs 7 network.host: 192.168.56.12 # 这个要变 8 http.port: 9200 9 discovery.zen.ping.unicast.hosts: ["192.168.56.11", "192.168.56.12"] 10 [[email protected]]# mkdir /elk 11 [[email protected]]# chown elasticsearch:elasticsearch -R /elk 12 [[email protected]node2]# systemctl start elasticsearch.service 13 [[email protected] ~]# ls /elk/ 14 data logs 15 [[email protected] ~]# grep "^[a-Z]" /etc/kibana/kibana.yml 16 server.port: 5601 # 打开的端口,默认就是5601 17 server.host: "192.168.56.12" # 监听的ip地址,默认是localhost 18 elasticsearch.url: http://192.168.56.12:9200 # 从该elasticsearch的获取数据来展示 19 [[email protected] ~]# systemctl start kibana.service
现在的情况很明显了,node1与node2组成了一个elasticsearch集群,我们向他们两个任意一个的9200端口传输获取数据都可以,而他们也都同时提供了kibana页面供我们访问,熟悉高可用负载均衡的朋友就可以一眼看出,我提供一个vip给kibana与elasticsearch做负载就可以保证生产时的环境了,没错就是酱,但是这点小事我们就不执行了,其实很简单啊,就几分钟的事情。
1 [[email protected] ~]# yum install java logstash-5.6.5.rpm –y 2 [[email protected] ~]# cd /etc/logstash/conf.d/ # 以后所有的配置规则都在这里哦 3 [[email protected] conf.d]# cat systemlog.conf 4 input { # 数据来源定义,可定义多个 5 file { # 从文件中获取 6 path => "/var/log/messages" # 文件路径 7 start_position => "beginning" # 从文件开头获取还是从现在开始,默认从现在 8 type => "systemlog-5613" # 类别名自定义,最好具有良好的辨认性 9 stat_interval => "2" # 获取时间间隔,默认1秒,太频繁了 10 } 11 } 12 13 14 output { # 数据输出定义,可定义多个 15 elasticsearch { # 向elasticsearch输出 16 hosts => ["192.168.56.11:9200"] # elasticsearch的url 17 index => "system-log-5613-%{+YYYY.MM.dd}" # 自定义,最好具有良好的辨认性,最后的%{+YYYY.MM.dd}是取当前的时间戳 18 } 19 file { # 向文件输出 20 path => "/tmp/systemlog.txt" # 输出路径 21 } 22 } 23 [[email protected] tmp]# chmod 644 /var/log/messages # messages的权限特殊是600 24 [[email protected] ~]# systemctl start logstash 25 [[email protected] ~]# tail -1 /tmp/systemlog.txt 26 {"@version":"1","host":"linux-node3.example.com","path":"/var/log/messages","@timestamp":"2017-12-15T10:30:02.990Z","message":"Dec 15 18:30:01 linux-node3 systemd: Starting Session 62 of user root.","type":"systemlog-5613"}
[system-log-5613-]YYYY.MM.DD,这个就是我们刚才的index,不同的是最后时间戳的表示是DD,然后我们勾选使用时间戳创建,确认到了匹配的数据索引后创建
发现没有数据,wtf,劳资费了这么大劲就给我看这个?我们点击蓝色按钮调整下查找的时间轴
设置成起始时间今天,截至时间为当前再次查询
有点信心了,我们选择排列host跟message,这样就可以直观的对比数据了