小伙伴儿们,如果觉得文章干货满满,欢迎加入公众号【编程识堂】,更多干货等着你们来哦!
ELK+Filebeat介绍
ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称(但是后期出现的filebeat(beats中的一种)可以用来替代logstash的数据收集功能,比较轻量级)。市面上也被成为Elastic Stack。
Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 Logstash进行索引。Filebeat的工作方式如下:启动Filebeat时,它将启动一个或多个输入,这些输入将在为日志数据指定的位置中查找。对于Filebeat所找到的每个日志,Filebeat都会启动收集器。每个收集器都读取单个日志以获取新内容,并将新日志数据发送到libbeat,libbeat将聚集事件,并将聚集的数据发送到为Filebeat配置的输出。
Logstash是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。Logstash能够动态地采集、转换和传输数据,不受格式或复杂度的影响。利用Grok从非结构化数据中派生出结构,从IP地址解码出地理坐标,匿名化或排除敏感字段,并简化整体处理过程。
Elasticsearch是Elastic Stack核心的分布式搜索和分析引擎,是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。Elasticsearch为所有类型的数据提供近乎实时的搜索和分析。无论您是结构化文本还是非结构化文本,数字数据或地理空间数据,Elasticsearch都能以支持快速搜索的方式有效地对其进行存储和索引。
Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。并且可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以汇总、分析和搜索重要数据日志。还可以让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板(dashboard)实时显示Elasticsearch查询动态。
组件流程图
简单说明他们的关系就是:
- Filebeat负责收集应用写到磁盘上的日志,并将日志发送给Logstash。
- Logstash处理来自Filebeat的日志,并将处理后的日志保存到Elasticsearch索引库。
- Elasticsearch存储来自logstash的日志。
- Kbana从Elasticsearch搜索日志,并展示到页面。
与平常普通的ELK相比,Filebeat结合Logstash带来的优势:
- 水平可扩展性,高可用性和可变负载处理:filebeat和logstash可以实现节点之间的负载均衡,多个logstash可以实现logstash的高可用
- 消息持久性与至少一次交付保证:使用Filebeat或Winlogbeat进行日志收集时,可以保证至少一次交付。从Filebeat或Winlogbeat到Logstash以及从Logstash到Elasticsearch的两种通信协议都是同步的,并且支持确认。Logstash持久队列提供跨节点故障的保护。对于Logstash中的磁盘级弹性,确保磁盘冗余非常重要。
- 具有身份验证和有线加密的端到端安全传输:从Beats到Logstash以及从 Logstash到Elasticsearch的传输都可以使用加密方式传递 。与Elasticsearch进行通讯时,有很多安全选项,包括基本身份验证,TLS,PKI,LDAP,AD和其他自定义领域
- ELK结构因为需要在各个服务器上部署 Logstash,而它比较消耗 CPU 和内存资源,所以比较适合计算资源丰富的服务器,否则容易造成服务器性能下降,甚至可能导致无法正常工作。ELK+Filebeat架构解决了 Logstash 在各服务器节点上占用系统资源高的问题。相比 Logstash,Beats 所占系统的 CPU 和内存几乎可以忽略不计。
ELK部署
拉取镜像
docker pull elasticsearch:7.1.1
docker pull kibana:7.1.1
docker pull logstash:7.1.1
docker pull elastic/filebeat:7.1.1
创建容器
创建用户定义的网络(用于连接到同一网络的其他服务(例如 Kibana))
docker network create somenetwork
ES部署
docker run -d
--name 【创建的容器名】
--net 【网络名】
-p 【主机(宿主)端口】:【容器端口】
【本地镜像仓库下载的镜像名-REPOSITORY】:【需要的版本号-TAG】
docker run -d \
--name elasticsearch-7.17.0 \
-p 9200:9200 -p 9300:9300 \
--net somenetwork \
-e "discovery.type=single-node" \
elasticsearch:7.17.0
参数说明
–net somenetwork :加入一个名为 somenetwork 的网络中,同一个网络中可以相互访问
-e “discovery.type=single-node”:单点模式启动
-p 9200:9200 -p 9300:9300 :端口映射配置
es十分耗内存:通过docker stats 查看发现资源消耗很大
我们可以通过增加内存限制来控制
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms4g -Xmx4g" -e "discovery.type=single-node" \
-v /usr/local/elk/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:7.1.1
通过curl 127.0.0.1:9200 测试elasticsearch是否安装成功
kibana配置
docker images|grep 'kibana'
# 启动容器
docker run -d --name kibana --net somenetwork -p 5601:5601 kibana:7.1.1
# 进入容器 查看配置文件
docker exec -it 67f17df6ca3e /bin/bash
# 将容器里的配置文件cp 到宿主机上 用于修改 并挂在
docker cp kibana:/usr/share/kibana/config/kibana.yml /usr/local/elk/kibana/kibana.yml
vim kibana.yml
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://192.168.5.217:9200" ] # 部署的es 192.168.5.217
xpack.monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: "zh-CN" # 汉化
# 重新启动kibana 容器
docker stop kibana
docker rm /kibana
docker run -d --name kibana --net somenetwork -p 5601:5601 \
-v /usr/local/elk/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.1.1
#查看 kibana 容器启动日志
docker logs -t -f kibana
#访问
192.168.5.217:5601
Logstash部署
docker images|grep 'logstash'
docker run -it -d -p 5044:5044 --name logstash --net somenetwork logstash:7.1.1
docker exec -it logstash /bin/bash
docker cp logstash:/usr/share/logstash/config /usr/local/elk/logstash/config
cd usr/local/elk/
mkdir conf.d
cd conf.d
vim my.conf
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["192.168.5.217:9200"]
index => "gs-%{+YYYY.MM}"
}
}
cd config/
vim logstash.yml
xpack.monitoring.elasticsearch.hosts: [ "http://192.168.5.217:9200" ]
#允许监控
xpack.monitoring.enabled: true
##目录为挂载目录,启动命令指定的
path.config: /usr/share/logstash/conf.d/my.conf
# 指定日志目录
path.logs: /data/log
# 启动logstash
docker run -it -d -p 5044:5044 --name logstash --net somenetwork \
-v /usr/local/elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml \
-v /usr/local/elk/logstash/conf.d/:/usr/share/logstash/conf.d/ logstash:7.1.1
Filebeat部署
docker run -d -u root --name filebeat --net somenetwork elastic/filebeat:7.1.1
docker images|grep 'filebeat'
#进入容器 查看配置
docker exec -it filebeat /bin/bash
#退出容器 将容器里的配置文件cp 到宿主机上 用于修改 并挂在
docker cp filebeat:/usr/share/filebeat/filebeat.yml /usr/local/elk/filebeat/filebeat.yml
filebeat.yml
# 定义info1应用的input类型、以及存放的具体路径
filebeat.inputs:
- type: log
enabled: true
paths:
- /data/log/om/omweb/*.log
fields:
index: gs-om-web
- type: log
enabled: true
paths:
- /data/log/om/tvapi/*.log
fields:
index: gs-om-tvapi
- type: log
enabled: true
paths:
- /data/log/om/mqServer/*.log
fields:
index: gs-om-mqServer
- type: log
enabled: true
paths:
- /data/log/om/provider/*.log
fields:
index: gs-om-provider
- type: log
enabled: true
paths:
- /data/log/om/family/*.log
fields:
index: gs-om-family
- type: log
enabled: true
paths:
- /data/log/om/omdeviceapi/*.log
fields:
index: gs-om-deviceapi
- type: log
enabled: true
paths:
- /data/log/user/web/*.log
fields:
index: gs-user-web
- type: log
enabled: true
paths:
- /data/log/user/wechat/*.log
fields:
index: gs-user-wechat
#============================= Filebeat modules ===============================
filebeat.config.modules:
# Glob pattern for configuration loading
path: ${path.config}/modules.d/*.yml
# Set to true to enable config reloading
reload.enabled: true
# ============================== logstash =====================================
output.logstash:
hosts: ["192.168.5.217:5044"] #192.168.5.217为logstash安装的服务器ip
enabled: true
#============================== Kibana =====================================
setup.kibana:
host: "192.168.5.217:5601"
#============================== elasticsearch =====================================
#output.elasticsearch:
# hosts: ["192.168.226.132:9200"]
# enabled: true
#启动 filebeat
docker run -d -u root --name filebeat --net somenetwork \
-v /data/log:/data/log:rw \
-v /usr/local/elk/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro elastic/filebeat:7.1.1
# 查看filebeat 日志
docker logs -t -f filebeat
展示效果