Flume+ElasticSearch+Kibana实现分布式日志收集
前言
本人小白一枚,第一次分享,想把自己懂的一丢丢东西分享出来,希望可以帮到一些朋友。本人只做了一些浅显的研究,如发现有问题,欢迎指正~
背景
许多项目是需要分布式部署的,日志分布在不同服务器上,查看管理日志比较痛苦。当前已有几种成熟的方案可以实现分布式日志的收集,我们这里介绍Flume1.7.0+Es1.5.0+Kibana4.0.1(版本有点老,后续有时间会研究一下可兼容的最新版本)。
Flume的优缺点
优点
1.安装配置简单
2.兼容性好,可对接很多主流插件,还可组件自定义
3.目录级别的监控,可收集几乎所有类型的日志
4.支持拦截器,可以拆分数据、过滤数据、添加时间戳等操作
5.可靠性好,支持断点续传(1.7以上)
缺点
1.没有日志索引检索功能
2.没有可视化界面
3.没有日志分析功能
(Es+Kibana可以弥补以上缺陷)
4.没有日志定期删除功能
Flume简介
概述
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
核心组件
. event:event将传输的数据进行封装,是flume传输数据的基本单位。event从source,流向channel,再到sink,本身为一个字节数组,并可携带headers(头信息)信息。event代表着一个数据的最小完整单元,从外部数据源来,向外部的目的地去。
· source:source组件是专门用来收集数据的,可以处理各种类型、各种格式的日志数据,包括:
avro(级联 接收其他flume服务器的数据)
exec (执行语句)
spooling directory (监控一个目录,无法监控追加文件)
taildir (监控新增及追加文件 断点续传)
netcat (监控网络端口)
kafka (kafka的数据直接传输到 flume中)
http (监控一个地址 用于接收HTTP的Get和Post请求)
自定义 (修改源码实现自己的逻辑)
· channel:source组件把数据收集来以后,临时存放在channel中,即channel组件在agent中是专门用来存放临时数据的,包括:
Memory(event保存在Java Heap中)
Jdbc(event保存在关系数据中,一般不推荐使用)
File(保存在本地文件中,可靠性高,但吞吐量低于Memory)
Kafka(数据写到kafka中 此时可以不需要sink)
· sink:sink组件是用于把数据发送到目的地的组件,只有在sink将channel中的数据成功发送出去之后,channel才会将临时数据进行删除,这种机制保证了数据传输的可靠性与安全性。包括:
Hdfs(数据输出到hdfs)
Logger(数据保存到hdfs日志中)
Avro(级联 发送数据到其他的flume)
File_roll(数据保存到本地磁盘)
Hbase(数据保存到hbase)
自定义 (修改源码实现自己的逻辑)
ES简介
Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;Elasticsearch通过简单的RESTful API对Lucene进行了封装,从而让全文搜索变得简单。
可以理解Elasticsearch为一种非关系型数据库,采用键值对的方式存储数据,有良好的性能以及扩展性
Kibana简介
Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。 使用Kibana ,可以通过各种图表进行高级数据分析及展示。Kibana让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板( dashboard )实时显示Elasticsearch查询动态。设置Kibana非常简单。无需编码或者额外的基础架构,几分钟内就可以完成Kibana安装并启动Elasticsearch索引监测。
环境准备
3台虚拟机:
- 日志生产服务器a:192.168.78.199
- 日志生产服务器b:192.168.78.200
- 日志汇总服务器c:192.168.78.198
虚拟机安装JDK1.8并配置环境变量、关闭防火墙。
搭建步骤
安装Flume1.7.0
(1)http://archive.apache.org/dist/flume/1.7.0/ 下载压缩包apache-flume-1.7.0-bin.tar.gz
(2)上传至虚拟机199、200、198并解压tar -xvf apache-flume-1.7.0-bin.tar.gz
(3)日志生产服务器199、200上新增配置文件conf/es-flume-conf(实际使用的时候请删除配置后面的注释)
# 指定Agent的组件名称
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# 指定Flume source(要监听的路径)
a1.sources.r1.type = TAILDIR
a1.sources.r1.positionFile = /home/flume/taildir_position.json #记录上一次采集到了文件的哪个位置的文件
a1.sources.r1.filegroups = f1 #定义文件组的名称
a1.sources.r1.filegroups.f1 = /home/flume/log/.*log.* #定义对应的文件组监听的目录、文件
a1.sources.r1.batchSize= 100 #定义每批次采集多少数据, 必须<=事务容量大小
# 指定Flume sink
a1.sinks.k1.type = avro #级联
a1.sinks.k1.hostname = 192.168.78.198 #汇总服务器IP
a1.sinks.k1.port = 4444 #汇总服务器flume的端口
# 指定Flume channel
a1.channels.c1.type = memory #内存缓存,若需报保证可靠性可采用File持久化缓存
a1.channels.c1.capacity = 100000 #channel的容量大小
a1.channels.c1.transactionCapacity = 1000 #事务容量大小,必须<=capacity
# 绑定source和sink到channel上
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
日志汇总服务器198上新增配置文件conf/es-flume-conf:
# 指定Agent的组件名称
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# 指定Flume source(要监听的路径)
a1.sources.r1.type = avro #级联
a1.sources.r1.bind = 192.168.78.198 #服务器自身IP
a1.sources.r1.port = 4444 #服务器flume端口
a1.sources.r1.interceptors = i2 #定义拦截器
a1.sources.r1.interceptors.i2.type = timestamp #数据添加事件戳
# 指定Flume sink
a1.sinks.k1.type = org.apache.flume.sink.elasticsearch.ElasticSearchSink
a1.sinks.k1.hostNames = 192.168.78.198:9300 #es的jar之间tcp通讯的端口
a1.sinks.k1.clusterName = esCluster #es定义的集群名称
a1.sinks.k1.batchSize = 100
a1.sinks.k1.indexName = newindex #指定写入es的索引名称(数据库名)
a1.sinks.k1.indexType = cyw2 #指定写入es的type名称(表名)
a1.sinks.k1.serializer = org.apache.flume.sink.elasticsearch.ElasticSearchLogStashEventSerializer
# 指定Flume channel
a1.channels.c1.type = memory #内存缓存,若需报保证可靠性可采用File持久化缓存
a1.channels.c1.capacity = 1000000 #channel的容量大小
a1.channels.c1.transactionCapacity = 1000 #事务容量大小,必须<=capacity
# 绑定source和sink到channel上
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
安装ES1.5.0
(1)https://www.elastic.co/cn/downloads/past-releases#elasticsearch 下载压缩包elasticsearch-1.5.0.tar.gz
(2)上传至虚拟机198并解压
(3)拷贝lib下的jar包到flume/lib,重名jar不覆盖
(4)修改config/elasticsearch.yml(版本不一样,配置参数可能有差异,具体情况参考yml中的注释配置)
cluster.name: esCluster #es集群名称,与es-flume-conf中的一样
node.name: esNode1 #es当前节点名称,与es-flume-conf中的一样
path.data: /home/e15/mydata #数据保存路径
network.host: 192.168.78.198 #当前节点ip
http.port: 7000 #http外部通讯端口,默认9200
discovery.zen.ping.unicast.hosts: ["192.168.78.198"] #discovery发现模块,定义es集群的所有ip
安装Kibana4.0.1
(1)https://www.elastic.co/cn/downloads/past-releases#kibana
下载压缩包kibana-4.0.1-linux-x64.tar.gz
(2)上传至虚拟机198并解压
(3)修改config/kibana.yml(除以下三个配置其他为默认)
port: 5601 #Kibana访问端口
host: "192.168.78.198" #Kibana访问IP
elasticsearch_url: "http://192.168.78.198:7000" #ES的http地址
联调
(1)创建并切换es用户
adduser es
passwd es
chown -R es /home/es15 #安装路径赋权
su es
(2)服务器198启动ES
bin/elasticsearch
(3)创建索引newindex-2021-01-26(“newindex”为flume配置文件绑定的索引名称,后跟当天时间)
(4)给索引创建type(cyw2)和fields(@timestamp、@message)
(5)插入测试数据
(6)查询数据
(7)服务器198启动Kibana
bin/kibana
(8)浏览器访问192.168.78.198:5601
- 勾选以时间作为索引选项
- 默认是每天都会自动创建索引,故间隔选择Daily
- 输入通配索引名称:[newindex-]YYYY-MM-DD
- 选择date格式的字段@timestamp
- 点击创建
(9) 在discover中查看数据
(10)隐藏或添加要展示的fields
(11)关键字查询
(12)时间过滤查询
(13)设置自动刷新时间
(14)服务器198、199、200启动Flume
bin/flume-ng agent --conf conf --conf-file conf/es-flume-conf --name a1 -Dflume.root.logger=INFO,console
(15)服务器199、200分别在监控路径下插入数据
(16)Kibana上自动刷新出插入的数据
(17)断点续传测试
停掉flume进程
写入日志数据
查看kibana无该日志,重启flume agent后,查看kibana发现日志重新上传
FAQ
1.ES启动报错:bootstrap checks failed
原因:
Linux默认配置的参数过小
解决方法:
/etc/security/limits.conf添加
* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096
/etc/sysctl.conf添加
vm.max_map_count=262144
修改后重新登录
2.Flume启动报错:java.lang.NoClassDefFoundError
原因:
ES版本过高与Flume不匹配。ES2.*把ByteStream的路径修改了。
解决方法:
ES修改为1.*版本
升级Flume版本(待尝试)
3.Flume报错:org.elasticsearch.transport.ReceiveTimeoutTransportException
原因:
Flume配置的ES端口为ES的http对外端口
解决方法:
Flume的配置文件中配置ES的jar之间tcp通讯端口9300
4.ES命令执行报错:indexMissingException
原因:
命令的请求方式错误,比如PUT方法使用GET去访问
解决方法:
使用正确的请求方式
参考文档
分布式日志收集框架Flume
Flume常用Source与Sink类型及参数
flume+es+kibana日志系统
flume+ Elasticsearch +kibana环境搭建及讲解
日志收集组件flume和logstash对比