ELK介绍:
随着业务发展越来越壮大,服务器的数量越来越多,导致我们运维人员无法很好的去管理日志。
ELK就是由elasticsearch logstash以及kibana组成:
Elasticsearch:是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。详细可参考EC官网(https://www.elastic.co/cn/)
Logstash:主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
Kibana:Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
以上是最初的时候的架构模型,随着发展,我们出现了filebeat----轻量级的日志处理工具,它的优点是占用系统资源少,并且适合在各个服务器上面部署收集可以直接传输给ES服务器并且通过kibana进行日志展示,但是他的缺点正是logstash的优点,他无法设置日志的展示格式,看自己的需求进行构建。
Filebeat隶属于beats,beats包含了6种工具。
Packetbeat: 网络数据(收集网络流量数据)
Metricbeat: 指标 (收集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
Filebeat: 日志文件(收集文件数据)
Winlogbeat: windows事件日志(收集 Windows 事件日志数据)
Auditbeat:审计数据 (收集审计日志)
Heartbeat:运行时间监控 (收集系统运行时的数据)
关于x-pack工具,它提供了安全,警报,监控,报表,图表于一身的扩展包,是收费的,所以我也没装过。
Logstash工作原理:
它处理事件有三个阶段:input filter output,是一个接收,处理,转发日志的工具,支持很多种日志:webserver 错误日志,等等
架构原理:
标题
可以看出来源数据到到input,然后filter处理,output输出;当然这里面肯定是有些语法要求的。具体的可参考https://elkguide.elasticsearch.cn/logstash/examples/nginx-access.html太多了 这里我就不写了。
Logstash太耗费cpu 内存等资源了,所以可以通过filebeat来取代它
Filebeat的工作原理:
主要由prospectors(勘测者)和harvesters(收割机)两部分组成:
prospectors(勘测者)主要负责管理harvesters并找到所有读取源;
harvesters(收割机):负责读取单个文件内容,每个文件会启动一个收割机来负责打开或关闭文件,且在运行时文件描述符处于打开状态,所以在收割机关闭之前磁盘不会被释放(即使删除正在被收割机打开的文件,磁盘空间也不会被释放。一会安装完成之后我们来看一下filebeat的配置文件,很简单就能懂。
搭建环境:
Centos7.0两台:
10.10.10.10(搭建es,kibana,以及logstash来演示)
10.10.10.20(搭建filebeat,nginx来演示)
由于是java开发的所以配置java1.8
安装方式我采用的是rpm包,版本是6.5版本。到官网下载即可。
链接:https://www.elastic.co/downloads
10.10.10.10:
1配置jdk1.8
tar -xf jdk-8u191-linux-x64.tar.gz -C /usr/local/ && mv jdk1.8.**** jdk1.8
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8
export CLASSPATH=.:$JAVA_HOME/lib.tools.jar
export PATH=$JAVA_HOME/bin:$PATH
2 配置ES服务:
rpm -ivh elasticsearch-6.5.0.rpm
安装完成后,在/etc/elasticsearch有elasticsearch.yml文件是用来配置集群节点等相关信息的
开始配置集群节点,在10.10.10.10上面配置es配置文件
[root@master-node ~]# vim /etc/elasticsearch/elasticsearch.yml # 增加或更改以下内容
cluster.name: master-node # 集群中的名称
node.name: master # 该节点名称
node.master: true # 意思是该节点为主节点,若不是主节点写为false
node.data: false # 表示这不是数据节点,若是数据节点改为true
network.host: 0.0.0.0 # 监听全部ip,在实际环境中应设置为一个安全的ip
http.port: 9200 # es服务的端口号
discovery.zen.ping.unicast.hosts: ["10.10.10.10", "10.10.10.20] # 配置自动发现
如果你的环境中需要搭建集群的请注意红色部分。我这里就两台,所以不需要。
现在可以来启动es服务了。
systemctl start elasticsearch,注意这不会报错但是起不来,可以通过status查看报错信息
在这里很多朋友们会报错,我也用的是虚拟机,以为es要求最低的内存为2G,那我们可以调节一下运行内存。vim /etc/elasticsearch/jvm.options此文件为java的虚拟机的配置文件
在里面修改两个参数-xms -xmx 默认应该是2G,我改为了256m
此时启动发现还会报错,发现它会报找不见java,那我们只能做个软连接了,因为在这里我也不知道是不是bug,因为确实已经配置好了环境变量了。
ln -s /usr/local/jdk1.8/bin/* /usr/local/bin
再次启动就成功了!
ps aux| grep elasticsearch
善用systemctl status elasticsearch以及使tail -f /var/log/messages
netstat -antp | grep java 可以发现9200 9300 端口开启
9300端口是集群通信用的,9200端口则是数据传输时用的。
当查到这些都没有问题的时候我们的es可以算是启动成功了,我们可以查询一下我们的集群状态。
[root@master-node ~]# curl '10.10.10.10/_cluster/health?pretty'
{
"cluster_name" : "master-node",
"status" : "green", # 为green则代表健康没问题,如果是yellow或者red则是集群有问题
"timed_out" : false, # 是否有超时
"number_of_nodes" : 3, # 集群中的节点数量
"number_of_data_nodes" : 2, # 集群中data节点的数量
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
也可以通过浏览器http://10.10.10.10:9200/_cluster/health?pretty来进行查看
检查完毕之后,我们的es就算是搭建好了。
第二步我们来搭建kibana,提供一个人性化的web展示框架,是node.js框架写的
10.10.10.10:
我也都下载好了rpm包:
rpm -ivh kibana-6.5.0-x86_64.rpm
安装完成后我们来对kibana来进行配置。
[root@master-node ~]# vim /etc/kibana/kibana.yml # 增加以下内容
server.port: 5601 # 配置kibana的端口
server.host: 0.0.0.0 # 配置监听ip
elasticsearch.url: "http://10.10.10.10:9200" # 配置es服务器的ip,如果是集群则配置该集群中主节点的ip
logging.dest: /var/log/kibana.log # 配置kibana的日志文件路径,不然默认是messages里记录日志
创建kibana的日志文件:
touch /var/log/kibana.log; chmod 777 /var/log/kibana.log
启动kibana服务
systemctl start kibana
ps aux | grep kibana
netstat -antp | grep 5601
端口为5601,由于是node.js开发的所以进程名字为node
然后就可以通过浏览器访问了
:http://10.10.10.10:5601
是不需要账户和密码就可以登陆的。建议用谷歌登陆啊,因为全是外语。
安装logstash:
rpm -ivh logstash-6.5.0.rpm
安装完成后我们不要启动服务,我们先配置logstash收集syslog的日志:
[root@data-node1 ~]# vim /etc/logstash/conf.d/syslog.conf # 加入如下内容
input { # 定义日志源
syslog {
type => "system-syslog" # 定义类型
port => 10514 # 定义监听端口
}
}
output { # 定义日志输出
stdout {
codec => rubydebug # 将日志输出到当前的终端上显示
}
}
检查配置文件是否有错:
[root@data-node1 ~]# cd /usr/share/logstash/bin
[root@data-node1 /usr/share/logstash/bin]# ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit
Configuration OK # 为ok则代表配置文件没有问题
命令说明:
--path.settings 用于指定logstash的配置文件所在的目录
-f 指定需要被检测的配置文件的路径
--config.test_and_exit 指定检测完之后就退出,不然就会直接启动了
配置kibana服务器的ip以及配置监听的对象的端口
[root@data-node1 ~]# vim /etc/rsyslog.conf
#### RULES ####
*.* @@10.10.10.10:10514
重启rsyslog,让配置生效:systemctl restart rsyslog
接下来我们制定配置文件,启动logstash
[root@data-node1 ~]# cd /usr/share/logstash/bin
[root@data-node1 /usr/share/logstash/bin]# ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf
# 这时终端会停留在这里,因为我们在配置文件中定义的是将信息输出到当前终端,如果上一步检测执行成功的话这块应该没什么问题,会输出很多信息。
上面只是测试,我们现在来真正配置logstash,让收集的信息输送到es服务,并且通过kibana展示出来。
[root@data-node1 ~]# vim /etc/logstash/conf.d/syslog.conf # 更改为如下内容
input {
syslog {
type => "system-syslog"
port => 10514
}
}
output {
elasticsearch {
hosts => ["192.168.77.128:9200"] # 定义es服务器的ip
index => "system-syslog-%{+YYYY.MM}" # 定义索引
#这里我们会引申出来一个叫索引的东西,这个我们后面要配合kibana来设置索引进行查看。
现在我们继续检测配置文件有没有错:
[root@data-node1 ~]# cd /usr/share/logstash/bin
[root@data-node1 /usr/share/logstash/bin]# ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit
Sending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties
Configuration OK
没问题后我们启动服务,并且检查进程以及监听端口
systemctl start logstash
ps aux | grep logstash
netstat -antp | grep 9600
netstat -antp |grep 10514
这里我得说明一下啊,我的这块没有报错,但是如果报错了首先是进程存在,这两个端口没起来;善用日志,去messages找报错信息,这里报错可能是你的权限不够,我就不截图了
chown logstash /var/log/logstash/logstash-plain.log
chown -R logstash /var/lib/logstash/
这下再启动logstash并且检查端口。
此时我们还得修改一下logstash的yml文件,修改一下监听ip,因为它是本地回环ip无法远程通信。
vim /etc/logstash/logstash.yml
http.host: "0.0.0.0"
重新启动logstash服务并且查看端口,到这里我们的logstash也配置好了。
那我们现在可以登陆上kibana来进行日志的查看咯!
完成了logstash服务器的搭建之后,回到kibana服务器上查看日志,执行以下命令可以获取索引信息:
[root@master-node ~]# curl '10.10.10.10:9200/_cat/indices?v'
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .kibana 6JfXc0gFSPOWq9gJI1ZX2g 1 1 1 0 6.9kb 3.4kb
green open system-syslog-2018.03 bUXmEDskTh6fjGD3JgyHcA 5 1 61 0 591.7kb 296.7kb
如上,可以看到,在logstash配置文件中定义的system-syslog索引成功获取到了,证明配置没问题,logstash与es通信正常。(第二行第三列就是我们再logstash.conf定义的索引)
[root@master-node ~]# curl -XGET '10.10.10.10:9200/system-syslog-2018.03?pretty'
这条命令是来查看详细信息的。
删除索引用:
curl -XDELETE 'localhost:9200/system-syslog-2018.03'
同样的这些都可以同过web界面ip+端口来进行展示。
如果上面正常的话我们就可以去配置kibana了,浏览器访问10.10.10.10:5601
我们来创建索引。
用谷歌浏览器来登陆-----左下角管理----kibana标签找索引的字眼----设置索引的名称(必须和的索引通配哦)----选择过滤器(可以选或不选)-----创建-----左上角发现------然后输入自己的设置的索引找到日志就ok了
有时候会发现无法找到日志信息,可能是时间的问题,右上角选择时间。
至此ELK就算是介绍完了,下面我们来介绍filebeat轻量级的收集工具的使用方法
之前也介绍过beats是ELK体系中新增的一个工具,它属于一个轻量的日志采集器,以上我们使用的日志采集工具是logstash,但是logstash占用的资源比较大,没有beats轻量,所以官方也推荐使用beats来作为日志采集工具。而且beats可扩展,支持自定义构建
官方:https://www.elastic.co/cn/products/beats
10.10.10.20:
我也是下载好的rpm包
rpm -ivh filebeat-5.2.0-x86_64.rpm
安装完成后我们来编辑配置文件:
[root@data-node2 ~]# vim /etc/filebeat/filebeat.yml # 增加或者更改为以下内容
filebeat.prospectors:
- type: log
#enabled: false 这一句要注释掉
paths:
- /var/log/messages # 指定需要收集的日志文件的路径
#output.elasticsearch: # 先将这几句注释掉
# Array of hosts to connect to.
# hosts: ["localhost:9200"]
output.console: # 找个位置添加下面这两句话测试用,指定在终端上输出日志信息
enable: true
完成后:执行以下命令看看是否终端可以打印日志,若可以则配置成功
[root@data-node2 ~]# /usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml
以上配置只是测试filebeat是否能正常收集数据,现在我们再次修改配置文件
[root@data-node2 ~]# vim /etc/filebeat/filebeat.yml
#output.console: 把这两句注释掉
# enable: true
# 把这两句的注释去掉
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["10.10.10.10:9200"] # 并配置es服务器的ip地址
完事后我们启动服务:
[root@data-node2 ~]# systemctl start filebeat
[root@data-node2 ~]# ps axu |grep filebeat
启动成功后,到es服务器上查看索引,可以看到新增了一个以filebeat-6.0.0开头的索引,这就代表filesbeat和es能够正常通信了:
[root@master-node ~]# curl '192.168.77.128:9200/_cat/indices?v'
最后在kibana上按照之前的流程配置索引了,以上这就是如何使用filebeat进行日志的数据收集,可以看到配置起来比logstash要简单,而且占用资源还少。
在这里我要说一下,为什么有了filebeat却还要用logstash呢,因为logstash可以设置日志的输出格式,当然如果你为了方便可以直接在客户端配置filebeat,不需要logstash来进行处理了;如果你们日志较多,那这时候就可以配置logstash配合使用。以上只是我个人见解,并且没有什么经验,简单看看。
作者:陆游。