来自云龙湖轮廓分明的月亮 发表于 2022-8-25 19:18:23

企业级日志系统架构——ELK(Elasticsearch、Filebeat、Kafka、Logstash、K

目录

[*]一、概述

[*]1)Elasticsearch 存储
[*]2)Filebeat 日志数据采集
[*]3)Kafka
[*]4)Logstash 过滤
[*]5)Kibana 展示
[*]filebeat和logstash的关系

[*]二、helm3安装ELK

[*]1)准备条件
[*]2)helm3安装elasticsearch

[*]1、自定义values
[*]2、开始安装Elasitcsearch
[*]3、验证
[*]4、清理

[*]3)helm3安装Kibana

[*]1、自定义values
[*]2、开始安装Kibana
[*]3、验证
[*]4、清理

[*]4)helm3安装Filebeat

[*]1、自定义values
[*]2、开始安装Filefeat
[*]3、验证
[*]4、清理

[*]5)helm3安装Logstash

[*]1、自定义values
[*]2、开始安装Logstash
[*]3、验证
[*]4、清理


[*]三、ELK相关的备份组件和备份方式

[*]1)Elasticsearch的snapshot快照备份
[*]2)elasticdump备份迁移es数据
[*]3)esm备份迁移es数据

[*]四、彩蛋

一、概述

ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。
大致流程图如下:
https://img2022.cnblogs.com/blog/1601821/202207/1601821-20220710195648945-1192778959.png
1)Elasticsearch 存储

Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
2)Filebeat 日志数据采集

filebeat是Beats中的一员,Beats在是一个轻量级日志采集器,其实Beats家族有6个成员,早期的ELK架构中使用Logstash收集、解析日志,但是Logstash对内存、cpu、io等资源消耗比较高。相比Logstash,Beats所占系统的CPU和内存几乎可以忽略不计。
Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置,收集日志事件。
目前Beats包含六种工具:

[*]Packetbeat:网络数据(收集网络流量数据)
[*]Metricbeat:指标(收集系统、进程和文件系统级别的CPU和内存使用情况等数据)
[*]Filebeat:日志文件(收集文件数据)
[*]Winlogbeat:windows事件日志(收集Windows事件日志数据)
[*]Auditbeat:审计数据(收集审计日志)
[*]Heartbeat:运行时间监控(收集系统运行时的数据)
工作的流程图如下:
https://img2022.cnblogs.com/blog/1601821/202207/1601821-20220710195713006-781602726.png
优点

[*]Filebeat 只是一个二进制文件没有任何依赖。它占用资源极少。
缺点

[*]Filebeat 的应用范围十分有限,因此在某些场景下咱们会碰到问题。在 5.x 版本中,它还具有过滤的能力。
3)Kafka

kafka能帮助我们削峰。ELK可以使用redis作为消息队列,但redis作为消息队列不是强项而且redis集群不如专业的消息发布系统kafka。kafka安装可以参考我之前的文章:Kafka原理介绍+安装+基本操作(kafka on k8s)。
4)Logstash 过滤

Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
优点

[*]可伸缩性
节拍应该在一组Logstash节点之间进行负载平衡。
建议至少使用两个Logstash节点以实现高可用性。
每个Logstash节点只部署一个Beats输入是很常见的,但每个Logstash节点也可以部署多个Beats输入,以便为不同的数据源公开独立的端点。


[*]弹性
Logstash持久队列提供跨节点故障的保护。对于Logstash中的磁盘级弹性,确保磁盘冗余非常重要。对于内部部署,建议您配置RAID。在云或容器化环境中运行时,建议您使用具有反映数据SLA的复制策略的永久磁盘。


[*]可过滤
对事件字段执行常规转换。您可以重命名,删除,替换和修改事件中的字段。
缺点

[*]Logstash耗资源较大,运行占用CPU和内存高。另外没有消息队列缓存,存在数据丢失隐患。
5)Kibana 展示

Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
filebeat和logstash的关系

因为logstash是jvm跑的,资源消耗比较大,所以后来作者又用golang写了一个功能较少但是资源消耗也小的轻量级的logstash-forwarder。不过作者只是一个人,加入http://elastic.co公司以后,因为es公司本身还收购了另一个开源项目packetbeat,而这个项目专门就是用golang的,有整个团队,所以es公司干脆把logstash-forwarder的开发工作也合并到同一个golang团队来搞,于是新的项目就叫filebeat了。
二、helm3安装ELK

详细流程图如下:
https://img2022.cnblogs.com/blog/1601821/202207/1601821-20220710195902946-602229956.png
1)准备条件

1、添加helm仓库
$ helm repo add elastic   https://helm.elastic.co2)helm3安装elasticsearch

1、自定义values

主要是设置storage Class 持久化和资源限制,本人电脑资源有限,所以这里就把资源调小了很多,小伙伴们可以根据自己配置自定义哈。
$ # 集群名称
clusterName: "elasticsearch"
# ElasticSearch 6.8+ 默认安装了 x-pack 插件,部分功能免费,这里选禁用
esConfig:
elasticsearch.yml: |
    network.host: 0.0.0.0
    cluster.name: "elasticsearch"
    xpack.security.enabled: false
resources:
requests:
    memory: 1Gi
volumeClaimTemplate:
storageClassName: "bigdata-nfs-storage"
accessModes: [ "ReadWriteOnce" ]
resources:
    requests:
      storage: 3Gi
service:
type: NodePort
port: 9000
nodePort: 31311禁用Kibana安全提示(Elasticsearch built-in security features are not enabled)
xpack.security.enabled: false
2、开始安装Elasitcsearch

安装过程比较慢,因为官方镜像下载比较慢
$ helm install es elastic/elasticsearch -f my-values.yaml--namespace bigdatahttps://img2022.cnblogs.com/blog/1601821/202207/1601821-20220710195910322-844420843.png
W1207 23:10:57.980283   21465 warnings.go:70] policy/v1beta1 PodDisruptionBudget is deprecated in v1.21+, unavailable in v1.25+; use policy/v1 PodDisruptionBudget
W1207 23:10:58.015416   21465 warnings.go:70] policy/v1beta1 PodDisruptionBudget is deprecated in v1.21+, unavailable in v1.25+; use policy/v1 PodDisruptionBudget
NAME: es
LAST DEPLOYED: Tue Dec7 23:10:57 2021
NAMESPACE: bigdata
STATUS: deployed
REVISION: 1
NOTES:
1. Watch all cluster members come up.
$ kubectl get pods --namespace=bigdata -l app=elasticsearch-master -w2. Test cluster health using Helm test.
$ helm --namespace=bigdata test es查看,需要所有pod都正常运行才正常,下载镜像有点慢,需要稍等一段时间再查看
$ kubectl get pod -n bigdata -l app=elasticsearch-master
$ kubectl get pvc -n bigdata
$ watch kubectl get pod -n bigdata -l app=elasticsearch-masterhttps://img2022.cnblogs.com/blog/1601821/202207/1601821-20220710195920353-1258386080.png
3、验证

$ helm --namespace=bigdata test es
$ kubectl get pod,svc -n bigdata -l app=elasticsearch-master -o wide
$ curl 192.168.0.113:31311/_cat/health
$ curl 192.168.0.113:31311/_cat/nodeshttps://img2022.cnblogs.com/blog/1601821/202207/1601821-20220710195933034-74600340.png
4、清理

$ helm uninstall es -n bigdata
$ kubectl delete pvc elasticsearch-master-elasticsearch-master-0 -n bigdata
$ kubectl delete pvc elasticsearch-master-elasticsearch-master-1 -n bigdata
$ kubectl delete pvc elasticsearch-master-elasticsearch-master-2 -n bigdata3)helm3安装Kibana

1、自定义values

域名(elasticsearch-master-headless.bigdata.svc.cluster.local)的由来不清楚的,可以参考我之前的文章:Kubernetes(k8s)DNS(CoreDNS)介绍
$ cat <<EOF> my-values.yaml
#此处修改了kibana的配置文件,默认位置/usr/share/kibana/kibana.yaml
kibanaConfig:
   kibana.yml: |
   server.port: 5601
   server.host: "0.0.0.0"
   elasticsearch.hosts: [ "elasticsearch-master-headless.bigdata.svc.cluster.local:9200" ]
resources:
requests:
    cpu: "1000m"
    memory: "256Mi"
limits:
    cpu: "1000m"
    memory: "1Gi"
service:
#type: ClusterIP
type: NodePort
loadBalancerIP: ""
port: 5601
nodePort: "30026"
EOFoutput plugin输出插件,将事件发送到特定目标:
stdout { codec => rubydebug }            // 开启debug模式,可在控制台输出


[*]stdout :标准输出。将事件输出到屏幕上
$ helm install kibana elastic/kibana -f my-values.yaml--namespace bigdata

[*]file:将事件写入文件
$ kubectl get pod,svc -n bigdata -l app=kibana

[*]kafka :将事件发送到kafka
$ helm uninstall kibana -n bigdata

[*]elasticseach :在es中存储日志
- name: varlibdockercontainers
hostPath:
    path: /var/lib/docker/containers   #改为docker安装路径2、开始安装Logstash

$ cat <<EOF> my-values.yaml
daemonset:
filebeatConfig:
    filebeat.yml: |
      filebeat.inputs:
      - type: container
      paths:
          - /var/log/containers/*.log

      output.elasticsearch:
      enabled: false
      host: '${NODE_NAME}'
      hosts: '${ELASTICSEARCH_HOSTS:elasticsearch-master:9200}'
      output.kafka:
       enabled: true
       hosts: ["kafka-headless.bigdata.svc.cluster.local:9092"]
       topic: test
EOFhttps://img2022.cnblogs.com/blog/1601821/202207/1601821-20220710200310098-2116398939.png
$ helm install filebeat elastic/filebeat -f my-values.yaml--namespace bigdata
$ kubectl get pods --namespace=bigdata -l app=filebeat-filebeat -whttps://img2022.cnblogs.com/blog/1601821/202207/1601821-20220710200320352-2011219897.png
3、验证

1、登录kibana查看索引是否创建
https://img2022.cnblogs.com/blog/1601821/202207/1601821-20220710200329466-1065282396.png
2、查看logs
# 先登录kafka客户端
$ kubectl exec --tty -i kafka-client --namespace bigdata -- bash
# 再消费数据
$ kafka-console-consumer.sh --bootstrap-server kafka.bigdata.svc.cluster.local:9092 --topic testhttps://img2022.cnblogs.com/blog/1601821/202207/1601821-20220710200339272-348220489.png
3、查看kafka消费情况
$ kubectl exec --tty -i kafka-client --namespace bigdata -- bash
$ kafka-consumer-groups.sh --bootstrap-server kafka-0.kafka-headless.bigdata.svc.cluster.local:9092 --describe --group mygrouphttps://img2022.cnblogs.com/blog/1601821/202207/1601821-20220710200348140-1952889741.png
4、通过kibana查看索引数据(Kibana版本:7.15.0)
创建索引模式
Management-》Stack Management-》Kibana-》Index patterns
https://img2022.cnblogs.com/blog/1601821/202207/1601821-20220710200359112-457042205.png
https://img2022.cnblogs.com/blog/1601821/202207/1601821-20220710200407915-862806694.png
https://img2022.cnblogs.com/blog/1601821/202207/1601821-20220710200416041-527094651.png
通过上面创建的索引模式查询数据(Discover)
https://img2022.cnblogs.com/blog/1601821/202207/1601821-20220710200426636-1848794495.png
https://img2022.cnblogs.com/blog/1601821/202207/1601821-20220710200439008-2135300637.png
4、清理

$ helm uninstall filebeat -n bigdata三、ELK相关的备份组件和备份方式

Elasticsearch备份两种方式:

[*]将数据导出成文本文件,比如通过 elasticdump、esm 等工具将存储在 Elasticsearch 中的数据导出到文件中。适用数据量小的场景。
[*]备份 elasticsearch data 目录中文件的形式来做快照,借助 Elasticsearch 中 snapshot 接口实现的功能。适用大数据量的场景。
1)Elasticsearch的snapshot快照备份


[*]优点:通过snapshot拍摄快照,然后定义快照备份策略,能够实现快照自动化存储,可以定义各种策略来满足自己不同的备份
[*]缺点:还原不够灵活,拍摄快照进行备份很快,但是还原的时候没办法随意进行还原,类似虚拟机快照
1、配置备份目录
在 elasticsearch.yml 的配置文件中注明可以用作备份路径 path.repo ,如下所示:
$ cat <<EOF> my-values.yaml
logstashConfig:
logstash.yml: |
    xpack.monitoring.enabled: false

logstashPipeline:
   logstash.yml: |
    input {
      kafka {
            bootstrap_servers => "kafka-headless.bigdata.svc.cluster.local:9092"
            topics => ["test"]
            group_id => "mygroup"
            #如果使用元数据就不能使用下面的byte字节序列化,否则会报错
            #key_deserializer_class => "org.apache.kafka.common.serialization.ByteArrayDeserializer"
            #value_deserializer_class => "org.apache.kafka.common.serialization.ByteArrayDeserializer"
            consumer_threads => 1
            #默认为false,只有为true的时候才会获取到元数据
            decorate_events => true
            auto_offset_reset => "earliest"
         }
    }
    filter {
      mutate {
      #从kafka的key中获取数据并按照逗号切割
      split => ["[@metadata]", ","]
      add_field => {
            #将切割后的第一位数据放入自定义的“index”字段中
            "index" => "%{[@metadata]}"
      }
      }
    }
    output {
      elasticsearch {
          pool_max => 1000
          pool_max_per_route => 200
          hosts => ["elasticsearch-master-headless.bigdata.svc.cluster.local:9200"]
          index => "test-%{+YYYY.MM.dd}"
      }
    }

# 资源限制
resources:
requests:
    cpu: "100m"
    memory: "256Mi"
limits:
    cpu: "1000m"
    memory: "1Gi"

volumeClaimTemplate:
accessModes: ["ReadWriteOnce"]
resources:
    requests:
      storage: 3Gi
EOF配置好后,就可以使用 snapshot api 来创建一个 repository 了,如下我们创建一个名为 my_backup 的 repository。
output{
    stdout{
      codec => "rubydebug"
    }
}2、开始通过API接口备份
有了 repostiroy 后,我们就可以做备份了,也叫快照,也就是记录当下数据的状态。如下所示我们创建一个名为 snapshot_1 的快照。
output{
   file {
       path => "/data/logstash/%{host}/{application}
       codec => line { format => "%{message}"} }
    }
}【温馨提示】wait_for_completion 为 true 是指该 api 在备份执行完毕后再返回结果,否则默认是异步执行的,我们这里为了立刻看到效果,所以设置了该参数,线上执行时不用设置该参数,让其在后台异步执行即可。
3、增量备份
output{
   kafka{
      bootstrap_servers => "localhost:9092"
      topic_id => "test_topic"#必需的设置。生成消息的主题
    }
}当执行完毕后,你会发现 /mount/backups/my_backup 体积变大了。这说明新数据备份进来了。要说明的一点是,当你在同一个 repository 中做多次 snapshot 时,elasticsearch 会检查要备份的数据 segment 文件是否有变化,如果没有变化则不处理,否则只会把发生变化的 segment file 备份下来。这其实就实现了增量备份。
4、数据恢复
通过调用如下 api 即可快速实现恢复功能:
output{
   elasticsearch {
      #user => elastic
      #password => changeme
      hosts => "localhost:9200"
      index => "nginx-access-log-%{+YYYY.MM.dd}"
    }
}2)elasticdump备份迁移es数据

索引数据导出为文件(备份)
$ helm install logstash elastic/logstash -f my-values.yaml--namespace bigdata索引数据文件导入至索引(恢复)
$ kubectl get pods --namespace=bigdata -l app=logstash-logstash可直接将备份数据导入另一个es集群
$ kubectl logs -flogstash-logstash-0 -n bigdata >logs
$ tail -100 logstype类型
type是ES数据导出导入类型,Elasticdump工具支持以下数据类型:
type类型说明mappingES的索引映射结构数据dataES的数据settingsES的索引库默认配置analyzerES的分词器templateES的模板结构数据aliasES的索引别名3)esm备份迁移es数据

备份es数据
$ kubectl exec --tty -i kafka-client --namespace bigdata -- bash
$ kafka-consumer-groups.sh --bootstrap-server kafka-0.kafka-headless.bigdata.svc.cluster.local:9092 --describe --group mygroup-w 表示线程数
-b 表示一次bulk请求数据大小,单位MB默认 5M
-c 一次scroll请求数量
导入恢复es数据
$ helm uninstall logstash -n bigdata四、彩蛋

还有个日志系统架构跟ELK架构很相似(Elasticsearch、Flume、Kafka、Flink、Kibana),只是把Filebeat换成了Flume,Logstash换成了Flink。后面也会写篇文章分享出来,请耐心等待……
https://img2022.cnblogs.com/blog/1601821/202207/1601821-20220710200448579-658586401.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 企业级日志系统架构——ELK(Elasticsearch、Filebeat、Kafka、Logstash、K