EFK 不是一个软件,而是一套解决方案。EFK 是三个开源软件的缩写,Elasticsearch,FileBeat,Kibana。其中 ELasticsearch 负责日志分析和存储,FileBeat 负责日志收集,Kibana 负责界面展示。它们之间互相配合使用,完美衔接,高效的满足了很多场合的应用,是目前主流的一种日志分析系统解决方案。
EFK 和 ELK 只有一个区别, 收集日志的组件由 Logstash 替换成了 FileBeat
Filebeat 相对 Logstash 的优点:
当然 Logstash 相比于 FileBeat 也有一定的优势,比如 Logstash 对于日志的格式化处理能力,FileBeat 只是将日志从日志文件中读取出来,当然如果收集的日志本身是有一定格式的,FileBeat 也可以格式化,但是相对于Logstash 来说,效果差很多。
Elasticsearch 是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful 风格接口,多数据源,自动搜索负载等。
Filebeat 隶属于 Beats。目前 Beats 包含六种工具:
Kibana可以为 Logstash 、Beats和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
另外,EFK 系统下的各个组件都非常吃内存,后期根据业务需要,EFK 的架构可进行扩展,当 FileBeat 收集的日志越来越多时,为防止数据丢失,可引入 Redis,而 ElasticSearch 也可扩展为集群,并使用 Head 插件进行管理, 所以要保证服务器有充足的运行内存和磁盘空间。
ps:曾经试图在只有 1 个 G 内存空间的阿里云服务器上搭建 一个最简易的 EFK 日志分析系统,结果是 Kibana 服务开启之后,Elasticsearch 服务就挂了,最后纠结了半天服务也起不起来。
配置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
[[email protected]]# 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]#
> [email protected] 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
在location处输入http://192.168.91.10:9200/可以看到群集健康状态是绿色的,以及两个节点
新建索引
加粗的是主文件的,细框的是备份文件,不论哪个节点宕机,存储都不会丢失,很安全,一个节点有五个分片,两个节点共10个分片d
测试
#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
}
刷新一下,可以看到存储的分片处理与备份,暂时不存在节点间的主备关系。
更改主机名及关闭防火墙
[root@nginx ~]# hostnamectl set-hostname nginx
#关闭防火墙与核心防护
[root@nginx ~]# setenforce 0
[root@nginx ~]# systemctl stop firewalld
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
上传软件包到/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 '//后台启动'