elk-logo

ELK日志分析系统

本文参考链接: https://www.ibm.com/developerworks/cn/opensource/os-cn-elk-filebeat/index.html

概念

awk、grep、cat、tail等命令可以对日志进行简单筛选,面对海量日志的场景,简单操作,效率过低

ELK是elastic公司提供的一套完整的日志收集以及展示的解决方案,三个产品首字母缩写是ELK,分别是ElasticSearch、Logstash和Kibana

ElasticSearch简称ES,它是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎Apache Lucene基础上的搜索引擎,使用Java语言编写。

Logstash是一个具有实时传输能力的数据收集引擎,用来进行数据收集、解析、并将数据发送给ES

Kibana为ElasticSearch提供了分析和可视化的Web平台。可以在ElasticSearch的索引中查找,交互数据,并生成各种维度表格,图形

用途

传统意义上,ELK作为替代Splunk的一个开源解决方案。Splunk是日志分析领域的领导者。日志分析不仅仅包括系统产生的错误日志、异常,也包括业务逻辑,或者任何文本类的分析。而基于日志的分析,能够在其上产生非常多的解决方案,比如:

  • 问题排查,日志分析技术是问题排查的基石。基于日志做问题排查。
  • 监控和预警,日志、监控、预警是相辅相成的。基于日志的监控、预警使得运维有自己的机械战队,大大节省人力以及延长运维的寿命。
  • 关联事件,多个数据源产生的日志进行联动分析,通过某种分析算法,就能解决各个问题。
  • 数据分析

ELK角色

1、采集端:agent,对日志的源数据进行采集进行封装,发送到聚合端

2、聚合端:collector,接收来自采集端的数据,按照规则进数据处理,将数据发送给存储端

3、存储端:storage,也就是elasticsearch,负责数据存储(可扩展性、可靠性),和索引

常见的方案

ELF、EFK、graylog、ELK流式分析

部署Kafka+ELK+Beats环境

实验环境

推荐单台主机使用3G内存或者2G,优先3G

主机 服务 备注
192.168.1.1 ElasticSearch 内存3G
192.168.1.4 Kibana/Kafka/Zookeeper 内存3G
192.168.1.5 Logstash 内存3G
192.168.1.6 FileBeat/Nginx 内存3G

实验步骤

192.168.1.1需要jdk(java)/ElasticSearch

配置java环境

tar zxf jdk-8u201-linux-x64.tar.gz
mv jdk1.8.0_201/ /usr/local/java
vim /etc/profile
# 末尾添加
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

rm -rf /usr/bin/java
source /etc/profile
java -version # 验证java是否安装成功

安装Elasticsearch

tar zxf elasticsearch-6.3.2.tar.gz
mv elasticsearch-6.3.2 /usr/local/es

调整系统文件描述符的软硬限制

vim /etc/security/limits.conf
# 末尾添加
# 打开文件的软限制,ES要求系统文件描述符大于65535
* soft nofile 655360
# 打开文件的硬限制
* hard nofile 655360
# 用户可用进程数软限制
* soft nproc 2048
# 用户可用进程数硬限制
* hard nproc 4096
# JVM能够使用最大线程数
echo "vm.max_map_count=655360" >> /etc/sysctl.conf
sysctl -p

配置Elasticsearch服务环境

useradd es
mkdir -p /es/{data,logs}  # 日志及数据存放目录
chown -R es:es /usr/local/es /es # 使用es用户启动时,权限不对也会报错

网络对时

ntpdate ntp.ntsc.ac.cn

重启1.1主机

编辑elasticsearch.yml配置文件,ES默认就是集群模式的,所以只有一个节点也是集群模式

vim /usr/local/es/config/elasticsearch.yml 
# 取消注释
cluster.name: my-application
node.name: node-1
# 添加
node.master: true
node.data: true
# 取消注释并修改
path.data: /es/data
path.logs: /es/logs
network.host: 192.168.1.1   # 改为本机ip
discovery.zen.minimum_master_nodes: 1 # master的最少节点数
# 取消注释
http.port: 9200

192.168.1.4需要Kibana/Kafka/Zookeeper

安装Kibana

tar zxf kibana-6.3.2-linux-x86_64.tar.gz
mv kibana-6.3.2-linux-x86_64 /usr/local/kibana

修改Kibana配置文件

vim /usr/local/kibana/config/kibana.yml
# 取消注释
server.port: 5601
server.host: "192.168.1.4"
# 用来连接es服务
elasticsearch.url: "http://192.168.1.1:9200"

安装Zookeeper

tar zxf zookeeper-3.4.12.tar.gz 
mv zookeeper-3.4.12 /usr/local/zookeeper
mkdir /usr/local/zookeeper/data
echo 1 > /usr/local/zookeeper/data/myid
cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg

编辑zookeeper配置文件

vim /usr/local/zookeeper/conf/zoo.cfg 
# 修改
dataDir=/usr/local/zookeeper/data
# 添加
dataLogDir=/usr/local/zookeeper/data

启动zookeeper服务

/usr/local/zookeeper/bin/zkServer.sh start

安装Kafka

tar zxf kafka_2.12-2.1.0.tgz 
mv kafka_2.12-2.1.0 /usr/local/kafka

修改Kafka配置文件

vim /usr/local/kafka/config/server.properties
# 修改
broker.id=1   # 与zookeeper的myid一致
# 取消注释
listeners=PLAINTEXT://192.168.1.4:9092  # 改为本机ip
num.partitions=2 # 改为2,表示2个分区
zookeeper.connect=192.168.1.4:2181 # 改为本机ip,也是zookeeper所在ip

启动kafka

/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties 
netstat -anpt | grep 9092

创建一个消息队列

/usr/local/kafka/bin/kafka-topics.sh --create \
--zookeeper 192.168.1.4:2181 \
--replication-factor 1 --partitions 2 --topic elk
# 创建elk

模拟生产者发送消息验证kafka

/usr/local/kafka/bin/kafka-console-producer.sh \
--broker-list 192.168.1.4:9092 --topic elk
# 阻塞模式,可以输入内容
如:hello world

再开一个终端,模拟消费者接受生产者的消息

/usr/local/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server 192.168.1.4:9092 --topic elk \
--from-beginning
# 同样为阻塞模式,接收消息
hello world

192.168.1.5需要Logstash

安装Logstash

tar zxf logstash-6.3.2.tar.gz 
mv logstash-6.3.2 /usr/local/logstash

编辑logstash配置文件

vim /usr/local/logstash/config/logstash.yml 
# 取消注释
path.config: /usr/local/logstash/config/*.conf  # 配置文件路径
config.reload.automatic: true  # 开启自动加载配置文件
config.reload.interval: 3s   # 自动加载配置文件时间间隔
http.host: "192.168.1.5"  # 改为本机ip

192.168.1.6需要FileBeat/Nginx

安装filebeat

tar zxf filebeat-6.3.2-linux-x86_64.tar.gz 
mv filebeat-6.3.2-linux-x86_64 /usr/local/filebeat

安装Nginx

yum -y install pcre-devel openssl-devel zlib-devel gcc gcc-c++
tar zxf nginx-1.17.8.tar.gz -C /usr/src
cd /usr/src/nginx-1.17.8/
./configure --prefix=/usr/local/nginx
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx

启动nginx

nginx

ELK方案一

image-20200306183252993

filebeat作为日志搜集器,搜集Web访问日志,缓解了Logstash在各服务器节点占用资源高的问题,beat所占系统cpu和内存几乎可以忽略不计,搜集到的日志发送给Logstash来处理,Logstash处理完日志后,会交给ES来存储,然后Kibana会将ES中分析后的数据形成可视化的界面。如:柱形图,条形图等等。此方案适合访问量较小的Web应用

整合环境

192.168.1.6

修改filebeat配置文件,将本机的nginx日志文件打标签为nginx,方便elasticsearch来创建索引

vim /usr/local/filebeat/filebeat.yml
# 添加注释
# filebeat.inputs:
#- type: log
# paths:
#    - /var/log/*.log
# 添加以下内容为inputs配置
filebeat:
  prospectors:
    - type: log
      paths:
        - /usr/local/nginx/logs/access.log
      tags: ["nginx"]
# 修改
  enabled: true # 表示以上配置是否生效
# 添加注释
# output.elasticsearch:
#  hosts: ["localhost:9200"]
# 取消注释
output.logstash:
  hosts: ["192.168.1.5:5044"]  # 该ip为logstash的主机ip

192.168.1.5

新建nginx-logstash.conf文件,用来匹配日志索引

vim /usr/local/logstash/config/nginx-logstash.conf
添加:
input {
  beats {
    port => 5044  # filebeat端口号
  }
}

output {
  elasticsearch { 
    hosts => "192.168.1.1:9200"   # 该ip为elasticsearch的ip和端口
    index => "nginx"  # 数据索引名
  }
}

192.168.1.1

启动es

su es
/usr/local/es/bin/elasticsearch

192.168.1.6

启动filebeat

/usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml

192.168.1.5

启动logstash

/usr/local/logstash/bin/logstash -t /usr/local/logstash/config/nginx-logstash.conf 

192.168.1.4

启动kibana

/usr/local/kibana/bin/kibana

各个服务启动之后阻塞信息都是INFO就没问题,遇到WARN是no route的就关闭防火墙或者放行端口

验证

现在访问nginx就会产生nginx日志,访问3分钟之内es阻塞会出现以下日志(因为数据传递比较慢)

[2020-03-05T12:40:14,969][INFO ][o.e.c.m.MetaDataCreateIndexService] [node-1] [nginx] creating index, cause [auto(bulk api)], templates [], shards [5]/[1], mappings []
[2020-03-05T12:40:15,348][INFO ][o.e.c.m.MetaDataMappingService] [node-1] [nginx/jaEyF28_QgWuV50Re8j4Ng] create_mapping [doc]
# 看到[nginx] creating index即成功

在访问kibana的ip:5601,http://192.168.1.4:5601

login_kibana

进入管理界面,通过设置索引样式可以匹配出具体索引的数据

kibana_manage

如果es的阻塞日志没有成功的话,这里创建索引是不会success的,nginx*和logstash的nginx-logstash.conf中的output的index一致

index_patterns

设置在这个索引里使用时间字段来进行过滤数据

configure_setting

创建成功

index_success

创建可视化图表

create_visualize

选择样式为条形图样式

veritcal_bar

选择为刚才创建的索引数据生成图表

choose_nginx

右上方可保存图表,自动刷新间隔,时间维度

save_visual

ELK_an1_end

ELK方案二

beats_kafka_log_es_kibana

filebeat作为日志搜集器,搜集Web访问日志,缓解了Logstash在各服务器节点占用资源高的问题,beat所占系统cpu和内存几乎可以忽略不计,搜集到的日志发送给Logstash来处理,中间通过kafka消息队列来缓解当nginx被大量访问时,Logstash的处理日志的压力和ES存储数据的压力,Logstash处理完日志后,会交给ES来存储,然后Kibana会将ES中分析后的数据形成可视化的界面。如:柱形图,条形图等等。此方案适合访问量较大的Web应用

192.168.1.6

修改filebeat配置文件

vim /usr/local/filebeat/filebeat.yml 
# 添加注释
#output.logstash:
#  hosts: ["192.168.1.5:5044"]
# 添加
output.kafka:
   hosts: ["192.168.1.4:9092"]    # kafka所在ip
   topic: "elk"    # 已经添加过的elk

192.168.1.5

修改logstash配置文件

vim /usr/local/logstash/config/nginx-logstash.conf 
# 将input部分删了,重新编写为
input {
  kafka {
    bootstrap_servers => "192.168.1.4:9092"  # kafka所在ip和端口
    consumer_threads => 1   # 消费者线程数量
    decorate_events => "true"  # 将消息的偏移量等信息存储到日志
    topics => "elk"
    auto_offset_reset => "latest"  # 自动存储偏移量
  }
}

output {
  elasticsearch {
    hosts => "192.168.1.1:9200"
    index => "kafka"   # 与方案一区分
  }
}

192.168.1.1

启动es

su es
/usr/local/es/bin/elasticsearch

192.168.1.6

启动filebeat

/usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml

192.168.1.5

启动logstash

/usr/local/logstash/bin/logstash -t /usr/local/logstash/config/nginx-logstash.conf 

192.168.1.4

启动kafka

/usr/local/zookeeper/bin/zkServer.sh  start

ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties 

启动kibana

/usr/local/kibana/bin/kibana

验证

访问nginx使日志产生,ES生成kafka索引名的日志

http://192.168.1.6

然后访问kibana的ip及端口,验证kafka索引

http://192.168.1.4:5601

创建kafka索引

image-

create_k_index_type

create_success_kafka

config_set_kafka

创建kafka索引的图表(nginx的访问次数情况)

create_pic_index

gauge_pic

ch_kafka

因为我只访问了一次,所有count值为1

beatiful

查看日志分析数据

select_log

image-20200306090840301

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0