上一节写了最简单架构的搭建和日志采集:传送门
主要有这几种架构方式
1. Elasticsearch + Logstash + Kibana
每台机器(客户端)上部署Logstash,logstash收集了数据直接往es里面写,es分析日志,kibana查询es的数据做展示。
这是一种最简单的架构。这种架构虽然是官网介绍里的方式,但是往往在生产中很少使用。因为这样要在每台机器上都部署logstash,资源消耗比较大。
2. Elasticsearch + Logstash + filebeat + Kibana
每台机器(客户端)上部署filebeat收集数据,filebeat往1台logstash里面写,logstash往es里面写,es分析日志,kibana查询es的数据做展示。
与上一种架构相比,这种架构增加了一个filebeat模块。filebeat是一个轻量的日志收集代理,优势是消耗非常少的资源(较logstash), 所以生产中,往往会采取这种架构方式,但是这种架构有一个缺点,当logstash出现故障, 会造成日志的丢失。
3. Elasticsearch + Logstash + filebeat + kafka(也可以是其他中间件,比如RabbitMQ) + Kibana
每台机器(客户端)上部署filebeat收集数据,filebeat往消息中间件集群写,1台logstash消费消息中间件集群然后往es里面写,es分析日志,kibana查询es的数据做展示。
这种架构是上面那个架构的完善版,通过增加中间件,来避免数据的丢失。当Logstash出现故障,日志还是存在中间件中,当Logstash再次启动,则会读取中间件中积压的日志。
本节还是基于上一节的简单架构增加 filebeat和kafka组件完善
1. 下载镜像
# zookeeper镜像
docker pull wurstmeister/zookeeper
# kafka镜像
docker pull wurstmeister/kafka
2. 启动ZK
docker run -d --name zookeeper -p 2181:2181 wurstmeister/zookeeper
3. 启动kafka
docker run -d --name kafka \
--env KAFKA_ADVERTISED_HOST_NAME=localhost \
--env KAFKA_ZOOKEEPER_CONNECT=10.33.2.23:2181 \
--env KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://10.33.2.23:9092 \
--env KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
--env KAFKA_HEAP_OPTS="-Xmx256M -Xms128M" \
--net=host wurstmeister/kafka
10.33.2.23 是服务器ip
4. 验证kafka是否生效
进入kafka容器
docker exec -it kafka /bin/bash
cd /opt/kafka_2.12-2.2.0/bin/
新建一个test主题,并以生产者身份进行消息生产
./kafka-topics.sh --create --zookeeper 10.30.2.222:2181 --replication-factor 1 --partitions 1 --topic test
./kafka-console-producer.sh --broker-list 10.30.2.222:9092 --topic test
>hello # 发送一条消息并回车
>world
打开一个新的ssh连接,同样进入kafka容器,模拟消费者接收消息
docker exec -it kafka /bin/bash
cd /opt/kafka_2.12-2.2.0/bin/
# 以消费者身份接收消息
./kafka-console-consumer.sh --bootstrap-server 10.30.2.222:9092 --topic test --from-beginning
hello # 成功接收到消息
world
5. 安装Filebeat
docker pull elastic/filebeat:6.4.1 #拉取镜像
启动filebeat
docker run -d --name=filebeat elastic/filebeat:6.4.1
拷贝文件赋予权限,/home/images/elk_single/filebeat/为自己新建的文件夹,自行修改
docker cp filebeat:/usr/share/filebeat /home/images/elk_single/filebeat/
chmod 777 -R /home/images/elk_single/filebeat
chmod go-w /home/images/elk_single/filebeat/filebeat/filebeat.yml
修改配置文件filebeat.yml ,/home/application/logs/springboot.log为宿主机日志路径,
topic: 'elk-%{[fields][log_topics]}' , 则是输出的topic的名称 例如对于第一个则topic的名称为
elk-springboot-test-application
filebeat.inputs:
- type: log
enabled: true
paths:
- /home/application/logs/springboot.log
fields:
log_topics: springboot-test-application
- type: log
enabled: true
paths:
- /home/image/nginx/access.log
fields:
log_topics: nginx
output.kafka:
hosts: ["10.1.2.3:9200"]
topic: 'elk-%{[fields][log_topics]}'
启动filebeat,将要收集的日志目录从外面挂进来
docker run -d --name=filebeat -v /home/images/elk_single/filebeat/filebeat:/usr/share/filebeat -v /home/application/logs/:/home/application/logs elastic/filebeat:6.4.1
修改logstash配置文件,input设置为kafka输入
input {
kafka{
bootstrap_servers => "10.1.2.3:9092"
topics_pattern => "elk-.*"
consumer_threads => 5
decorate_events => true
codec => "json"
auto_offset_reset => "latest"
}
}
output {
elasticsearch {
hosts => "es:9200"
index => "logstash-%{+YYYY.MM.dd}"
}
}
然后向日志文件里加东西试试,启动一个kafka的消费者消费到就成功了
echo "我是日志" >> /home/application/logs/springboot.log