elk:elasticsearch kibana l是啥鬼??logstash
kubenetes上的日志收集模式:https://www.jianshu.com/p/72f34de4dd35
一共有三种收集模式:一个是DaemonSet模式,一个是sidecar模式,一个是自带的kubctl log的模式。各有优势。。
sidecar就是把日志收集和处理功能从app中拆分出来,就像摩托车的边车或者车斗。用的时候上,不用的时候拆掉。
一个可落地的日志处理系统?ELK or 其他????
ELK的模式?
问题:各种工具在日志系统中起到什么作用???
日志处理的架构:
即 收集日志(flume,fluentd,logstash这些)+消息队列(kafka)+日志处理(elastic search+kibana,splunk)+其他日志处理(比如向其他服务提供log数据等),再加上日志存储(NFS(网络文件系统))
几大处理方案:
1.flume+kafka+splunk
2.elk+kafka
最佳实践经验:数据收集和转化的环节,建议使用flume+kafka的配合,为啥?因为flume可以以数据流向haddop发送,kafka的缓存比flume的专业,且有自己的分布式存储,各有所长。
对比:
https://blog.51cto.com/splunkchina/1948105
https://blog.csdn.net/gyshun/article/details/79710534
首先要在服务器上收集日志,然后把日志传送给需要的服务,比如用户行为分析服务,比如日志v存储服务,比如日志分析等。基于这些服务,还要考虑中间会不会阻塞导致的数据丢失,于是便有了消息队列(kafka,redis等)
splunk:一个和elk 作为同款PK的日志处理平台,https://blog.51cto.com/splunkchina/1948105
kafka:apache公司的,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,服务器端的日志收集工具(比如logstash或者flume等)要配置kafka,接收端也要配置kafka,相当于一个中转站,接受来自于收集工具的日志,缓存并发给下游,这么做的意义?它是一个流处理平台
logstash:装于服务器上,监控,过滤并收集日志(同时在服务器上安装logstash agent并在elk机器上安装logstash index接收)
elastic search:对搜索的日志处理,存储
kibana:日志显示及图形化处理
flume:apache公司的,装于服务器,用于日志收集,外发,功能同logstash
fluentd: 同flume,但不是apache的
elastic search
logging driver
file base????
Prometheus
syslog 开源,可以把各服务器日志收集在一起。
flume VS fluentd: https://www.slant.co/versus/959/960/~fluentd_vs_flume
资源 :https://www.fluentd.org/
日志收集系统
关于elk https://www.cnblogs.com/JetpropelledSnake/p/9893566.html
关于elk+kafka :https://www.cnblogs.com/JetpropelledSnake/p/10057545.html
关于kafka:
https://www.cnblogs.com/likehua/p/3999538.html
https://www.cnblogs.com/likehua/p/3999538.html
第一个问题,日志处理系统的逻辑和流程:
https://mp.weixin.qq.com/s?__biz=MzAwNTM5Njk3Mw==&mid=2247486414&idx=1&sn=4f3cf7506414d46a0cc436d4ae47755f&chksm=9b1c0b4cac6b825a05c1745aa649fc33b61fc4caaaf262a3577c01821ccbbc128d076477cb3e&scene=27#wechat_redirect
https://www.zcfy.cc/article/5-devops-tools-for-logging-and-monitoring
https://www.ibm.com/developerworks/cn/analytics/library/ba-1512-elkstack-logprocessing/index.html
日志层级:系统日志、应用程序日志和安全日志。首先是日志收集(工具有:),收集后日志要进行统计和检索(工具有:)
流程:
容器日志实时采集;
查询分析和可视化;
日志上下文分析;
LiveTail - 云上 tail -f。
ELK的日志处理方案:
首先在要收集日志的服务器上安装logstash,作为一个agent开始收集日志
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
kafka: apache公司的,一种把日志处理成流的工具,有缓存机制可以临时存储这些log,还可以把日志分类,比如tomcat的,db的,等等。它叫topic。https://blog.csdn.net/lingbo229/article/details/80761778
kafka的真正作用,同一条消息可能被多个应用消费或使用,不能让每个消费或应用都去访问消息产生的服务,这就要有一个中介,按照topic收集消息,当其他服务需要这些消失时,再主动提供这些消息。这仅仅是基础,解决了多次重复访问占用性能的问题,在此基础上,它还有一大堆的优点,谁用谁知道,redis跟它比可能是一个小插件的意思https://www.zhihu.com/question/53331259
Apache kafka是消息中间件的一种,我发现很多人不知道消息中间件是什么,在开始学习之前,我这边就先简单的解释一下什么是消息中间件,只是粗略的讲解,目前kafka已经可以做更多的事情。
举个例子,生产者消费者,生产者生产鸡蛋,消费者消费鸡蛋,生产者生产一个鸡蛋,消费者就消费一个鸡蛋,假设消费者消费鸡蛋的时候噎住了(系统宕机了),生产者还在生产鸡蛋,那新生产的鸡蛋就丢失了。再比如生产者很强劲(大交易量的情况),生产者1秒钟生产100个鸡蛋,消费者1秒钟只能吃50个鸡蛋,那要不了一会,消费者就吃不消了(消息堵塞,最终导致系统超时),消费者拒绝再吃了,”鸡蛋“又丢失了,这个时候我们放个篮子在它们中间,生产出来的鸡蛋都放到篮子里,消费者去篮子里拿鸡蛋,这样鸡蛋就不会丢失了,都在篮子里,而这个篮子就是”kafka“。
鸡蛋其实就是“数据流”,系统之间的交互都是通过“数据流”来传输的(就是tcp、http什么的),也称为报文,也叫“消息”。
消息队列满了,其实就是篮子满了,”鸡蛋“ 放不下了,那赶紧多放几个篮子,其实就是kafka的扩容。
各位现在知道kafka是干什么的了吧,它就是那个"篮子"
作者:极限求知者
链接:https://www.zhihu.com/question/53331259/answer/241614605
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。
- 消息系统:解耦和生产者和消费者、缓存消息等。
- 用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
- 运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
- 流式处理:比如spark streaming和storm
- 事件源
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
flume:
https://blog.csdn.net/gyshun/article/details/79710534
flume的具体用法:
https://flume.apache.org/FlumeUserGuide.html#avro-sink
flume也有kafka的缓存功能,但是有差异,请看文档
flume的使用方式:在服务器上装一个flume agent用于搜集,也叫数据采集器。再在别的server上搭一个flume collector
flume agent里又有 source,channel,sink三组件。source是收,channel是短暂存储,sink是传。可以传给存储,也可以传给下一个agent。
flume的配置文件的结构:
xx.channels = xx xxx xxxx xxxx一大堆
https://www.cnblogs.com/oubo/archive/2012/05/25/2517751.html
flume agent 和flume collector的关系和区别 totally have no idea。新的flume已经没有collector的概念了貌似,
为什么用flume?因为flume的数据处理和很多封装的source和sink,且flume可以处理很大的数据量,即专门为大数据设计
Flume does have some features that makes it attractive to be a data ingestion and simpleevent processing framework. The key benefit of Flume is that it supports many built-in sources and sinks, which you can use out of box. If you use Kafka, most likely you have to write your own producer and consumer. Of course, as Kakfa becomes more and more popular, other frameworks are constantly adding integration support for Kafka. For example, Apache Storm added Kafka Spout in release 0.9.2, allowing Storm topology to consume data from Kafka 0.8.x directly.
Kafka does not provider native support for message processing. So mostly likely it needs to integrate with other event processing frameworks such as Apache Storm to complete the job. In contrast, Flume supports different data flow models and interceptors chaining, which makes event filtering and transforming very easy. For example, you can filter out messages that you are not interested in the pipeline first before sending it through the network for obvious performance reason. However, It is not suitable for complex event processing, which I will address in a future post.
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
fluentd: 与flume的区别:Fluentd is easier to install and maintain and has better documentation and support than Flume and Scribe
fluent教程
https://docs.fluentd.org/installation/install-by-rpm
采用JSON统一数据/日志格式是它的另一个特点。相对去Flumed,配置也相对简单一些
搭建fluentd:前期准备(并没有准备),执行脚本安装(curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent3.sh | sh),启动daemon(/usr/lib/systemd/system/td-agent,必须成功),开放端口8888(参见linux基本命令之端口处理,centos7),执行测试命令: curl -X POST -d 'json={"json":"message"}' http://192.168.153.132:8888/debug.test。发现已经追加到日志文件的末尾(/var/log/td-agent/td-agent.log),要修改配置在哪里改?在这里/etc/td-agent/td-agent.conf
主要用法就是:安装,启动daemon,然后设置配置文件(/etc/td-agent/td-agent.conf),然后测试(运行监听的程序)
》》》》》》》》》》》》》》》》》》》》》》》
flume语法(https://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html):
先定义一个config文件,在启动flume的时候可以调用这个配置文件,比如:
bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=INFO,console 其中example.conf就是要使用的 配置文件。
里面的语法格式:首先定义都有哪些channel,source,和sink,其中多个时可以放在一起,用空格隔开,比如
agent.channel = xx xxx xxxx xyxyxy …… 其中的“agent”就是个别名,用于在命令行里调用,比如上面的a1
定义好三大件后开始单独配置,语法如下:
agent.channel.xx.type = xxx
原理就是类似于成员变量赋值。
一次赋值参数给 source和sink,有很多参数可配置。可以引入环境变量,比如 ${xxxx}
具体的参数以及值:
比如sink里的type的Avro,这个是个专业术语 ,是一种数据结构,中文名数据序列化系统(https://www.cnblogs.com/Henry-pan/p/7242584.html),典型的基于json的数据结构。便于交互
checkpoint 和datadirs:其中datadirs是日志存储位置(可以是多个的之间用逗号隔开),checkpoint是啥鬼??该磁盘上的检查点,定期进行备份的,防止flume崩了后找不到之前的日志
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
fluentd的语法(https://docs.fluentd.org/configuration/config-file):
配置文件,固定,往里面不停的扔管道,重要参数是source和match。替代flume的source和sink的原理
》》》》》》》》》》》》》
两种实现方式:
方式一:线路一:flume收集日志,发送给flume collector,collector发给splunk。线路二:kafka直接从tomcat拿日志,然后扔给elasticsearch后续处理。
方式二:fluentd直接收集
》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉
实现方式之一:
kafka+fluentd,从app 上搜集日志并传给kafka:
数据流: 一个spring boot项目使用log4j2作为日志处理插件(具体方法见java篇),将日志输出到 绑定的volume内,然后fluent的配置文件里设定从这个文件读取数据,并在文件里配置将获取的日志发送到kafka。这个过程全部由fluentd完成。
框架: kafka,springboot,fluentd的搭建: kafka是采用已有的搭好的kafka平台,每个application都是一个使用者配置在kafka内(kafka里叫做topic。类似于kubernetes的pod),这个kafka也可以理解成一个单独服务。然后创建springboot的镜像和fluentd的镜像。然后通过kubernetes把这两个镜像部署在一个pod内。部署后,fluentd就可以从springboot指定的日志文件内抓取日志并扔给kafka下一步处理。
具体实现:
spring boot,见java片
fluentd:很关键,首先要进行配置。配置文件可以方在任何地方,但是一定要fluentd能读取。然后fluentd执行。配置文件里面有三大块(source,filter,match)。其中source是拿到数据(里面的type决定了获取数据的方式,比如使用tail,即类似于Linux 命令从某个文件tail数据。type设定tail后,还要设定一个format,可以设置为none,也可以设置为json,如果要设置成json,app的日志输出格式必须也是json的,否则会报pattern not matched,还有个参数是tag,这个tag决定了match里去哪个source拿数据,所以是一个标签),第二步是filter,暂时还没用,母鸡。第三部是match(match就是用match 后面的名称决定去哪个source拿到数据,然后下面定义type比如kafka,然后定义outputformat之类的,还有broker(broker即kafka的地址)的域名加端口。这就是转发给哪个kafka),这个设置就可以实现日志的第一步流转。从app传输到kafka
几个坑:
1.fluentd自己会记住读取的文件的位置,有数据变化时,它会继续上次的位置读。所以如果某次输入的是json的一部分,那就会报格式错误
2.tag是一个标签,可以随便定义,主要是用在match上用来识别从哪个source拿数据。tag会把日志打一个标签。
具体的fluentd的部署方式:正在准备拉代码并攻略
fluentd的配置文件:针对转发至kafka的场景:
@type tail
path /log/justin.log
time_format %Y-%m-%dT%H:%M:%S.%NZ
tag zed-justin.*
format json
read_from_head true
@type record_transformer
enable_ruby
topic zed-justin
#NOTE: Please change broker and zookeeper hosts here!
@type kafka
brokers 域名1:端口,域名2:端口
default_topic zed-justin
output_data_type json
output_include_tag false
output_include_time false
max_send_retries 3
required_acks 0
ack_timeout 15
》》》》》》》》》》》》》》》》》》》》》》》》》》
未完待续待整理