这里写目录标题

  • 一、EFK概述
  • EFK简介
  • 优缺点
  • ES数据库
  • Filebeat
  • Kibana
  • EFK扩展
  • 二、部署ELK日志分析系统
  • 案例拓扑图
  • 需求描述
  • 设备列表
  • 准备安装环境
  • 具体部署过程
  • Nginx+Filebeat部署
  • 1.部署Nginx
  • 安装kibana(node1)


一、EFK概述

EFK简介

EFK 不是一个软件,而是一套解决方案。EFK 是三个开源软件的缩写,Elasticsearch,FileBeat,Kibana。其中 ELasticsearch 负责日志分析和存储,FileBeat 负责日志收集,Kibana 负责界面展示。它们之间互相配合使用,完美衔接,高效的满足了很多场合的应用,是目前主流的一种日志分析系统解决方案。
EFK 和 ELK 只有一个区别, 收集日志的组件由 Logstash 替换成了 FileBeat

优缺点

Filebeat 相对 Logstash 的优点:

  • 侵入低,无需修改 elasticsearch 和 kibana 的配置;
  • 性能高,IO 占用率比 logstash 小太多;

当然 Logstash 相比于 FileBeat 也有一定的优势,比如 Logstash 对于日志的格式化处理能力,FileBeat 只是将日志从日志文件中读取出来,当然如果收集的日志本身是有一定格式的,FileBeat 也可以格式化,但是相对于Logstash 来说,效果差很多。

ES数据库

Elasticsearch 是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful 风格接口,多数据源,自动搜索负载等。

Filebeat

Filebeat 隶属于 Beats。目前 Beats 包含六种工具:

  • Packetbeat(搜集网络流量数据)
  • Metricbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
  • Filebeat(搜集文件数据)
  • Winlogbeat(搜集 Windows 事件日志数据)
  • Auditbeat( 轻量型审计日志采集器)
  • Heartbeat(轻量级服务器健康采集器)

Kibana

Kibana可以为 Logstash 、Beats和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

EFK扩展

另外,EFK 系统下的各个组件都非常吃内存,后期根据业务需要,EFK 的架构可进行扩展,当 FileBeat 收集的日志越来越多时,为防止数据丢失,可引入 Redis,而 ElasticSearch 也可扩展为集群,并使用 Head 插件进行管理, 所以要保证服务器有充足的运行内存和磁盘空间。

ps:曾经试图在只有 1 个 G 内存空间的阿里云服务器上搭建 一个最简易的 EFK 日志分析系统,结果是 Kibana 服务开启之后,Elasticsearch 服务就挂了,最后纠结了半天服务也起不起来。

二、部署ELK日志分析系统

案例拓扑图

系统日志e2fexpress是什么 efk日志系统_分布式

需求描述

配置EFK日志分析群集
使用Filebeat
使用Kibana乍看分析日志

设备列表

主机

操作系统

主机名/IP地址

主要软件

服务器

CentOS7.3

Node1/192.168.91.10

Elasticsearch、Kibana

服务器

CentOS7.3

Node2/192.168.91.20

Elasticsearch

服务器

CentOS7.3

Apache/192.168.91.30

Filebeat、Apache

准备安装环境

关闭防火墙和Selinux
Node1、Node2节点内存分配4G,Apache节点分配1G内存
通过VMware虚拟网络Vmnet8网络连接

具体部署过程

###登录192.168.91.10 更改主机名 配置域名解析 查看Java环境###

[root@location ~]# hostnamectl set-hostname node1
[root@location ~]# su
[root@location ~]# java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)

[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# systemctl disable firewalld
[root@node1 ~]# setenforce 0

安装elasticsearch

[root@node1 ~]# vi /etc/hosts
192.168.91.10 node1
192.168.91.20 node2
[root@node1 ~]# cd /opt/elk
[root@node1 elk]# rpm -ivh elasticsearch-5.5.0.rpm

加载系统服务

[root@node1 elk]# systemctl daemon-reload
[root@node1 elk]# systemctl enable elasticsearch.service

修改ELasticsearch配置文件

[root@node1 elk]# cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak			'//复制一份备份文件'
[root@node1 elk]# vim /etc/elasticsearch/elasticsearch.yml			
17//cluster.name: my-elk-cluster			'//集群名字---需相同'
23//node.name: node1						'//节点名字---跟主机名相同'
33//path.data: /data/elk_data				'//数据存放位置'
37//path.logs: /var/log/elasticsearch/		'//日志存放路径'
43//bootstrap.memory_lock: false			'//不在启动的时候锁定内存'
55//network.host: 0.0.0.0					'//提供服务绑定的IP地址,0.0.0.0代表所有地址'
59//http.port: 9200							'//监听端口为9200'
68//discovery.zen.ping.unicast.hosts: ["node1", "node2"]	'//集群发现通过单播实现'

[root@node1 elk]# grep -v "^#" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-elk-cluster
node.name: node1
path.data: /data/elk_data
path.logs: /var/log/elasticsearch/
bootstrap.memory_lock: false
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"]

创建数据存放路径并授权

[root@node1 elk]# mkdir -p /data/elk_data
[root@node1 elk]# chown elasticsearch:elasticsearch /data/elk_data/

启动elasticsearch是否成功开启

[root@node1 elk]# systemctl start elasticsearch.service
[root@node1 elk]# netstat -anptu | grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN      5715/java

查看节点信息,用真机192.168.91.10的浏览器打开http://192.168.91.10:9200/

{
  "name" : "node1",
  "cluster_name" : "my-elk-cluster",
  "cluster_uuid" : "7BztY_8bQFSWHdrykRbTDw",
  "version" : {
    "number" : "5.5.0",
    "build_hash" : "260387d",
    "build_date" : "2017-06-30T23:16:05.735Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.0"
  },
  "tagline" : "You Know, for Search"
}

查看节点信息,用真机192.168.91.20的浏览器打开http://192.168.91.10:9200/

{
  "name" : "node2",
  "cluster_name" : "my-elk-cluster",
  "cluster_uuid" : "7BztY_8bQFSWHdrykRbTDw",
  "version" : {
    "number" : "5.5.0",
    "build_hash" : "260387d",
    "build_date" : "2017-06-30T23:16:05.735Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.0"
  },
  "tagline" : "You Know, for Search"
}

集群检查健康与状态(node1、node2)
查看健康192.168.91.10:9200/_cluster/health?pretty

{
  "cluster_name" : "my-elk-cluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 2,
  "number_of_data_nodes" : 2,
  "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
}

查看状态192.168.91.10:9200/_cluster/state?pretty

{
  "cluster_name" : "my-elk-cluster",
  "version" : 6,
  "state_uuid" : "ZUdJ3zl_SdGNvojaHfxifA",
  "master_node" : "M6gRPmGTQZCsA3c4TjrMpQ",
  "blocks" : { },
  "nodes" : {
    "fXvs7sVhTkKOLgqSCFt_bw" : {
      "name" : "node1",
      "ephemeral_id" : "1OsaMQvhTv6yacqF3o-3XA",
      "transport_address" : "192.168.91.10:9300",
      "attributes" : { }
    },
    "M6gRPmGTQZCsA3c4TjrMpQ" : {
      "name" : "node2",
      "ephemeral_id" : "em66iSy7QqGwEn25gZkOTg",
      "transport_address" : "192.168.91.20:9300",
      "attributes" : { }
    }
  },
  "metadata" : {
    "cluster_uuid" : "7BztY_8bQFSWHdrykRbTDw",
    "templates" : { },
    "indices" : { },
    "index-graveyard" : {
      "tombstones" : [ ]
    }
  },
  "routing_table" : {
    "indices" : { }
  },
  "routing_nodes" : {
    "unassigned" : [ ],
    "nodes" : {
      "M6gRPmGTQZCsA3c4TjrMpQ" : [ ],
      "fXvs7sVhTkKOLgqSCFt_bw" : [ ]
    }
  }
}

安装node组件依赖包(node1、node2)

[root@node1 ~]# cd /opt/elk/
[root@node1 elk]# yum -y install gcc gcc-c++
[root@node1 elk]# tar zxvf node-v8.2.1.tar.gz
[root@node1 elk]# cd node-v8.2.1/
[root@node1 node-v8.2.1]# ./configure
[root@node1 node-v8.2.1]# make -j3
[root@node1node-v8.2.1]# make install

安装phantomjs前端框架(node1、node2)

[root@node1 ~]# cd /opt/elk/
[root@node1 elk]# tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src
[root@node1 elk]# cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin
[root@node1 bin]# cp phantomjs /usr/local/bin

安装Elasticsearch-head数据可视化工具(node1、node2)

[root@node1 ~]# cd /opt/elk/
[root@node1 elk]# tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/
[root@node1 elk]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm install

修改Elasticsearch主配置文件(node1、node2)

[root@node1 elasticsearch-head]# vim /etc/elasticsearch/elasticsearch.yml
...
http.cors.enabled: true					'//开启跨域访问支持,默认为false'
http.cors.allow-origin: "*"				'//跨域访问允许的域名地址'

[root@node1 elasticsearch-head]# systemctl restart elasticsearch

启动Elasticsearch-head 启动服务器(node1、node2)

[root@node1 ~]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm run start &							'//切换到后台运行'
[1] 59396
[root@node1 elasticsearch-head]# 
> elasticsearch-head@0.0.0 start /usr/local/src/elasticsearch-head
> grunt server

Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100

[root@node1 elasticsearch-head]# netstat -antp | grep 9200
[root@node1 elasticsearch-head]# netstat -antp | grep 9100

真机浏览器输入20.0.0.10:9100、20.0.0.20:9100

系统日志e2fexpress是什么 efk日志系统_linux_02


在location处输入http://192.168.91.10:9200/可以看到群集健康状态是绿色的,以及两个节点

系统日志e2fexpress是什么 efk日志系统_分布式_03


新建索引

系统日志e2fexpress是什么 efk日志系统_elasticsearch_04


加粗的是主文件的,细框的是备份文件,不论哪个节点宕机,存储都不会丢失,很安全,一个节点有五个分片,两个节点共10个分片d

系统日志e2fexpress是什么 efk日志系统_nginx_05


测试

#192.168.91.10
 #插入一个数据进行测试
[root@node1 ~]# curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type:application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
{
  "_index" : "index-demo",
  "_type" : "test",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "created" : true
}

刷新一下,可以看到存储的分片处理与备份,暂时不存在节点间的主备关系。

系统日志e2fexpress是什么 efk日志系统_分布式_06

Nginx+Filebeat部署

更改主机名及关闭防火墙

[root@nginx ~]# hostnamectl set-hostname nginx
#关闭防火墙与核心防护
[root@nginx ~]# setenforce 0
[root@nginx ~]# systemctl stop firewalld

1.部署Nginx

1.解压跨平台组件包和源码包
将跨平台组件包移动到源码包/opt目录下
nginx-1.12.2.tar.gz
```shell
[root@nginx ~]# cd /opt
[root@nginx opt]# tar xzvf nginx-1.12.2.tar.gz

2.安装编译器和其他工具

[root@nginx opt]# yum -y install gcc \
gcc-c++ \
make \
pcre-devel \
expat-devel \
perl \
zlib-devel \
pcre

3.configure配置

[root@nginx opt]# cd nginx-1.12.2
[root@nginx nginx-1.12.2]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module

4.编译安装

[root@nginx ~]# make && make install

为了使Nginx服务器的运行更加方便,可以为主程序nginx创建链接文件,以便管理员直接执行“nginx”命令就可以调用Nginx的主程序

[root@nginx ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

6.创建运行用户,组

[root@nginx ~]# useradd -M -s /sbin/nologin nginx

7.开启nginx,关闭防火墙

[root@nginx ~]# systemctl stop firewalld.service 
[root@nginx ~]# setenforce 0
[root@nginx ~]# nginx
[root@nginx ~]# netstat -ntap |grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      5396/nginx: master  
tcp        0      0 192.168.197.192:56680   192.168.100.3:445       ESTABLISHED

###2.部署filebeat环境
解压

[root@nginx opt]# tar -zxvf filebeat-7.0.1-linux-x86_64.tar.gz
[root@nginx opt]# mv filebeat-7.0.1-linux-x86_64 /usr/local/filebeat

编辑配置文件

[root@nginx ~]# cd /usr/local/filebeat
[root@nginx filebeat]# vim filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/*.log
 
setup.kibana:
  host: "localhost:5601"
 
output.elasticsearch:
  hosts: ["localhost:9200"]

后台启动 filebeat

[root@nginx filebeat]# nohup ./filebeat -c filebeat.yml &

安装kibana(node1)

安装kibana
上传软件包到/opt/目录下

[root@node1 ~]# cd /opt/elk
[root@node1 elk]# rpm -ivh kibana-5.5.1-x86_64.rpm		'//安装rpm包'
[root@node1 elk]# cd /etc/kibana/
[root@node1 kibana]# cp -p kibana.yml kibana.yml.bak			'//备份'
[root@node1 kibana]# vim /etc/kibana/kibana.yml
2//server.port: 5601			'//打开kibana端口'
7//server.host: "0.0.0.0"		'//kibana监听地址---监听所有'
21//elasticsearch.url: "http://主节点IP:9200"		'//与elasticsearch建立连接'
30//kibana.index: ".kibana"		'//在elasticsearch中添加.kibana索引---测试使用'
[root@node1 kibana]# systemctl start kibana.service	'//启动kibana服务'
[root@node1 kibana]# systemctl enable kibana.service	'//设置开机自启'
[root@node1 kibana]# nohup ./kibana &n                     '//后台启动'

访问192.168.91.10:5601进行查看视图

系统日志e2fexpress是什么 efk日志系统_elasticsearch_07


系统日志e2fexpress是什么 efk日志系统_系统日志e2fexpress是什么_08


Discover里查看日志,图表式显示

系统日志e2fexpress是什么 efk日志系统_系统日志e2fexpress是什么_09