微服务系列之分布式日志系统ELK

小伙伴儿们,如果觉得文章干货满满,欢迎加入公众号【编程识堂】,更多干货等着你们来哦!

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查询动态。

组件流程图

微服务系列之分布式日志系统ELK_第1张图片
简单说明他们的关系就是:

  1. Filebeat负责收集应用写到磁盘上的日志,并将日志发送给Logstash。
  2. Logstash处理来自Filebeat的日志,并将处理后的日志保存到Elasticsearch索引库。
  3. Elasticsearch存储来自logstash的日志。
  4. Kbana从Elasticsearch搜索日志,并展示到页面。

与平常普通的ELK相比,Filebeat结合Logstash带来的优势:

  1. 水平可扩展性,高可用性和可变负载处理:filebeat和logstash可以实现节点之间的负载均衡,多个logstash可以实现logstash的高可用
  2. 消息持久性与至少一次交付保证:使用Filebeat或Winlogbeat进行日志收集时,可以保证至少一次交付。从Filebeat或Winlogbeat到Logstash以及从Logstash到Elasticsearch的两种通信协议都是同步的,并且支持确认。Logstash持久队列提供跨节点故障的保护。对于Logstash中的磁盘级弹性,确保磁盘冗余非常重要。
  3. 具有身份验证和有线加密的端到端安全传输:从Beats到Logstash以及从 Logstash到Elasticsearch的传输都可以使用加密方式传递 。与Elasticsearch进行通讯时,有很多安全选项,包括基本身份验证,TLS,PKI,LDAP,AD和其他自定义领域
  4. 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 查看发现资源消耗很大
image.png
image.png
我们可以通过增加内存限制来控制

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是否安装成功
微服务系列之分布式日志系统ELK_第2张图片

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

展示效果

微服务系列之分布式日志系统ELK_第3张图片
微服务系列之分布式日志系统ELK_第4张图片

你可能感兴趣的:(微服务,微服务,分布式,elk,elasticsearch)