elastic stack开源技术栈介绍elastic stack栈涉及到以下几个组件
使用elastic stack进行日志平台架构如下图所示: elastic stack技术栈 从以上日志数据的流向可以看到掌阅的应用日志数据有三种流向,下面分别说明:
beats采集数据beats是elasticstack的一员,属于一种轻量级的日志采集组件,使用go语言开发,没有依赖,可以简化部署和运维操作,使用yaml格式的配置文件来采集日志或者系统信息,目前beats支持的事件采集包括:网络数据,日志文件,mysql,system,mongodb,kafka,nginx,redis,zookeeper,haproxy等 beats提供了一个易于开发和扩展的框架用于扩展相关的监控指标的采集来满足各种不同的指标采集需求,logstash提供了对beats数据采集的接入接口,因此只需要使用beats工具进行数据采集,然后将数据推到logstash集群即可;另外beats的数据还支持直接写入es,这种场景适合不需要针对性的对数据做结构化的场景。 目前beats支持以下几种:
beats使用指南 beats是基于libbeat框架进行开发的专门用于采集数据的一个组件。 开源的beats组件列表:https://www./guide/en/beats/libbeat/5.2/community-beats.html Beats 平台是 Elastic.co 从 packetbeat 发展出来的数据收集器系统,统一基于go进行开发和扩展。beat 收集器可以直接写入 Elasticsearch,也可以传输给 Logstash。其中抽象出来的 libbeat,提供了统一的数据发送方法,输入配置解析,日志记录框架等功能。也就是说,所有的 beat 工具,在配置上,除了 input 以外,在output、filter、shipper、logging、run-options 上的配置规则都是完全一致的,下图是Filebeats的架构设计 filebeat架构设计 上图的filebeat是最常见的一个日志采集工具,主要用来采集文件日志,filebeat的工作原理如下:
注意:因为registry文件记录了每个文件的状态并且持久化到了磁盘,如果有大量的文件的话,registry文件可能会变的很大,为了减少registry文件的大小,建议开启clean_removed和clean_inactive两个配置项。 安装和使用filebeat因为filebeat为go语言开发,语言特性决定了filebeat的安装和使用将会特别方便,首先去官方下载对应版本的压缩包,然后解压到指定路径即可。 当我们安装完filebeat之后,我们可以在filebeat的安装目录下看到两个文件
使用yaml配置beats 1,配置文件名称filebeat.yml,格式yaml格式。 2,filebeat日志勘探器prospector配置项说明
3,输出相关的配置:output
输出到elasticsearch 安装filebeats的时候会在相应得目录下有一份filebeat.template.json的文件,该文件用于高速Elasticsearch集群如何处理filebeat采集的日志,可以用以下命令手动装载该模板: curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' -d@/etc/filebeat/filebeat.template.json 如果要删除该模板,执行: curl -XDELETE 'http://localhost:9200/filebeat-*'
输出到logstash
输出到kafka
输出到Redis
输出到文件
输出到终端 4,完成配置后需要检查配置的可用性 编写完成filebeats相关的配置后执行如下命令检查配置是否正确 ./filebeat -configtest -e 5,启动beats 使用本地文件为输入源,console为输出进行debug测试启动
测试配置
/data/server/filebeat/filebeat -c /data/server/filebeat/filebeat.test.yml -e 线上启动可以用nohup或者supervisord进行管理。 nohup /data/server/filebeat/filebeat -e -c /data/server/filebeat/filebeat.yml >/dev/null 2>&1 & 6,使用beats组件需要测试和了解的几项指标
安装和使用logstash1,logstash安装 安装Java环境,要求Jdk版本大于1.8。 Java版本查看 安装logstash wget https://artifacts./downloads/logstash/logstash-5.2.1.tar.gz 解压到指定路径 tar -xzvf logstash-5.2.1.tar.gz -C /data/server 测试logstash是否安装成功 logstash -e 'input { stdin { } } output { stdout {} }' 2,logstash配置文件讲解 logstash的配置文件是一种DSL的配置方式,主要包括三部分:
配置文件举例: 3,启动logstash进行测试 常规启动方式: /data/server/logstash/bin/logstash -f /data/server/logstash/pipeline/demo.conf 推荐使用supervisord进行管理启动,启动脚本supervisord.conf配置举例: [program:elkpro_1]environment=LS_HEAP_SIZE=5000mdirectory=/data/server/logstash/command=/data/server/logstash/bin/logstash -f /data/server/logstash/pipelien/pro1.conf --pluginpath /data/server/logstash/plugins/ -w 10 -l /data/logs/logstash/pro1.log[program:elkpro_2]environment=LS_HEAP_SIZE=5000mdirectory=/data/server/logstashcommand=/data/server/logstash/bin/logstash -f /data/server/logstash/pro2.conf --pluginpath /data/server/logstash/plugins/ -w 10 -l /data/logs/logstash/pro2.log 4,logstash的工作原理 在logstash中有输入,过滤,输出即:input,filter,output三种配置,这三种功能在logstash中是通过不同的线程进行处理,通过top命令然后H可以查看logstash的各个线程的工作情况 logstash处理的数据在线程之间以event形式传递,在过滤的过程中可以给event添加或者删除修改event的tag,每个filter插件都会提供add_tag,remove_tag,add_field和remove_field四个方法。 logstash默认基于内存的队列在管道间进行事件传递,如果logstash异常终止缓存在内存的事件将会被丢失,为了避免logstash异常终止导致的事件丢失,可以考虑使用持久化队列来处理事件。跟持久化队列相关的配置项有以下几个:
当使用了持久化队列的配置后,有一种场景也可能发生就是队列分配的资源使用完了,这时候logstash为了避免后端ES过载采取的措施是不再接受新事件输入。这个时候如果往logstash写入数据的是beats组件时,beats会停止往logstash写入数据,直到logstash队列被消费后才继续写入。 5,logstash事件生命周期 logstash的事件会经历inputs=>filters=>outputs这样的管道完成一个事件的生命周期,我们针对事件的完整生命周期来分别讲解每个阶段的工作内容。 5.1 inputs 可以作为输入源的类型有以下几种
5.2 filters filters阶段是对event的加工处理,每个事件在该阶段都是运行在一个独立的线程中,并将读取到event写入到Java的一个同步队列SynchronousQueue,该队列会将数据发送给当前空闲的worker去处理,如果所有的worker都是busy状态就会阻塞。worker线程数可以通过配置文件进行设置,优化logstash的执行性能可以参考Tuning and Profiling logstash Performance 默认情况下logstash在各个管道(pipeline)间通过内存队列做缓冲进行事件传递 常用的filters有以下几种
5.3 outputs event最后的处理阶段,该阶段将event事件输出到指定的服务中,当前支持的输出服务有以下几个
5.4 Codec 可以用于input或者output中。codecs可以简化某些event的序列化操作,比较流行的codec有以下几个
6,logstash插件架构 基于以上架构可以扩展和丰富logstash日志插件。不再赘述,如果当前插件不能满足业务需求的时候可以考虑进行开发和扩展。以下是官方的插件列表举例: 7,使用filebeat做为文件输入源进行简单配置举例 8,logstash性能调优 logstash默认会选择最佳的性能方案,当默认配置不能满足需求的时候可以对影响性能的几个参数进行调整,涉及到性能相关的参数有以下几个:
9,logstash测试指标
使用队列做数据缓冲由于数据写入太快logstash或者ES集群性能有问题会导致数据写入失败,因此常规的架构上一般在输入数据层都会使用一个队列系统做缓冲区进行缓冲,常见的做为日志平台的数据缓冲的队列系统有以下几种:
几种队列做一个简单的对比:
引入队列中间件的好处:
从以上对比分析可以无论选择什么队列做中间件,只要自己能够hold住整体架构即可,每个中间件自身都各有千秋。接下来我们以kafka为队列中间件做分析和举例: 1,kafka架构及原理讲解 kafka通过zookeeper集群保证服务的高可用,kafka自身又包括生产者和消费者,生产者和消费者的连接的桥梁是broker。 生产者和消费者关系 生产者将数据转发到自己感兴趣的topic中,每个topic在kafka上又支持划分多个分区,通过分区的方式来解决负载均衡问题。多个消费者可以订阅自己感兴趣的topic, 生产者和消费者的关系 从上图可以看出生产者是推送数据给kafka,消费者是从kafka拉取数据。 2,kafka集群搭建 从以上原理图大家大概能知道kafka集群的搭建首先需要搭建zookeeper集群,搭建完zookeeper集群后需要根据日志平台进行评估kafka集群的规模,设计kakfa服务器的磁盘分区以及配置项,由于篇幅有限,本文不再单独讲解kafka如何搭建。有兴趣的读者可以参考:http:///2017/09/04/kafka-best-pratice/ 存储集群ElasticSearch讲解elasticsearch是基于luncene的一个分布式搜索服务,支持在线扩容,海量数据存储,高性能倒排列表,模糊搜索等高级特性,为了方便大家理解我拿ES和普通的关系数据库进行对比如下: 使用es2unix工具可以在命令行上操作es 可以用paramedic插件监控ES集群的状态,使用head插件可以查看ES索引的状态,具体如何安装插件和扩展请大家参考插件官方网站即可,不再赘述。 1,单机搭建ES集群讲解 下载elasticsearch指定版本,注意ES官方目前已经升级到6.0以上版本,建议基于最新稳定版本搭建。 ES安装比较简单,从官方下载指定的压缩包,然后解压到指定路径即可。 2,单机模式ES服务启动 用于测试ES服务的接口和API等相关特性,搭建一个节点的单机版本进行测试 启动ES集群前需要先设置ES启动时依赖的一些系统参数:
启动命令: /path/to/elasticsearch/bin/elasticsearch 3,集群模式搭建 由于不同规模,不同配置的硬件对集群搭建要求不一样,建议大家基于自身服务器条件进行定制化搭建,不再赘述。 4,curator管理elasticsearch的索引 curator是python开发的一个工具,专门用来管理es集群相关的索引,通过该工具的api可以对es集群的索引进行单独管理,包括查看,修改,删除,副本,restore,snapshot等。 总结以上就是一个简单的日志平台涉及到的关键组件的讲解和对应组件的原理分析。下面一个章节我们会将docker和这些组件的适配进行讲解。敬请大家期待。 |
|