构建ELK+Filebeat+kafka+zookeeper大数据日志分析平台

|---------------|------|-----------|-------------------------------|
| 主机IP | 角色 | 所属服务层 | 部署服务 |
| 192.168.11.11 | 日志生产 | 采集层 | filebeat |
| 192.168.11.12 | 日志缓存 | 数据处理层、缓存层 | Zookeeper+kafka+logstash |
| 192.168.11.13 | 日志缓存 | 数据处理层、缓存层 | Zookeeper+kafka+logstash |
| 192.168.11.14 | 日志展示 | 持久、检索、展示层 | Logstash+elasticsearch+kibana |

数据流向 filebeat---->logstash---->kafka---->logstash---->elasticsearch

第一层:数据采集层

最左边的是业务服务器集群,上面安装了filebeat做日志采集,同时把采集的日志分别发送给两个logstash服务

第二层:数据处理层,数据缓存层

logstash服务把接收到的日志经过格式处理,转存到本地的kafka broker+zookeeper集群中

第三层:数据转发层

单独的logstash节点会实时去kafka broker集群拉数据,转发至ES DataNode

第四层:数据持久化存储

ES DataNode会把收到的数据,写磁盘,建索引库

第五层:数据检索,数据展示

ES Master + Kibana主要协调ES集群,处理数据检索请求,数据展示

部署ELK

ELK集群部署(略)

ELK集群配置

(1)配置logstash

[root@zookeeper01 ~]# cd /data/program/software/logstash
[root@zookeeper01 logstash]# cat conf.d/logstash_to_es.conf
input {
    kafka {
        bootstrap_servers => "192.168.11.12:9092,192.168.11.13:9092"
        topics => ["ecplogs"]
    }
}
output {
    elasticsearch {
        hosts => ["192.168.11.12:9200","192.168.11.13:9200"]
        index => "dev-log-%{+YYYY.MM.dd}"
    }
}

注: ecplogs字段是kafka的消息主题,后边在部署kafka后需要创建

部署zookeeper+kafka+logstash

1、部署zookeeper集群
[webapp@localhost ~]$ tar -xzf zookeeper-3.4.9.tar.gz -C /data/webapp/

[webapp@localhost ~]$ cd /data/webapp/zookeeper-3.4.9/conf/

[webapp@localhost conf]$ cp zoo_sample.cfg zoo.cfg

[webapp@localhost conf]$ vim zoo.cfg

dataDir=/data/webapp/zookeeper-3.4.9/zookeeper

server.1=192.168.11.12:12888:13888

server.2=192.168.11.13:12888:13888

[webapp@localhost conf]$ echo 1 > /data/webapp/zookeeper-3.4.9/zookeeper/myid

注:在另外一台配置文件相同,只需要将myid重置为2

[webapp@localhost conf]$ echo 2 > /data/webapp/zookeeper-3.4.9/zookeeper/myid
2、启动zookeeper服务(在两台服务器中都启动)
[webapp@localhost zookeeper-3.4.9]$ bin/zkServer.sh start
2.1、查看两台zookeeper集群状
[webapp@localhost zookeeper-3.4.9]$ bin/zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /data/webapp/zookeeper-3.4.9/bin/../conf/zoo.cfg

Mode: follower

[webapp@localhost zookeeper-3.4.9]$ bin/zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /data/webapp/zookeeper-3.4.9/bin/../conf/zoo.cfg

Mode: leader
3、配置kafka集群
[webapp@localhost ~]$ tar -xzf kafka_2.11-0.10.1.1.tgz -C /data/webapp/

[webapp@localhost ~]$ cd /data/webapp/kafka_2.11-0.10.1.1/config/

[webapp@localhost config]$ vim server.properties

broker.id=1

port = 9092

host.name = 192.168.11.12

log.dirs=/data/webapp/kafka-logs

log.retention.hours=1

zookeeper.connect=192.168.11.12:2181,192.168.11.13:2181

default.replication.factor=2

注:两台集群配置只需要将broker.id、host.name进行修改,其它一致。

[webapp@localhost config]$ vim server.properties

broker.id=2

host.name = 192.168.11.13
4、启动kafka集群(在两台服务器中都启动)
[webapp@localhost kafka_2.11-0.10.1.1]$ bin/kafka-server-start.sh -daemon config/server.properties
4.1、创建消息主题
[webapp@localhost kafka_2.11-0.10.1.1]$ bin/kafka-topics.sh --create --zookeeper 192.168.11.11:2181 --replication-factor 1 --partitions 2 --topic ecplogs
4.2、测试消息生产与消费

在主机192.168.11.13上进行消息消费

[webapp@localhost kafka_2.11-0.10.1.1]$ /data/webapp/kafka_2.11-0.10.1.1/bin/kafka-console-consumer.sh --zookeeper 192.168.11.11:2181 --topic ecplogs --from-beginning

在主机192.168.11.12上进行消息生产:

[webapp@localhost kafka_2.11-0.10.1.1]$ bin/kafka-console-producer.sh --broker-list 192.168.11.11:9092 --topic ecplogs

在此终端中输入数据,会在192.168.11.13终端上进行显示出来。那么kafka功能正常。

5、配置logstash
5.1配置logstash的配置文件
[webapp@localhost ~]$ tar -xzf logstash-5.2.0.tar.gz -C /data/webapp/

[webapp@localhost ~]$ cd /data/webapp/logstash-5.2.0/config/

[webapp@localhost config]$ vim logstash_in_filebeat.conf

input {

    beats {

        port => 5044

        }

}

output {

    kafka {

        bootstrap_servers => "192.168.11.12:9092,192.168.11.13:9092"

        topic_id => "ecplogs"

        }

}
6、各环节服务启动与数据追踪

(1)启动zookeeper及kafka集群

[root@zookeeper01 ~]# cd /data/program/software/zookeeper
[root@zookeeper01 zookeeper]# bin/zkServer.sh start
[root@zookeeper01 ~]# cd /data/program/software/kafka
[root@zookeeper01 kafka]# nohup bin/kafka-server-start.sh config/server.properties >>/tmp/kafka.nohup &
[root@zookeeper01 ~]# netstat -tunlp|egrep "(2181|9092)"
#在3个节点上执行

(2)启动elasticsearch

highlighter-hljs 复制代码
[root@zookeeper01 ~]su - elsearch -c "/data/program/software/elasticsearch/bin/elasticsearch -d"
#在3个节点上执行

http://192.168.213.128:9200
查看elasticsearch+zookeeper集群状态
http://192.168.213.128:9200/_cat/nodes?pretty


(2)启动nodejs

highlighter-hljs 复制代码
[root@zookeeper01 ~]# cd /data/program/software/elasticsearch/elasticsearch-head
[root@zookeeper01 elasticsearch-head]# grunt server &

http://192.168.213.128:9100

(3)启动kibana

highlighter-hljs 复制代码
[root@zookeeper01 ~]# cd /data/program/software/kibana
[root@zookeeper01 kibana]# nohup bin/kibana >>/tmp/kibana.nohup &
[root@zookeeper01 kibana]# netstat -tunlp|grep 5601

http://192.168.213.128:5601

(5)启动logstash

highlighter-hljs 复制代码
[root@zookeeper01 ~]# cd /data/program/software/logstash
[root@zookeeper01 logstash]# nohup bin/logstash -f conf.d/logstash_to_filebeat.conf >>/tmp/logstash.nohup &

(6)启动filebeat

highlighter-hljs 复制代码
[root@zookeeper01 ~]# cd /data/program/software/filebeat
[root@zookeeper01 filebeat]# nohup ./filebeat -e -c nginx.yml >>/tmp/filebeat.nohup &
[root@zookeeper01 filebeat]# ps -ef|grep filebeat

(7)在kafka终端上进行日志消费

highlighter-hljs 复制代码
[root@zookeeper03 ~]# cd /data/program/software/kafka
[root@zookeeper03 kafka]# bin/kafka-console-consumer.sh --bootstrap-server 192.168.213.136:9092 --topic ecplogs --from-beginning

访问zookeeper01产生nginx日志,在kafka终端上会有实时日志消息,则filebeat---->logstash---->kafka 数据流转正常

highlighter-hljs 复制代码
[root@zookeeper02 ~]# curl -I 192.168.213.128
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Tue, 14 Apr 2020 05:22:07 GMT
Content-Type: text/html
Content-Length: 4833
Last-Modified: Fri, 16 May 2014 15:12:48 GMT
Connection: keep-alive
ETag: "53762af0-12e1"
Accept-Ranges: bytes


(8)启动logstash转发

highlighter-hljs 复制代码
[root@zookeeper01 ~]# cd /data/program/software/logstash
[root@zookeeper01 logstash]# nohup bin/logstash -f conf.d/logstash_to_es.conf >>/tmp/logstash_to_es.nohup &

(9)elasticsearch数据展示
(10)kibana数据展示

踩坑记录

(1)logstash-6.6.1版本不支持同时运行多个实例
[FATAL] [logstash. runner] Logstash could not be started because there is already another instance using the configured data directory. If you wish to run multiple instances, you must change the "path.data" setting.

原因:logstash-6.6.1版本不支持同时运行多个实例,前一个运行的instance在path.data里面有.lock文件

网上大多数的解决办法是删除其data目录下的.lock文件,但这并不能解决问题,我们需要conf.d/logstash_to_filebeat.confconf.d/logstash_to_es.conf同时在线运行以保证实时日志统计展示,所以采用了百度出来的另一个方法,直接运行 nohup bin/logstash -f conf.d/ >>/tmp/logstash.nohup &,这样虽然运行没报错,但会使数据采集异常,疯狂输出没有用的数据

实测ELK(elasticsearch+logstash+kibana)6.6.1版本按本教程搭建的平台数据收集异常

单独测试filebeat---->logstash---->kafka数据流转正常;

单独测试kafka---->logstash---->elasticsearch数据流转正常;

整体测试数据流转异常,采集到的数据并非是nginx的日志,且不停的输出,不及时暂停filebeat或logstash会导致无用数据占用磁盘空间庞大。

(2)将ELK版本回退部署后集群状态异常
http://192.168.213.128:9200/_cat/nodes?pretty
查看集群状态为503

highlighter-hljs 复制代码
{
  "error" : {
    "root_cause" : [ {
      "type" : "master_not_discovered_exception",
      "reason" : null
    } ],
    "type" : "master_not_discovered_exception",
    "reason" : null
  },
  "status" : 503
}

查看日志,发现master没有选举成功,而且3个节点的"cluster_uuid" : "_na_"都相同(异常)

原因:把elasticsearch复制到其他节点时 ,elk_data下的运行数据也拷贝过去了

解决办法: 把elk_data目录下的内容删除,重启elasticsearch

严禁按旧版本的教程用新版本的软件做实例,这无异于自己挖坑自己跳

相关推荐
栗子~~4 小时前
docker-compose的方式搭建 kafka KRaft 模式集群
docker·kafka·linq
大秦王多鱼6 小时前
Kafka 副本机制(包含AR、ISR、OSR、HW 和 LEO 介绍)
分布式·kafka·apache
大秦王多鱼14 小时前
Kafka运维宝典 (四)- Kafka 常用命令介绍
运维·分布式·kafka
大秦王多鱼14 小时前
Kafka常见问题之Kafka 报错:org.apache.kafka.common.errors.NotLeaderOrFollowerException
分布式·kafka
费曼乐园14 小时前
Kafka后台启动命令
kafka
xiao-xiang20 小时前
kafka-保姆级配置说明(consumer)
分布式·kafka
运维实战课程1 天前
elk(都是6.2.4重点-版本2-收集nginx日志并分析绘图(单点es,redis缓存)-无filebeat
nginx·elk·缓存
小信丶2 天前
SpringBoot使用Kafka如何保证消息不丢失
spring boot·后端·kafka
掘金-我是哪吒2 天前
分布式微服务系统架构第87集:kafka
分布式·微服务·架构·kafka·系统架构
黄名富2 天前
Kafka 深入服务端 — 时间轮
java·数据结构·分布式·zookeeper·kafka