亿级 ELK 日志平台构建实践

标签: elk 日志 平台 | 发表时间:2021-05-11 10:12 | 作者:guoaaaad
出处:http://weekly.dockone.io

本篇主要讲工作中的真实经历,我们怎么打造亿级日志平台,同时手把手教大家建立起这样一套亿级 ELK 系统。

废话不多说,老司机们座好了,我们准备发车了~~~

整体架构

整体架构主要分为 4 个模块,分别提供不同的功能。

Filebeat:轻量级数据收集引擎。基于原先 Logstash-fowarder 的源码改造出来。换句话说:Filebeat就是新版的 Logstash-fowarder,也会是 ELK Stack 在 Agent 的第一选择。

Kafka:数据缓冲队列。作为消息队列解耦了处理过程,同时提高了可扩展性。具有峰值处理能力,使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。

Logstash:数据收集处理引擎。支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储以供后续使用。

Elasticsearch:分布式搜索引擎。具有高可伸缩、高可靠、易管理等特点。可以用于全文检索、结构化检索和分析,并能将这三者结合起来。Elasticsearch 基于 Lucene 开发,现在使用最广的开源搜索引擎之一,Wikipedia 、StackOverflow、Github 等都基于它来构建自己的搜索引擎。

Kibana:可视化化平台。它能够搜索、展示存储在 Elasticsearch 中索引数据。使用它可以很方便的用图表、表格、地图展示和分析数据。

版本说明

Filebeat:6.2.4

Kafka:2.11-1

Logstash:6.2.4

Elasticsearch:6.2.4

Kibana:6.2.4

相应的版本最好下载对应的插件。

具体实践

我们就以比较常见的 Nginx 日志来举例说明下,日志内容是 JSON 格式。
{"@timestamp":"2017-12-27T16:38:17+08:00","host":"192.168.56.11","clientip":"192.168.56.11","size":26,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"192.168.56.11","url":"/nginxweb/index.html","domain":"192.168.56.11","xff":"-","referer":"-","status":"200"}  
{"@timestamp":"2017-12-27T16:38:17+08:00","host":"192.168.56.11","clientip":"192.168.56.11","size":26,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"192.168.56.11","url":"/nginxweb/index.html","domain":"192.168.56.11","xff":"-","referer":"-","status":"200"}
{"@timestamp":"2017-12-27T16:38:17+08:00","host":"192.168.56.11","clientip":"192.168.56.11","size":26,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"192.168.56.11","url":"/nginxweb/index.html","domain":"192.168.56.11","xff":"-","referer":"-","status":"200"}
{"@timestamp":"2017-12-27T16:38:17+08:00","host":"192.168.56.11","clientip":"192.168.56.11","size":26,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"192.168.56.11","url":"/nginxweb/index.html","domain":"192.168.56.11","xff":"-","referer":"-","status":"200"}
{"@timestamp":"2017-12-27T16:38:17+08:00","host":"192.168.56.11","clientip":"192.168.56.11","size":26,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"192.168.56.11","url":"/nginxweb/index.html","domain":"192.168.56.11","xff":"-","referer":"-","status":"200"} 

Filebeat

为什么用 Filebeat ,而不用原来的 Logstash 呢?

原因很简单,资源消耗比较大。

由于 Logstash 是跑在 JVM 上面,资源消耗比较大,后来作者用 GO 写了一个功能较少但是资源消耗也小的轻量级的 Agent 叫 Logstash-forwarder。

后来作者加入 elastic.co 公司, Logstash-forwarder 的开发工作给公司内部 GO 团队来搞,最后命名为 Filebeat。

Filebeat 需要部署在每台应用服务器上,可以通过 Salt 来推送并安装配置。

下载:
$ wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-darwin-x86_64.tar.gz  

解压:
tar -zxvf filebeat-6.2.4-darwin-x86_64.tar.gz  
mv filebeat-6.2.4-darwin-x86_64 filebeat
cd filebeat

修改配置:

修改 Filebeat 配置,支持收集本地目录日志,并输出日志到 Kafka 集群中。
$ vim fileat.yml  
filebeat.prospectors:
- input_type: log
paths:
-  /opt/logs/server/nginx.log
json.keys_under_root: true
json.add_error_key: true
json.message_key: log

output.kafka:   
hosts: ["192.168.0.1:9092,192.168.0.2:9092,192.168.0.3:9092"]
topic: 'nginx'

Filebeat 6.0 之后一些配置参数变动比较大,比如 document_type 就不支持,需要用 fields 来代替等等。

启动:
$ ./filebeat -e -c filebeat.yml  

Kafka

生产环境中 Kafka 集群中节点数量建议为(2N + 1 )个,这边就以 3 个节点举例。

下载:

直接到官网下载 Kafka。
$ wget http://mirror.bit.edu.cn/apache/kafka/1.0.0/kafka_2.11-1.0.0.tgz  

解压:
tar -zxvf kafka_2.11-1.0.0.tgz  
mv kafka_2.11-1.0.0 kafka
cd kafka

修改 ZooKeeper 配置:

修改 ZooKeeper 配置,搭建 ZooKeeper 集群,数量 ( 2N + 1 ) 个。

ZooKeeper 集群建议采用 Kafka 自带,减少网络相关的因素干扰。
$ vim zookeeper.properties  

tickTime=2000
dataDir=/opt/zookeeper
clientPort=2181
maxClientCnxns=50
initLimit=10
syncLimit=5

server.1=192.168.0.1:2888:3888
server.2=192.168.0.2:2888:3888
server.3=192.168.0.3:2888:3888

ZooKeeper data 目录下面添加 myid 文件,内容为代表 ZooeKeeper 节点 id (1,2,3),并保证不重复。
$ vim /opt/zookeeper/myid  
1

启动 ZooKeeper 节点:

分别启动 3 台 ZooKeeper 节点,保证集群的高可用。
$ ./zookeeper-server-start.sh -daemon ./config/zookeeper.properties  

修改 Kafka 配置:

Kafka 集群这边搭建为 3 台,可以逐个修改 Kafka 配置,需要注意其中 broker.id 分别 (1,2,3)。
$ vim ./config/server.properties  
broker.id=1
port=9092
host.name=192.168.0.1
num.replica.fetchers=1
log.dirs=/opt/kafka_logs
num.partitions=3
zookeeper.connect=192.168.0.1: 192.168.0.2: 192.168.0.3:2181
zookeeper.connection.timeout.ms=6000
zookeeper.sync.time.ms=2000
num.io.threads=8
num.network.threads=8
queued.max.requests=16
fetch.purgatory.purge.interval.requests=100
producer.purgatory.purge.interval.requests=100
delete.topic.enable=true

启动 Kafka 集群:

分别启动 3 台 Kafka 节点,保证集群的高可用。
$ ./bin/kafka-server-start.sh -daemon ./config/server.properties  

查看 topic 是否创建成功。
$ bin/kafka-topics.sh --list --zookeeper localhost:2181  

nginx

监控 Kafka Manager:

Kafka-manager 是 Yahoo 公司开源的集群管理工具。

可以在 Github 上下载安装: https://github.com/yahoo/kafka-manager

如果遇到 Kafka 消费不及时的话,可以通过到具体 cluster 页面上,增加 partition。Kafka 通过 partition 分区来提高并发消费速度。

Logstash

Logstash 提供三大功能:
  • INPUT 进入
  • FILTER 过滤功能
  • OUTPUT 出去


如果使用 Filter 功能的话,强烈推荐大家使用 Grok debugger 来预先解析日志格式。

下载:
$ wget https://artifacts.elastic.co/downloads/logstash/logstash-6.2.4.tar.gz  

解压重命名:
$ tar -zxvf logstash-6.2.4.tar.gz  
$ mv logstash-6.2.4 logstash

修改 Logstash 配置:

修改 Logstash 配置,使之提供 indexer 的功能,将数据插入到 Elasticsearch 集群中。
$ vim nginx.conf  

input {
kafka {
type => "kafka"
bootstrap_servers => "192.168.0.1:2181,192.168.0.2:2181,192.168.0.3:2181"
topics => "nginx"
group_id => "logstash"
consumer_threads => 2
}
}

output {
elasticsearch {
host => ["192.168.0.1","192.168.0.2","192.168.0.3"]
port => "9300"
index => "nginx-%{+YYYY.MM.dd}"
}


启动 Logstash:
$ ./bin/logstash -f nginx.conf  

Elasticsearch

下载:
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.tar.gz  

解压:
$ tar -zxvf elasticsearch-6.2.4.tar.gz  
$ mv elasticsearch-6.2.4.tar.gz elasticsearch

修改配置:
$ vim config/elasticsearch.yml  

cluster.name: es 
node.name: es-node1
network.host: 192.168.0.1
discovery.zen.ping.unicast.hosts: ["192.168.0.1"]
discovery.zen.minimum_master_nodes: 1

启动:

通过 -d 来后台启动。
$ ./bin/elasticsearch -d  

打开网页 http://192.168.0.1:9200/,如果出现下面信息说明配置成功。
{  
name: "es-node1",
cluster_name: "es",
cluster_uuid: "XvoyA_NYTSSV8pJg0Xb23A",
version: {
    number: "6.2.4",
    build_hash: "ccec39f",
    build_date: "2018-04-12T20:37:28.497551Z",
    build_snapshot: false,
    lucene_version: "7.2.1",
    minimum_wire_compatibility_version: "5.6.0",
    minimum_index_compatibility_version: "5.0.0"
},
tagline: "You Know, for Search"


控制台:

Cerebro 这个名字大家可能觉得很陌生,其实过去它的名字叫 kopf !因为 Elasticsearch 5.0 不再支持 site plugin,所以 kopf 作者放弃了原项目,另起炉灶搞了 cerebro,以独立的单页应用形式,继续支持新版本下 Elasticsearch 的管理工作。

注意点:
  1. Master 与 Data 节点分离,当 Data 节点大于 3 个的时候,建议责任分离,减轻压力
  2. Data Node 内存不超过 32G ,建议设置成 31 G ,具体原因可以看: https://blog.51cto.com/13527416/2051506
  3. discovery.zen.minimum_master_nodes 设置成(total / 2 + 1),避免脑裂情况
  4. 最重要的一点,不要将 ES 暴露在公网中,建议都安装 X-PACK ,来加强其安全性


kibana

下载:
$ wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.4-darwin-x86_64.tar.gz  

解压:
$ tar -zxvf kibana-6.2.4-darwin-x86_64.tar.gz  
$ mv kibana-6.2.4-darwin-x86_64.tar.gz kibana

修改配置:
$ vim config/kibana.yml  

server.port: 5601
server.host: "192.168.0.1"
elasticsearch.url: "http://192.168.0.1:9200"

启动 Kibana:
$ nohup ./bin/kibana &  

界面展示:

创建索引页面需要到 Management -> Index Patterns 中通过前缀来指定。

最终效果展示:

总结

综上,通过上面部署命令来实现 ELK 的整套组件,包含了日志收集、过滤、索引和可视化的全部流程,基于这套系统实现分析日志功能。同时,通过水平扩展 Kafka、Elasticsearch 集群,可以实现日均亿级的日志实时处理。

原文链接: https://blog.51cto.com/u_13527416/2117141

相关 [elk 日志 平台] 推荐:

ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台

- - 编程语言 - ITeye博客
在搜索ELK资料的时候,发现这篇文章比较好,于是摘抄一小段:. 以下内容来自: http://baidu.blog.51cto.com/71938/1676798. 日志主要包括系统日志、应用程序日志和安全日志. 系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因.

亿级 ELK 日志平台构建实践

- - DockOne.io
本篇主要讲工作中的真实经历,我们怎么打造亿级日志平台,同时手把手教大家建立起这样一套亿级 ELK 系统. 废话不多说,老司机们座好了,我们准备发车了~~~. 整体架构主要分为 4 个模块,分别提供不同的功能. Filebeat:轻量级数据收集引擎. 基于原先 Logstash-fowarder 的源码改造出来.

使用ELK(Elasticsearch + Logstash + Kibana) 搭建日志集中分析平台实践

- - SegmentFault 最新的文章
Logstash:负责日志的收集,处理和储存. Elasticsearch:负责日志检索和分析. Kibana:负责日志的可视化. 2015年08月31日 - 初稿. 阅读原文 - http://wsgzao.github.io/post/elk/. CentOS 7.x安装ELK(Elasticsearch+Logstash+Kibana) - http://www.chenshake.com/centos-install-7-x-elk-elasticsearchlogstashkibana/.

开源分布式搜索平台ELK(Elasticsearch+Logstash+Kibana)+Redis+Syslog-ng实现日志实时搜索

- - C1G军火库
ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎. 设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便. 支持通过HTTP使用JSON进行数据索引. logstash是一个应用程序日志、事件的传输、处理、管理和搜索的平台. 你可以用它来统一对应用程序日志进行收集管理,提供 Web 接口用于查询和统计.

有哪些基于ELK的亿级实时日志分析平台实践的案例? - 知乎

- -
谢谢zhouzhou的邀请,近期猫友会旗下的大数据付费群正好进行了相关内容的分享,下面是嘉宾回答的内容,希望对你能有所帮助. 大家好,我是黄歆,目前担任斗鱼数据平台部基础架构组Leader,主要负责斗鱼数据平台部基础环境建设(Hadoop、ELK、容器集群等)及基础服务开发(发布系统、监控告警、任务调度等).

实时收集Storm日志到ELK集群

- - 编程语言 - ITeye博客
我们的storm实时流计算项目已经上线几个月了,由于各种原因迟迟没有进行监控,每次出现问题都要登录好几台机器,然后使用sed,shell,awk,vi等各种命令来查询原因,效率非常低下,而且有些统计是没法做的,所以很有必要对storm本身相关的日志以及我们运行在storm上面的任务的日志做一个统一的日志收集,分析,查询,统计平台.

elk-filebeat收集docker容器日志 - devzxd - 博客园

- -
filebeat安装与配置. 1、使用docker-compose文件构建elk. 2、执行docker-compose up -d 启动elk. 可以使用docker logs 命令查看elk启动日志. 启动成功后打开浏览器访问 http://127.0.0.1:5601. 关于filebeat本文也不做过多介绍.

Docker安装ELK并实现JSON格式日志分析

- - SegmentFault 最新的文章
ELK是elastic公司提供的一套完整的日志收集以及前端展示的解决方案,是三个产品的首字母缩写,分别是ElasticSearch、Logstash和Kibana. 其中Logstash负责对日志进行处理,如日志的过滤、日志的格式化等;ElasticSearch具有强大的文本搜索能力,因此作为日志的存储容器;而Kibana负责前端的展示.

日志收集:ETL,ELK以及Kafka/Redis - S.Mona

- -
其实一直都想写ELK的,毕竟在公司做了一年的日志ETL的工作,而且经历了上个世纪遗留的日志收集方案到现在流行的日志收集方案的变更,但是一直都没有找到合适的时间和机会写这一篇文章,趁着寒冬需求量下降没有那么忙碌就做了. ELK是Elastic公司的产品,elastic公司最远近闻名的就是他的ElasticSearch,这也是ELK中的’E’,其他’L’和’K’,分别是指Logstash以及Kibana.

SpringBoot+Kafka+ELK 完成海量日志收集(超详细)

- - 掘金 架构
来源:jiandansuifeng.blog.csdn.net/article/details/107361190. 在这先列出各服务器节点,方便同学们在下文中对照节点查看相应内容. SpringBoot项目准备. 引入log4j2替换SpringBoot默认log,demo项目结构如下:. 测试Controller,用以打印日志进行调试.