基于elk的日志分析平台(二)部署
ogstash,elasticsearch,kibana 怎么进行 nginx 的日志分析呢?首先,架构方面,nginx 是有日志文件的,它的每个请求的状态等都有日志文件进行记录。其次,需要有个队列,redis 的 list 结构
正好可以作为队列使用。然后分析使用 elasticsearch 就可以进行分析和查询了。
我们需要的是一个分布式的,日志收集和分析系统。logstash 有 agent 和 indexer 两个角色。对于 agent 角色,放在单独的 web 机器上面,然后这个 agent 不断地读取 nginx 的日志文件,每当
它读到新的日志信息以后,就将日志传送到网络上的一台 redis 队列上。对于队列上的这些未处理的日志,有不同的几台 logstash indexer 进行接收和分析。分析之后存储到 elasticsearch 进行搜索分析。再由统一的 kibana 进行日志 web 界面的展示。
环境
node | ip |
---|---|
node1 | 172.25.0.1 |
node2 | 172.25.0.2 |
node3 | 172.25.0.3 |
系统环境:
rhel7
elasticsearch
logstash
kibana
#分别做什么
三台机器全部安装jdk1.8,因为elasticsearch是java开发的
全部安装elasticsearch (后续都简称为es)
node1作为主节点
2 3作为数据节点
2上安装 logstash
配置两台机器的hosts文件
vim /etc/hosts
安装elasticsearch
1.jdk 1.8 安装:
# tar zxf jdk-8u45-linux-x64.tar.gz -C /usr/local/
# ln -s /usr/local/jdk1.8.0_45/ /usr/local/java
# vim /etc/profile
export JAVA_HOME=/usr/local/java/
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$PATH:$JAVA_HOME/bin
# source /etc/profile
#验证java安装成功
java -version
2.安装es 配置es
rpm -ivh elasticsearch-6.7.2.rpm
配置es:
es 的配置文件在这两个地方:
ll /etc/elasticsearch
total 36
-rw-rw---- 1 root elasticsearch 207 May 19 22:12 elasticsearch.keystore
-rw-rw---- 1 root elasticsearch 2869 Apr 29 05:14 elasticsearch.yml
-rw-rw---- 1 root elasticsearch 3685 Apr 29 05:14 jvm.options
-rw-rw---- 1 root elasticsearch 13085 Apr 29 05:14 log4j2.properties
-rw-rw---- 1 root elasticsearch 473 Apr 29 05:14 role_mapping.yml
-rw-rw---- 1 root elasticsearch 197 Apr 29 05:14 roles.yml
-rw-rw---- 1 root elasticsearch 0 Apr 29 05:14 users
-rw-rw---- 1 root elastic
ll /etc/sysconfig/elasticsearch
-rw-rw---- 1 root elasticsearch 1613 Apr 29 05:14 /etc/sysconfig/elasticsearch
search 0 Apr 29 05:14 users_roles
elasticsearch.yml 文件用于配置集群节点等相关信息的,
elasticsearch 文件则是配置服务本身相关的配置,
例如某个配置文件的路径以及java的一些路径配置什么的
#修改内核参数 limits.conf:
需要修改几个参数,不然启动会报错
vim /etc/security/limits.conf
在末尾追加以下内容(*为启动用户,当然也可以指定为某个用户名)
* soft nofile 65536
* hard nofile 65536
* soft nproc 2048
* hard nproc 2048
* soft memlock unlimited
* hard memlock unlimited
#继续再修改一个参数
vim /etc/security/limits.d/20-nproc.conf
* soft nproc 4096
root soft nproc unlimited
~
ES最少要求为2048
注:这些是需要重启后生效的,如果启动报错,可以试着重启下虚拟机
3.配置主节点
vim /etc/elasticsearch/elasticsearch.yml
cluster.name: my-application # 集群中的名称
node.name: master-node # 该节点名称
node.master: true # 意思是该节点为主节点
node.data: false # 表示这不是数据节点
bootstrap.memory_lock: false
# 锁住内存,使内存不会分配至交换区(swap)
#(我的是关闭的,true的话es会无法启动,系统也没有日志或者是报这个错
#memory locking requested for elasticsearch process but
#memory is not locked,这个问题我查了好长时间才发现的)
network.host: 0.0.0.0
# 监听全部ip,在实际环境中应设置为一个安全的ip,比如服务器
http.port: 9200 # es服务的端口号
discovery.zen.ping.unicast.hosts: ["172.25.0.1", "172.25.0.2", "172.25.0.3"] # 配置自动发现(集群必配)
#然后将配置文件发送到另外两台机器上去
scp /etc/elasticsearch/elasticsearch.yml node2/3
'#安装插件
/usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head
# head 插件,它是一个用浏览器跟 ES 集群交互的插件,
#可以查看集群状态、集群的 doc 内容、执行搜索和普通的 Rest 请求等。访问 172.25.0.1:9200/_plugin/head 页面来查看 ES 集群状态:
#或者安装docker镜像或者通过github下载elasticsearch-head项目都是可以的,1或者2两种方式选择一种安装使用即可
1. 使用docker的集成好的elasticsearch-head
# docker run -p 9100:9100 mobz/elasticsearch-head:5
docker容器下载成功并启动以后,运行浏览器打开http://localhost:9100/
2. 使用git安装elasticsearch-head
# yum install -y npm
# git clone git://github.com/mobz/elasticsearch-head.git
# cd elasticsearch-head
# npm install
# npm run start'
#配置java虚拟机内存配置java虚拟机内存
把2g改为512m(系统默认是2g,我们做实验,虚拟机内存达不到2g会报错)
vim /etc/elasticsearch/jvm.options
-Xms2g
-Xmx2g
#改为
-Xms512m
-Xmx512m
#到两台机器上去更改该文件,修改以下几处地方:
node2
rpm -ivh elasticsearch-6.7.2.rpm
vim /tmp/elasticsearch.yml
node.name: data-node1
node.master: false
node.data: true
cp /tmp/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml
node3:
rpm -ivh elasticsearch-6.7.2.rpm
vim /tmp/elasticsearch.yml
node.name: data-node2
node.master: false
node.data: true
cp /tmp/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml
完成以上的配置之后,到主节点上,启动es服务:
systemctl start elasticsearch
主节点启动完成之后,再启动其他节点的es服务:
systemctl start elasticsearch
es 会监听两个端口
netstat -lntp |grep java
es 集群创建完毕
测试:
curl 172.25.0.1:9200
得到信息
9300端口是集群通信用的,9200则是数据传输时用的。
主节点启动成功后,依次启动其他节点即可,我这里其他节点都是启动正常的。
安装logstash
node2
安装logstash:
安装logstash,但是要注意的是目前logstash不支持JDK1.9。
rpm -ivh logstash-6.7.2.rpm
测试:
安装完之后,先不要启动服务,先配置logstash收集syslog日志:
vim /etc/logstash/conf.d/syslog.conf # 加入如下内容
input { # 定义日志源
syslog {
type => "system-syslog" # 定义类型
port => 10514 # 定义监听端口
}
}
output { # 定义日志输出
stdout {
codec => rubydebug # 将日志输出到当前的终端上显示
}
}
检测配置文件是否有错:
cd /usr/share/logstash/bin
./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit
为 ok 表示 配置问题
#命令说明:
--path.settings 用于指定logstash的配置文件所在的目录
-f 指定需要被检测的配置文件的路径
--config.test_and_exit 指定检测完之后就退出,不然就会直接启动了
配置kibana服务器的ip以及配置的监听端口:
vim /etc/rsyslog.conf
#### RULES ####
*.* @@172.25.0.2:10514
重启rsyslog,让配置生效:
[root@data-node1 ~]# systemctl restart rsyslog
指定配置文件,启动logstash:
cd /usr/share/logstash/bin
./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf
# 这时终端会停留在这里,因为我们在配置文件中定义的是将信息输出到当前终端
打开新终端检查一下10514端口是否已被监听
然后在别的机器ssh登录到这台机器上,测试一下有没有日志输出:
#以上只是测试的配置,这一步我们需要重新改一下配置文件,让收集的日志信息输出到es服务器中,而不是当前终端:
vim /etc/logstash/conf.d/syslog.conf # 更改为如下内容
input {
syslog {
type => "system-syslog"
port => 10514
}
}
output {
elasticsearch {
hosts => ["172.25.0.1:9200"] # 定义es服务器的ip
index => "system-syslog-%{+YYYY.MM}" # 定义索引
}
}
同样的需要检测配置文件有没有错:
cd /usr/share/logstash/bin
./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit
没问题后,启动logstash服务,并检查进程以及监听端口:
##如果没有端口或端口ip不对
ll /var/lib/logstash/
total 4
drwxr-xr-x 2 root root 6 May 20 03:30 dead_letter_queue
drwxr-xr-x 2 root root 6 May 20 03:30 queue
-rw-r--r-- 1 root root 36 May 20 03:38 uuid
chown -R logstash /var/lib/logstash/
systemctl restart logstash
vim /etc/logstash/logstash.yml
http.host: "192.168.160.136"
systemctl restart logstash
#kibana上查看日志
完成了logstash服务器的搭建之后,回到kibana服务器上查看日志
此时,我们就可以配置kibana了
安装kibana
node1
安装kibana:
rpm -ivh kibana-6.7.2-x86_64.rpm
安装完成后,对kibana进行配置:
vim /etc/kibana/kibana.yml
server.port: 5601 # 配置kibana的端口
server.host: 172.25.0.1 # 配置监听ip (kibana 自己的ip服务器地址)
elasticsearch.url: "http://172.25.0.1:9200" # 配置es服务器的ip,如果是集群则配置该集群中主节点的ip
logging.dest: /var/log/kibana.log # 配置kibana的日志文件路径,不然默认是messages里记录日志
touch /var/log/kibana.log
chmod 777 /var/log/kibana.log
启动:
systemctl start kibana
查看是否启动成功
netstat -lntp |grep 5601
tcp 0 0 192.168.160.135:5601 0.0.0.0:* LISTEN 11164/node
测试:
浏览器访问:http://192.168.160.135:5601/
安装filebeat
node3 安装
安装filebeat及使用filebeat收集日志
1、filebeat的概述
Filebeat是一个日志文件托运工具,在服务器上安装客户端后,filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读),并且转发这些信息发送非elasticsearch或者logstarsh。
Filebeat相对于logstash而言,更轻量级,占用系统资源少。
2、filebeat的下载安装
Filebeat需要安装在收集日志的服务器上,即日志所在的服务器上,然后将所在服务器的指定日志发送给logstash或者elasticsearch。
比如收集nginx、 redis、 message、secrue的日志
因为logstash是jvm跑的,资源消耗比较大,所以后来作者又用golang写了一个功能较少但是资源消耗也小的轻量级的logstash-forwarder。不过作者只是一个人,加入http://elastic.co公司以后,因为es公司本身还收购了另一个开源项目packetbeat,而这个项目专门就是用golang的,有整个团队,所以es公司干脆把logstash-forwarder的开发工作也合并到同一个golang团队来搞,于是新的项目就叫filebeat了。
logstash 和filebeat都具有日志收集功能,filebeat更轻量,占用资源更少,但logstash 具有filter功能,能过滤分析日志。一般结构都是filebeat采集日志,然后发送到消息队列,然后logstash去获取,利用filter功能过滤分析,然后存储到elasticsearch中.
filebeat–>redis–>logstash(parse)–>es集群–>kibana–nginx
rpm -ivh filebeat-6.7.2-x86_64.rpm
将日志输出到到elasticsearch:
需要修改的配置项为:
vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/*.log 你要收集的日志的地址
output.elasticsearch:
hosts: ["172.25.0.1:9200"] elasticsearch的地址
4、启动filebeat
Filebeat启动后,filebeat会实时将配置文件中指定需要收集的日志发送给elasticsearch。
systemctl start filebeat
查看索引有没有成功:
node1
curl '172.25.0.1:9200/_cat/indices?v'
在kibana 上创建filebeat-* 索引