Logstash
logstash就是一根具备实时数据传输能力的管道,负责将数据信息从管道的输入端传输到管道的输出端;与此同时这根管道还可以让你根据自己的需求在中间加上滤网,Logstash提供里很多功能强大的滤网以满足你的各种应用场景.
输入输出
input{
syslog{
type => "system-syslog"
port => 514
}
}
output{
stdout{
codec=> rubydebug
}
filter插件
grok插件:能匹配一切数据,将数据拆分和索引, 但是性能和对资源的损耗也很大,但是对于时间来说非常便利
语法格式:%{语法:语义}
默认grok调用的是:/logstash-7.8.0/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns/grok-patterns 这个目录下的正则.
filter{
grok{
match => {"message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}"}
}
Date插件
获取日志时间
date{
match => ["timestamp","dd/MMM/yyyy:HH:mm:ss Z"] #时区偏移量需要用一个字母Z来转换
}
mutate插件
重命名、删除、替换、修改日志事件中的字段
mutate{
gsub => ["referrer","/","-"]
}
Flume
Apche旗下Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据。提供对数据进行简单处理,并写到各种数据接受方(可定制)。
source 可以配置为 netcat (传输工具),指定source监听端口,sink可以配置为flume的logger或者hdfs,source 和 sink 绑定到channel,source、sink 分别运行在不同的线程,通过channel来通信。
启动:bin/flume-ng agent --conf conf/ --conf-file ../job/netcat-flume-logger.conf --name a1 -Dflume.root.logger=INFO,console
居于Java的需要安装jvm
ES数据库
全称 Elasticsearch
ELK:Elasticsearch、Logstash 和 Kibana,MVC模式的3种技术组合体。E为M,K为V,L为C。
HDFS
Hadoop Distibuted File System,一个分布式存储的文件系统。
由主从节点构成,主节点NameNode是主管,记录文件信息并分派存储节点。从节点DataNode专门负责数据存储,用多个节点存储副本。
文件访问延时较高,不适合有低延时要求的访问。
不支持并发写入,只能单线程写。
不支持文件的随机修改,只能append写入。
适合大数据大文件存储,不适合大量小文件存储。存储小文件会使主节点目录信息和块信息占用大量内存。
写流程
读流程
消息中间件
地位
常用的消息中间件:
ActiveMQ:Java写的Apache开源产品,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信,中小型企业中应用广泛
Kafka
: 基于TCP协议的,由 Linkedin
公司开发的,开源的基于发布订阅模式的分布式的消息引擎系统。
RocketMQ:阿里系下开源的一款分布式、队列模型的消息中间件,参照 kafka 设计用Java写的,多用于订单交易系统。
RabbitMQ
:Erlang(爱立信开发的面向并发的编程语言)写的开源的消息队列,支持很多的协议,多用于进行企业级的ESB
整合。
ZeroMQ
:号称最快的消息队列系统,专门为高吞吐量/低延迟的场景开发,在金融界的应用中经常使用,偏重于实时数据通信场景。
kafka:
作用:搜集生产者的数据给消费者使用,搜集到的所有数据都持久化存储在磁盘中。
模型:分布式集群服务,多台部署多个broker。多个broker以分区为单位通过生产者发送策略实现负载均衡的接收数据。
toppic:生产者带topic发送数据,消费者按topic订阅数据。topic划分分区,以分区为单位把topic分布在集群中。分区以segment为单位存储数据。
生产者怎么选择发送数据给哪一个boker?发送数据时指定分区,以分区的key或者随机key对分区数取模得到分区,通过分区获取这个分区的leader(leader 和 follower是以分区为单位注册到zookeeper中的,知道分就能从zookeeper中知道leader是哪一个broker)。
消费者怎么知道去消费哪一个分区?一个消费者组消费一个topic,消费者组里面的多个消费者(多个线程)分布式并行消费同一个topic的多个分区,以轮询或者range方式指定哪一个consumer消费哪一个分区。
由于消息是以追加到分区中的,多个分区顺序写磁盘的总效率要比随机写内存还要高,是Kafka高吞吐率的 重要保证之一。
如何往已经部署好的Kafka集群里面添加机器?从已经部署好的Kafka节点中复制相应的配置文件,然后把里面的broker id修改成全局唯一 的,最后启动这个节点即可将它加入到现有Kafka集群中。
数据库选择
MongoDB
如果你的数据规模较大,对数据的读性能要求很高,数据表的结构需要经常变,有时还需要做一些聚合查询,选MongoDB;
ES
如果你需要构造一个搜索引擎或者你想搞一个看着高大上的数据可视化平台,并且你的数据有一定的分析价值或者你的老板是土豪,选ElasticSearch;
HBase
是Hadoop的数据库,一个分布式、可扩展、大数据的存储。
如果你需要存储海量数据,连你自己都不知道你的数据规模将来会增长多么大,那么选HBase。
Hive
是一个建立在Hadoop上的开源数据仓库软件,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL的查询模型,称为hive查询语言(HQL),用于访问和分析存储在Hadoop文件中的大型数据集。
hive核心是将HQL转换为MapReduce程序,然后将程序提交到Hadoop群集执行。Hive由Facebook实现并开源。
Mapreduce
是一个分布式运算程序的编程框架,是用户开发“基于 hadoop 的数据分析 应用”的核心框架。
netcat(nc)
一款强大的命令行网络工具,用来在两台机器之间建立TCP/UDP
连接,并通过标准的输入输出进行数据的读写。
如和百度建立TCP连接: nc www.baidu.com 80 ;
如端口扫描:nc -zv localhost 9995-9999;
如聊天:建立tcp连接后发送消息:
root@ubuntu:~# nc -l 9999 //32.98监听9999端口
root@ubuntu:~# nc 192.168.32.98 9999 //32.99连接32.98的9999端口 并发送消息
nihao
wo shi 32.99
如传送文件:
32.99上监听等待文件 : root@ubuntu:~# nc -l 9999 > test.log
32.98上发送文件: nc 192.168.32.99 9999 < 3.txt