关于程序员:微服务架构中使用-ELK-进行日志采集以及统一处理

6次阅读

共计 10274 个字符,预计需要花费 26 分钟才能阅读完成。

微服务各个组件的相干实际会波及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮忙咱们构建更加强壮的微服务零碎,并帮忙排查解决微服务零碎中的问题与性能瓶颈等。

image.png
咱们将重点介绍微服务架构中的日志收集计划 ELK(ELK 是 Elasticsearch、Logstash、Kibana 的简称),精确的说是 ELKB,即 ELK + Filebeat,其中 Filebeat 是用于转发和集中日志数据的轻量级传送工具。

一、为什么须要分布式日志零碎
在以前的我的项目中,如果想要在生产环境须要通过日志定位业务服务的 bug 或者性能问题,则须要运维人员应用命令挨个服务实例去查问日志文件,导致的后果是排查问题的效率非常低。

微服务架构下,服务多实例部署在不同的物理机上,各个微服务的日志被扩散贮存不同的物理机。集群足够大的话,应用上述传统的形式查阅日志变得十分不适合。因而须要集中化治理分布式系统中的日志,其中有开源的组件如 syslog,用于将所有服务器上的日志收集汇总。

然而集中化日志文件之后,咱们面临的是对这些日志文件进行统计和检索,哪些服务有报警和异样,这些须要有具体的统计。所以在之前呈现线上故障时,常常会看到开发和运维人员下载了服务的日志,基于 Linux 下的一些命令,如 grep、awk 和 wc 等,进行检索和统计。这样的形式效率低,工作量大,且对于要求更高的查问、排序和统计等要求和宏大的机器数量仍然应用这样的办法不免有点力不从心。

二、ELKB 分布式日志零碎
ELKB 是一个残缺的分布式日志收集零碎,很好地解决了上述提到的日志收集难,检索和剖析难的问题。ELKB 别离是指 Elasticsearch、Logstash、Kibana 和 Filebeat。elastic 提供的一整套组件能够看作为 MVC 模型,logstash 对应逻辑管制 controller 层,Elasticsearch 是一个数据模型 model 层,而 Kibana 则是视图 view 层。logstash 和 Elasticsearch 基于 Java 编写实现,Kibana 则应用的是 node.js 框架。

image.png
上面顺次介绍这几个组件的性能,以及在日志采集零碎中的作用。

三、Elasticsearch 的装置与应用
Elasticsearch 是实时全文搜寻和剖析引擎,提供收集、剖析、存储数据三大性能;是一套凋谢 REST 和 JAVA API 等构造提供高效搜寻性能,可扩大的分布式系统。它构建于 Apache Lucene 搜索引擎库之上。

Elasticsearch 能够用于搜寻各种文档。它提供可扩大的搜寻,具备靠近实时的搜寻,并反对多租户,能胜任上百个服务节点的扩大,并反对 PB 级别的结构化或者非结构化数据。

Elasticsearch 是分布式的,这意味着索引能够被分成分片,每个分片能够有 0 个或多个正本。每个节点托管一个或多个分片,并充当协调器将操作委托给正确的分片。再均衡和路由是主动实现的。相干数据通常存储在同一个索引中,该索引由一个或多个主分片和零个或多个复制分片组成。一旦创立了索引,就不能更改主分片的数量。

Elasticsearch 是一个实时的分布式搜寻剖析引擎,它被用作全文检索、结构化搜寻、剖析以及这三个性能的组合, 它是面向文档 的,意味着它存储整个对象或 文档。Elasticsearch 不仅存储文档,而且 索引每个文档的内容使之能够被检索。在 Elasticsearch 中,你 对文档进行索引、检索、排序和过滤 – 而不是对行列数据。

为了不便,咱们间接应用应用 docker 装置 Elasticsearch:

$ docker run -d –name elasticsearch docker.elastic.co/elasticsearch/elasticsearch:5.4.0
须要留神的是,Elasticsearch 启动之后须要进行简略的设置,xpack.security.enabled 默认是开启的,为了不便,勾销登录认证。咱们登入到容器外部,执行如下的命令:

进入启动好的容器

$ docker exec -it elasticsearch bash

编辑配置文件

$ vim config/elasticsearch.yml
cluster.name: “docker-cluster”
network.host: 0.0.0.0
http.cors.enabled: true

http.cors.allow-origin: “*”
xpack.security.enabled: false

minimum_master_nodes need to be explicitly set when bound on a public IP

set to 1 to allow single node clusters

Details: https://github.com/elastic/el…

discovery.zen.minimum_master_nodes: 1
批改好配置文件之后,退出容器,重启容器即可。咱们为了前面应用时可能保留配置,须要从该容器创立一个新的镜像。首先获取到该容器对应的 ContainerId。而后基于该容器提交成一个新的镜像。

$ docker commit -a “add config” -m “dev” a404c6c174a2 es:latest
sha256:5cb8c995ca819765323e76cccea8f55b423a6fa2eecd9c1048b2787818c1a994
这样咱们失去了一个新的镜像 es:latest。咱们运行新的镜像:

docker run -d –name es -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” es:latest
通过拜访 Elasticsearch 提供的内置端点,咱们查看是否装置胜利。

[root@VM_1_14_centos ~]# curl ‘http://localhost:9200/_nodes/…
{
“_nodes” : {

"total" : 1,
"successful" : 1,
"failed" : 0

},
“cluster_name” : “docker-cluster”,
“nodes” : {

"8iH5v9C-Q9GA3aSupm4caw" : {
  "name" : "8iH5v9C",
  "transport_address" : "10.0.1.14:9300",
  "host" : "10.0.1.14",
  "ip" : "10.0.1.14",
  "version" : "5.4.0",
  "build_hash" : "780f8c4",
  "roles" : [
    "master",
    "data",
    "ingest"
  ],
  "attributes" : {"ml.enabled" : "true"},
  "http" : {
    "bound_address" : ["[::]:9200"
    ],
    "publish_address" : "10.0.1.14:9200",
    "max_content_length_in_bytes" : 104857600
  }
}

}
}
能够看到,咱们胜利装置了 Elasticsearch,Elasticsearch 作为日志数据信息的存储源,为咱们提供了高效的搜寻性能。

咱们另外还装置了 Elasticsearch 的可视化工具:elasticsearch-head。装置办法很简答:

$ docker run -p 9100:9100 mobz/elasticsearch-head:5
elasticsearch-head 用于监控 Elasticsearch 状态的客户端插件,包含数据可视化、执行增删改查操作等。

装置之后的界面如下所示:

image.png
四、logstash 的装置与应用
logstash 是一个数据分析软件,次要目标是剖析 log 日志。其应用的原理如下所示:

image.png
数据源首先将数据传给 logstash,咱们这里应用的是 Filebeat 传输日志数据。它次要的组成部分有 Input 数据输出、Filter 数据源过滤和 Output 数据输入三局部。

logstash 将数据进行过滤和格式化(转成 JSON 格局),而后发送到 Elasticsearch 进行存储,并建搜寻的索引,Kibana 提供前端的页面视图,能够在页面进行搜寻,使得后果变成图表可视化。

上面咱们开始装置应用 logstash。首先下载解压 logstash:

下载 logstash

$ wget https://artifacts.elastic.co/…

解压 logstash

$ tar -zxvf logstash-5.4.3.tar.gz
下载速度可能比较慢,能够抉择国内的镜像源。解压胜利之后,咱们须要配置 logstash,次要就是咱们所提到的输出、输入和过滤。

[root@VM_1_14_centos elk]# cat logstash-5.4.3/client.conf
input {

beats {
    port => 5044
    codec => "json"
}

}
output {

elasticsearch {hosts => ["127.0.0.1:9200"]
    index => "logstash-app-error-%{+YYYY.MM.dd}"
}
stdout {codec => rubydebug}

}
输出反对文件、syslog、beats,咱们在配置时只能抉择其中一种。这里咱们配置了 filebeats 形式。

过滤则用于解决一些特定的行为来,解决匹配特定规定的事件流。常见的 filters 有 grok 解析无规则的文字并转化为有构造的格局、geoip 增加地理信息、drop 抛弃局部事件 和 mutate 批改文档等。如下是一个 filter 应用的示例:

filter {
#定义客户端的 IP 是哪个字段
geoip {

source => "clientIp"

}
}
输入反对 Elasticsearch、file、graphite 和 statsd,默认状况下将过滤扣的数据输入到 Elasticsearch,当咱们不须要输入到 ES 时须要特地申明输入的形式是哪一种,同时反对配置多个输入源。

一个 event 能够在处理过程中通过多重输入,然而一旦所有的 outputs 都执行完结,这个 event 也就实现生命周期。

咱们在配置中,将日志信息输入到 Elasticsearch。配置文件搞定之后,咱们开始启动 logstash:

$ bin/logstash -f client.conf
Sending Logstash’s logs to /elk/logstash-5.4.3/logs which is now configured via log4j2.properties
2020-10-30T14:12:26,056[logstash.outputs.elasticsearch] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://127.0.0.1:9200/]}}
2020-10-30T14:12:26,062[logstash.outputs.elasticsearch] Running health check to see if an Elasticsearch connection is working {:healthcheck_url=>http://127.0.0.1:9200/, :path=>”/”}
log4j:WARN No appenders could be found for logger (org.apache.http.client.protocol.RequestAuthCache).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log… for more info.
2020-10-30T14:12:26,209[logstash.outputs.elasticsearch] Restored connection to ES instance {:url=>#<URI::HTTP:0x1abac0 URL:http://127.0.0.1:9200/>}2020-10-30T14:12:26,225[logstash.outputs.elasticsearch] Using mapping template from {:path=>nil}
2020-10-30T14:12:26,288[logstash.outputs.elasticsearch] Attempting to install template {:manage_template=>{“template”=>”logstash-“, “version”=>50001, “settings”=>{“index.refresh_interval”=>”5s”}, “mappings”=>{“_default_”=>{“_all”=>{“enabled”=>true, “norms”=>false}, “dynamic_templates”=>[{“message_field”=>{“path_match”=>”message”, “match_mapping_type”=>”string”, “mapping”=>{“type”=>”text”, “norms”=>false}}}, {“string_fields”=>{“match”=>”“, “match_mapping_type”=>”string”, “mapping”=>{“type”=>”text”, “norms”=>false, “fields”=>{“keyword”=>{“type”=>”keyword”}}}}}], “properties”=>{“@timestamp”=>{“type”=>”date”, “include_in_all”=>false}, “@version”=>{“type”=>”keyword”, “include_in_all”=>false}, “geoip”=>{“dynamic”=>true, “properties”=>{“ip”=>{“type”=>”ip”}, “location”=>{“type”=>”geo_point”}, “latitude”=>{“type”=>”half_float”}, “longitude”=>{“type”=>”half_float”}}}}}}}}
2020-10-30T14:12:26,304[logstash.outputs.elasticsearch] New Elasticsearch output {:class=>”LogStash::Outputs::ElasticSearch”, :hosts=>[#<URI::Generic:0x2fec3fe6 URL://127.0.0.1:9200>]}
2020-10-30T14:12:26,312[logstash.pipeline] Starting pipeline {“id”=>”main”, “pipeline.workers”=>4, “pipeline.batch.size”=>125, “pipeline.batch.delay”=>5, “pipeline.max_inflight”=>500}
2020-10-30T14:12:27,226[logstash.inputs.beats] Beats inputs: Starting input listener {:address=>”0.0.0.0:5044″}
2020-10-30T14:12:27,319[logstash.pipeline] Pipeline main started
2020-10-30T14:12:27,422[logstash.agent] Successfully started Logstash API endpoint {:port=>9600}
依据控制台输入的日志,咱们晓得 logstash 曾经失常启动。

五、Kibana 的装置与应用
Kibana 是一个基于 Web 的图形界面,用于搜寻、剖析和可视化存储在 Elasticsearch 指标中的日志数据。Kibana 调用 Elasticsearch 的接口返回的数据进行可视化。它利用 Elasticsearch 的 REST 接口来检索数据,不仅容许用户创立他们本人的数据的定制仪表板视图,还容许他们以非凡的形式查问和过滤数据。

Kibana 的装置比较简单,咱们基于 docker 装置即可:

docker run –name kibana -e ELASTICSEARCH_URL=http://127.0.0.1:9200 -p 5601:5601 -d kibana:5.6.9
咱们在启动命令中指定了 ELASTICSEARCH 的环境变量,就是本地的 127.0.0.1:9200。

六、Filebeat 的装置与应用
Filebeat 用于转发和集中日志数据的轻量级传送工具。Filebeat 监督指定的日志文件或地位,收集日志事件,并将它们转发到 Logstash、Kafka、Redis 等,或间接转发到 Elasticsearch 进行索引。

image.png
上面咱们开始装置配置 Filebeat:

下载 filebeat

$ wget https://artifacts.elastic.co/…
$ tar -zxvf filebeat-5.4.3-linux-x86_64.tar.gz
$ mv filebeat-5.4.3-linux-x86_64 filebeat

进入目录

$ cd filebeat

配置 filebeat

$ vi filebeat/client.yml
filebeat.prospectors:

  • input_type: log
    paths:

    • /var/log/*.log

output.logstash:
hosts: [“localhost:5044”]
在 filebeat 的配置中,input_type 反对从 Log、Syslog、Stdin、Redis、UDP、Docker、TCP、NetFlow 输出。上述配置了从 log 中读取日志信息。并且配置了只输出 /var/log/ 目录下的日志文件。output 将 Filebeat 配置为应用 logstash,并且应用 logstash 对 Filebeat 收集的数据执行额定的解决。

配置好之后,咱们启动 Filebeat:

$ ./filebeat -e -c client.yml
2020/10/30 06:46:31.764391 beat.go:285: INFO Home path: [/elk/filebeat] Config path: [/elk/filebeat] Data path: [/elk/filebeat/data] Logs path: [/elk/filebeat/logs]
2020/10/30 06:46:31.764426 beat.go:186: INFO Setup Beat: filebeat; Version: 5.4.3
2020/10/30 06:46:31.764522 logstash.go:90: INFO Max Retries set to: 3
2020/10/30 06:46:31.764588 outputs.go:108: INFO Activated logstash as output plugin.
2020/10/30 06:46:31.764586 metrics.go:23: INFO Metrics logging every 30s
2020/10/30 06:46:31.764664 publish.go:295: INFO Publisher name: VM_1_14_centos
2020/10/30 06:46:31.765299 async.go:63: INFO Flush Interval set to: 1s
2020/10/30 06:46:31.765315 async.go:64: INFO Max Bulk Size set to: 2048
2020/10/30 06:46:31.765563 beat.go:221: INFO filebeat start running.
2020/10/30 06:46:31.765592 registrar.go:85: INFO Registry file set to: /elk/filebeat/data/registry
2020/10/30 06:46:31.765630 registrar.go:106: INFO Loading registrar data from /elk/filebeat/data/registry
2020/10/30 06:46:31.766100 registrar.go:123: INFO States Loaded from registrar: 6
2020/10/30 06:46:31.766136 crawler.go:38: INFO Loading Prospectors: 1
2020/10/30 06:46:31.766209 registrar.go:236: INFO Starting Registrar
2020/10/30 06:46:31.766256 sync.go:41: INFO Start sending events to output
2020/10/30 06:46:31.766291 prospector_log.go:65: INFO Prospector with previous states loaded: 0
2020/10/30 06:46:31.766390 prospector.go:124: INFO Starting prospector of type: log; id: 2536729917787673381
2020/10/30 06:46:31.766422 crawler.go:58: INFO Loading and starting Prospectors completed. Enabled prospectors: 1
2020/10/30 06:46:31.766430 spooler.go:63: INFO Starting spooler: spool_size: 2048; idle_timeout: 5s

2020/10/30 06:47:01.764888 metrics.go:34: INFO No non-zero metrics in the last 30s
2020/10/30 06:47:31.764929 metrics.go:34: INFO No non-zero metrics in the last 30s
2020/10/30 06:48:01.765134 metrics.go:34: INFO No non-zero metrics in the last 30s
启动 Filebeat 时,它将启动一个或多个输出,这些输出将在为日志数据指定的地位中查找。对于 Filebeat 所找到的每个日志,Filebeat 都会启动收集器。每个收集器都读取单个日志以获取新内容,并将新日志数据发送到 libbeat,libbeat 将汇集事件,并将汇集的数据发送到为 Filebeat 配置的输入。

七、ELKB 的应用实际
装置好 ELKB 组件之后,咱们开始整合这些组件。首先看下 ELKB 收集日志的流程。

image.png
Filebeat 监听利用的日志文件,随后将数据发送给 logstash,logstash 则对数据进行过滤和格式化,如 JSON 格式化;之后 logstash 将解决好的日志数据发送给 Elasticsearch,Elasticsearch 存储并建设搜寻的索引;Kibana 提供可视化的视图页面。

咱们运行所有的组件之后,首先看下 elasticsearch-head 中的索引变动:

image.png

能够看到多了一个 filebeat-2020.10.12 的索引,阐明 ELKB 分布式日志收集框架搭建胜利。拜访 http://localhost:9100,咱们来 …

image.png
image.png

从下面两幅截图能够看到,/var/log/ 目录下的 mysqld.log 文件中产生了新的日志数据,这些数据十分多,咱们在生产环境须要依据理论的业务进行过滤,并解决相应的日志格局。

image.png
elasticsearch-head 是一个简略的 Elasticsearch 客户端,更加残缺的统计和搜寻需要,须要借助于 Kibana,Kibana 晋升了 Elasticsearch 剖析能力,可能更加智能地剖析数据,执行数学转换并且依据要求对数据切割分块。

拜访 http://localhost:5601,失去了 … 监听到了 mysql 日志,并在 Kibana 上展现。Kibana 可能更好地解决海量数据,并据此创立柱形图、折线图、散点图、直方图、饼图和地图,这里就不一一展现了。

八、小结
本文次要介绍了分布式日志采集零碎 ELKB。日志次要用来记录离散的事件,蕴含程序执行到某一点或某一阶段的详细信息。ELKB 很好地解决了微服务架构下,服务实例泛滥且扩散,日志难以收集和剖析的问题。限于篇幅,本课时只介绍了 ELKB 的装置应用,Go 微服务中个别应用日志框架如 logrus、zap 等,依照肯定的格局将日志输入到指定的地位,读者能够自行构建一个微服务进行实际。

正文完
 0