搭建日志系统ELK(二)
架构设计
在搭建以ELK
为核心的日志系统时,Logstash
作为日志采集的核心组件,负责将各个服务的日志数据采集、清洗、过滤。然而缺点也很明显:
- 占用较多的服务器资源。
- 配置复杂,学习曲线陡峭。
- 处理大数据量时性能下降。
在我们设计架构时,尽量会选择减少主机使用资源,轻量,高性能,又能满足日志采集的需求。有没有这么一个开源服务呢?答案便是go-stash
。
特性/服务 | logstash | go-stash |
---|---|---|
定义 | ElasticStack 的一部分,用于日志收集和处理。 | 高效的数据处理和存储工具,Go 语言实现。 |
性能 | 灵活性高,但可能在处理大数据量时性能下降。 | 高吞吐量,性能是 logstash 的5倍左右 |
资源消耗 | 占用较多的服务器资源。 | 节省了2/3的服务器资源。 |
易用性 | 配置复杂,学习曲线陡峭。 | 易用性高,配置更简洁直观。 |
过滤器系统 | 强大的过滤器系统,支持多种数据处理方式。 | 内置一套丰富的过滤器,允许自定义处理逻辑。 |
架构图
各服务功能
- filebeat:
Filebeat
是用于转发和集中日志数据的轻量级传送工具。Filebeat
监视您指定的日志文件或位置,收集日志事件,并将它们转发到kafka
进行索引。 - Kafka:
Kafka
是一个分布式的基于发布/订阅模式的消息队列(Message Queue
),主要应用于大数据实时处理领域。 - go-stash:
go-stash
是一个高效的从Kafka
获取,根据配置的规则进行处理,然后发送到ElasticSearch
集群的工具。 - Elasticsearch:一个基于
Lucene
的搜索引擎,提供快速的全文搜索能力,适合处理大规模数据集,并且具备高可扩展性。 - Kibana:一个开源的数据分析和可视化平台,能够让用户通过图表、地图等各种方式直观地理解
Elasticsearch
中的数据。
流程概述
日志数据的流动遵循从产生到消费的流程。
- 使用
docker
部署的服务容器,服务产生的日志以json
格式会存储在/var/lib/docker/containers/**/*-json.log
- 部署
filebeat
服务,采集容器日志并将它们转发到kafka
进行索引 go-stash
是一个高效的从Kafka
获取,根据配置的规则进行处理,然后发送到ElasticSearch
集群中进行索引和存储。Kibana
作为前端界面,从Elasticsearch
检索数据,并提供数据可视化。
部署
文件目录
log-collect
|-- deploy
| |-- filebeat
| | -- conf
| | -- filebeat.yml
| -- go-stash
| -- etc
| -- config.yaml
|-- docker-compose.yaml
配置文件
filebeat.yml
filebeat.inputs:- type: logenabled: truepaths:- /var/lib/docker/containers/*/*-json.logfilebeat.config:modules:path: ${path.config}/modules.d/*.ymlreload.enabled: falseprocessors:- add_cloud_metadata: ~- add_docker_metadata: ~output.kafka:enabled: truehosts: ["kafka:9092"]#要提前创建topictopic: "openui-log"partition.hash:reachable_only: truecompression: gzipmax_message_bytes: 1000000required_acks: 1
go-stash.yml
Clusters:- Input:Kafka:Name: gostashBrokers:- "kafka:9092"Topics:- openui-logGroup: proConsumers: 16Filters:- Action: dropConditions:- Key: k8s_container_nameValue: "-rpc"Type: contains- Key: levelValue: infoType: matchOp: and- Action: remove_fieldFields:# - message- _source- _type- _score- _id- "@version"- topic- index- beat- docker_container- offset- prospector- source- stream- "@metadata"- Action: transferField: messageTarget: dataOutput:ElasticSearch:Hosts:- "http://elasticsearch:9200"Index: "openui-{{yyyy-MM-dd}}"Username: "elastic"Password: "tester"
部署
docker-compose.yaml
version: '3'services:elasticsearch:image: elasticsearch:7.13.4container_name: elasticsearchuser: rootenvironment:- discovery.type=single-node- "ES_JAVA_OPTS=-Xms512m -Xmx512m"- TZ=Asia/Shanghaivolumes:- ./data/elasticsearch/data:/usr/share/elasticsearch/data- ./data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.ymlrestart: alwaysports:- 9200:9200- 9300:9300networks:- openui_net#查看elasticsearch数据 - Kibana to view Elasticsearch datakibana:image: kibana:7.13.4container_name: kibanaenvironment:- elasticsearch.hosts=http://elasticsearch:9200- elasticsearch.username="elastic"- elasticsearch.password="tester"- TZ=Asia/Shanghairestart: alwaysnetworks:- openui_netports:- "5601:5601"depends_on:- elasticsearch#elasticsearch UIelastichd:container_name: elastichdimage: containerize/elastichdrestart: alwaysnetworks:- openui_netports:- "9800:9800"depends_on:- elasticsearchkafka-ui:container_name: kafka-uiimage: provectuslabs/kafka-ui:latestports:- 9090:8080environment:DYNAMIC_CONFIG_ENABLED: 'true'KAFKA_CLUSTERS_0_NAME: kafka-workKAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092depends_on:- kafkanetworks:- openui_net#消费kafka中filebeat收集的数据输出到es - The data output collected by FileBeat in Kafka is output to ESgo-stash:image: eilinge/go-stash # golang:v1.22container_name: go-stashenvironment:# 时区上海 - Time zone Shanghai (Change if needed)TZ: Asia/Shanghaiuser: rootrestart: alwaysvolumes:- ./deploy/go-stash/etc:/app/etcnetworks:- openui_netdepends_on:- elasticsearch- kafka#收集业务数据 - Collect business datafilebeat:image: elastic/filebeat:7.13.4container_name: filebeatenvironment:# 时区上海 - Time zone Shanghai (Change if needed)TZ: Asia/Shanghaiuser: rootrestart: alwaysentrypoint: "filebeat -e -strict.perms=false" #解决配置文件权限问题 - Solving the configuration file permissionsvolumes:- ./deploy/filebeat/conf/filebeat.yml:/usr/share/filebeat/filebeat.yml- /var/lib/docker/containers:/var/lib/docker/containersnetworks:- openui_netdepends_on:- kafka#zookeeper是kafka的依赖 - Zookeeper is the dependencies of Kafkazookeeper:image: wurstmeister/zookeepercontainer_name: zookeeperenvironment:# 时区上海 - Time zone Shanghai (Change if needed)TZ: Asia/Shanghairestart: alwaysports:- 2181:2181networks:- openui_net#消息队列 - Message queuekafka:image: wurstmeister/kafkacontainer_name: kafkaports:- 9092:9092environment:- KAFKA_ADVERTISED_HOST_NAME=kafka- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181- KAFKA_AUTO_CREATE_TOPICS_ENABLE=false- TZ=Asia/Shanghairestart: alwaysvolumes:- /var/run/docker.sock:/var/run/docker.socknetworks:- openui_netdepends_on:- zookeepernetworks:openui_net:driver: bridgeipam:config:- subnet: 172.16.0.0/16
环境服务搭建
[root@master log-collect]# docker-compose ps
NAME COMMAND SERVICE STATUS PORTS
elastichd "ElasticHD" elastichd running 0.0.0.0:9800->9800/tcp, :::9800->9800/tcp
elasticsearch "/bin/tini -- /usr/l…" elasticsearch running 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9200->9200/tcp, :::9300->9300/tcp
filebeat "filebeat -e -strict…" filebeat running
go-stash "./stash -f etc/conf…" go-stash running
kafka "start-kafka.sh" kafka running 0.0.0.0:9092->9092/tcp, :::9092->9092/tcp
kafka-ui "/bin/sh -c 'java --…" kafka-ui running 0.0.0.0:9090->8080/tcp, :::9090->8080/tcp
kibana "/bin/tini -- /usr/l…" kibana running 0.0.0.0:5601->5601/tcp, :::5601->5601/tcp
zookeeper "/bin/sh -c '/usr/sb…" zookeeper running 0.0.0.0:2181->2181/tcp, :::2181->2181/tcp
检查各服务是否正常运行
elastic-cluster
kafka-cluster
kafka-topic
kibana
劣势分析
通过部署文件,很明显的存在一些劣势:
- 依赖性过高: 容器之间各自负责不同的功能,学习成本增加。
- 资源消耗:每个容器可能需要额外的资源,如内存和CPU。
- 复杂性:容器编排和管理需要一定的学习和运维成本。
- 网络配置:容器间的网络通信需要合理配置,以确保数据流畅。
ISSUE
在上述部署的过程,也不是一番风顺,有些错误对一个接触相关服务较少的同学而言,就容易退缩。还好出现的常见问题在网上都能找到解决方法,主要还是需要我们保持一颗热爱学习的心
。
-
Kibana的Stack Monitoring显示节点offline
-
ElasticSearch+Kibana设置用户名密码
-
ES开启密码安全认证后,elastichd的连接方式
-
go-stash 依赖
json-iterator
版本较低
使用我基于golang:v1.22
最新构建的go-stash
镜像 -
elasticSearch 文件权限不足,启动失败
项目地址
Log-Collect