Filebeat由两个主要组成部分组成:prospector(探勘者)和 harvesters(矿车)。这些组件一起工作来读取文件并将事件数据发送到指定的output。
启动Filebeat时,它将启动一个或多个输入,这些输入将在为日志数据指定的位置中查找。对于Filebeat所找到的每个日志,Filebeat都会启动收集器。每个收集器都读取单个日志以获取新内容,并将新日志数据发送到libbeat,libbeat将聚集事件,并将聚集的数据发送到为Filebeat配置的输出。
Filebeat可以保持每个文件的状态,并且频繁地把文件状态从注册表里更新到磁盘。这里所说的文件状态是用来记录上一次Harvster读取文件时读取到的位置,以保证能把全部的日志数据都读取出来,然后发送给output。如果在某一时刻,作为output的ElasticSearch或者Logstash变成了不可用,Filebeat将会把最后的文件读取位置保存下来,直到output重新可用的时候,快速地恢复文件数据的读取。在Filebaet运行过程中,每个Prospector的状态信息都会保存在内存里。如果Filebeat出行了重启,完成重启之后,会从注册表文件里恢复重启之前的状态信息,让FIlebeat继续从之前已知的位置开始进行数据读取。
适用于集群环境下,服务多,且部署在不同机器
Logstash | Filebeat | |
---|---|---|
内存 | 大 | 小 |
CPU | 大 | 小 |
插件 | 多 | 多 |
功能 | 从多种输入端采集并实时解析和转换数据并输出到多种输出端 | 传输 |
轻重 | 相对较重 | 轻量级二进制文件 |
过滤能力 | 强大的过滤能力 | 有过滤能力但是弱 |
进程 | 一台服务器只允许一个logstash进程,挂掉之后需要手动拉起 | |
原理 | Logstash使用管道的方式进行日志的搜集和输出,分为输入input处理filter(不是必须的)输出output,每个阶段都有不同的替代方式 | 开启进程后会启动一个或多个探测器(prospectors)去检测指定的日志目录或文件,对于探测器找出的每一个日志文件,filebeat启动收割进程(harvester) ,每一个收割进程读取一个日志文件的新内容,并发送这些新的日志数据到处理程序(spooler),处理程序会集合这些事件,最后filebeat会发送集合的数据到你指定的地点 |
集群 | 单节点 | 单节点 |
输出到多个接收方 | 支持 | 6.0之前支持 |
二次开发或者扩展开发 | 难 | 易 |
Kafka是一种消息队列,主要用来处理大量数据状态下的消息队列,一般用来做日志的处理。既然是消息队列,那么Kafka也就拥有消息队列的相应的特性了。
可以在系统中起到“削峰填谷”的作用,也可以用于异构、分布式系统中海量数据的异步化处理。
主要原因是由于在高并发环境下,同步请求来不及处理,请求往往会发生阻塞。比如大量的请求并发访问数据库,导致行锁表锁,最后请求线程会堆积过多,从而触发 too many connection 错误,引发雪崩效应。
我们使用消息队列,通过异步处理请求,从而缓解系统的压力。消息队列常应用于异步处理,流量削峰,应用解耦,消息通讯等场景。
当前比较常见的 MQ 中间件有 ActiveMQ、RabbitMQ、RocketMQ、Kafka 等。
解耦合
耦合的状态表示当你实现某个功能的时候,是直接接入当前接口,而利用消息队列,可以将相应的消息发送到消息队列,这样的话,如果接口出了问题,将不会影响到当前的功能。
异步处理
异步处理替代了之前的同步处理,异步处理不需要让流程走完就返回结果,可以将消息发送到消息队列中,然后返回结果,剩下让其他业务处理接口从消息队列中拉取消费处理即可。
流量削峰
高流量的时候,使用消息队列作为中间件可以将流量的高峰保存在消息队列中,从而防止了系统的高请求,减轻服务器的请求处理压力。
高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒
可扩展性:kafka集群支持热扩展
持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
高并发:支持数千个客户端同时读写
Kafka的消费模式主要有两种:
一种是一对一的消费,也即点对点的通信,即一个发送一个接收。
消息生产者发布消息到Queue队列中,通知消费者从队列中拉取消息进行消费。消息被消费之后则删除,Queue支持多个消费者,但对于一条消息而言,只有一个消费者可以消费,即一条消息只能被一个消费者消费。
第二种为一对多的消费,即一个消息发送到消息队列,消费者根据消息队列的订阅拉取消息消费。
这种模式也称为发布/订阅模式,即利用Topic存储消息,消息生产者将消息发布到Topic中,同时有多个消费者订阅此topic,消费者可以从中消费消息,注意发布到Topic中的消息会被多个消费者消费,消费者消费数据之后,数据不会被清除,Kafka会默认保留一段时间,然后再删除。
Kafka像其他Mq一样,也有自己的基础架构,主要存在生产者Producer、Kafka集群Broker、消费者Consumer、注册消息Zookeeper
producer就是生产者,是数据的入口。Producer在写入数据的时候永远的找leader,不会直接将数据写入follower
1. 先从集群获取分区的leader
2. Producter将消息发送给leader
3. Leader将消息写入本地文件
4. Followers从leader同步消息
5. Follower将消息写入本地后向leader发送ACK确认消息
6. Leader收到所有副本的ACK后,向producter发送ACK
//注:消息写入leader后,follower是主动的去leader进行同步的
便在集群中扩展,每个Partition可以通过调整以适应它所在的机器,而一个topic又可以有多个Partition组成,因此整个集群就可以适应任意大小的数据了;
可以提高并发,因为可以以Partition为单位读写了。
producer采用push模式将数据发布到broker,每条消息追加到分区中,顺序写入磁盘,所以保证同一分区内的数据是有序的。
数据会写入到不同的分区,分区的目的是
方便扩展:因为一个topic可以有多个partition,所以我们可以通过扩展机器去轻松的应对日益增长的数据量。
提高并发:以partition为读写单位,可以多个消费者同时消费数据,提高了消息的处理效率。
类似于负载均衡,当我们向某个服务器发送请求的时候,服务端可能会对请求做一个负载,将流量分发到不同的服务器,那在kafka中,如果某个topic有多个partition,producer又怎么知道该将数据发往哪个partition呢?kafka中有几个原则:
partition在写入的时候可以指定需要写入的partition,如果有指定,则写入对应的partition。
如果没有指定partition,但是设置了数据的key,则会根据key的值hash出一个partition。
如果既没指定partition,又没有设置key,则会轮询选出一个partition。
保证消息不丢失是一个消息队列中间件的基本保证,那producer在向kafka写入消息的时候,怎么保证消息不丢失呢?其实上面的写入流程图中有描述出来,那就是通过ACK应答机制!在生产者向队列写入数据的时候可以设置参数来确定是否确认kafka接收到数据,这个参数可设置的值为0、1、all。
0代表producer往集群发送数据不需要等到集群的返回,不确保消息发送成功。安全性最低但是效率最高。
1代表producer往集群发送数据只要leader应答就可以发送下一条,只确保leader发送成功。
all代表producer往集群发送数据需要所有的follower都完成从leader的同步才会发送下一条,确保leader发送成功和所有的副本都完成备份。安全性最高,但是效率最低。
ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,它提供了一项基本服务:分布式锁服务。分布式应用可以基于它实现更高级的服务,实现诸如同步服务、配置维护和集群管理或者命名的服务。
Zookeeper服务自身组成一个集群,2n+1个(奇数)服务允许n个失效,集群内一半以上机器可用,Zookeeper就可用。
假设 3台机器组成的集群,可以有允许一台失效,如果有2台失效,这个集群就不可用,1<1.5,一般的搭建zookeeper集群时,以奇数台机器来搭建。目的:是为了提高容错能允许多损失一台。
Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。也就是说 Zookeeper =文件系统+通知机制。
(1)Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。
(2)Zookeepe集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。所以zookeeper适合安装奇数台服务器。
(3)全局数据一致:每个server保存一份相同的数据副本,client无论连接到哪个Server,数据都是一致的。
(4)更新请求顺序执行,来自同一个client的更新请求按其发送顺序依次执行,即先进先出。
(5)数据更新原子性,一次数据更新要么成功,要么失败。
(6)实时性,在一定时间范围内,client能读到最新数据。
ZooKeeper数据模型的结构与Linux文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode。每一个ZNode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识。
提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。
统一命名服务
在分布式环境下,经常需要对应用/服务进行统一命名,便于识别。例如:IP不容易记住,而域名容易记住。
统一配置管理
服务器动态上下线
客户端能实时洞察到服务器上下线的变化。
软负教均衡
在Zookeeper中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求。
服务器初始化启动。
服务器运行期间无法和Leader保持连接。
SID:服务器ID。用来唯一标识一台ZooKeeper集群中的机器,每台机器不能重复,和myid一致。
ZXID:事务ID。ZXID是一个事务ID,用来标识一次服务器状态的变更。在某一时刻,集群中的每台机器的zxID值不一定完全一致,这和ZooKeeper服务器对于客户端"更新请求"的处理逻辑速度有关。
Bpoch:每个Leader任期的代号。没有Leader时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加
服务基于ELK部署,具体请参照上篇文章:ELK日志分析系统
tar zxf apache-zookeeper-3.7.1-bin.tar.gz
mv apache-zookeeper-3.7.1-bin /usr/local/zookeeper-3.7.1
cd /usr/local/zookeeper-3.7.1/conf/
cp zoo_sample.cfg zoo.cfg
#修改配置文件
vim zoo.cfg
12 dataDir=/usr/local/zookeeper/data
13 dataLogDir=/usr/local/zookeeper/logs
30 server.1=192.168.48.13:3188:3288
31 server.2=192.168.48.14:3188:3288
32 server.3=192.168.48.16:3188:3288
#创建数据与日志存放目录
mkdir data logs
#设置机器节点号
echo 1 > data/myid #三台服务器ID号分别设置为1、2、3
#启动服务
cd /usr/local/zookeeper-3.7.1/bin
./zkServer.sh start
./zkServer.sh status
修改配置文件:vim zoo.cfg,三个服务都要改,不能一样
#上传并解压安装包
tar zxf kafka_2.13-2.7.1.tgz
mv kafka_2.13-2.7.1 /usr/local/kafka
#修改配置文件
cd /usr/local/kafka/config/
vim server.properties
broker.id=1 #21行修改服务
#30行修改监听地址为本机
listeners=PLAINTEXT://192.168.48.13:9092
#123行添加zookeeper集群地址,逗号分割
zookeeper.connect=192.168.48.13:2181,192.168.48.14:2181,192.168.48.16:2181
#更改环境变量
vim /etc/profile
export KAFKA_HOME=/usr/local/kafka
export PATH=$PATH:$KAFKA_HOME/bin
source /etc/profile
#启动服务
cd /usr/local/kafka/config/
kafka-server-start.sh -daemon server.properties
netstat -antp | grep 9092
下文中命令所提的test为topic名
kafka-topics.sh --create --zookeeper 192.168.48.13:2181,192.168.48.14:2181,192.168.48.16:2181 --replication-factor 2 --partitions 3 --topic test
kafka-topics.sh --list --zookeeper 192.168.48.13:2181,192.168.48.14:2181,192.168.48.16:2181
kafka-topics.sh --describe --zookeeper 192.168.48.13:2181,192.168.48.14:2181,192.168.48.16:2181
kafka-console-producer.sh --broker-list 192.168.48.13:2181,192.168.48.14:2181,192.168.48.16:2181 --topic test
kafka-console-consumer.sh --bootstrap-server 192.168.48.13:9092,192.168.48.14:9092,192.168.48.16:9092 --topic test --from-beginning
kafka-topics.sh --zookeeper 192.168.48.13:2181,192.168.48.14:2181,192.168.48.16:2181 --alter --topic test --partitions 6
kafka-topics.sh --delete --zookeeper 192.168.48.13:2181,192.168.48.14:2181,192.168.48.16:2181 --topic test
cd /usr/local/kafka/bin
kafka-topics.sh --create --zookeeper \
192.168.48.13:2181,192.168.48.14:2181,192.168.48.16:2181 \
--partitions 3 \
--replication-factor 2 \
--topic test
#查看topic详情
kafka-topics.sh --describe --zookeeper 192.168.48.16:2181
发布消息
kafka-console-producer.sh --broker-list 192.168.48.13:9092,192.168.48.14:9092,192.168.48.16:9092 --topic test
在另外一台机器消费信息
kafka-console-consumer.sh --bootstrap-server 192.168.48.16:9092 --topic test --from-beginning
#上传并解压filebeat
tar xf filebeat-6.5.4-linux-x86_64.tar.gz
mv filebeat-6.5.4-linux-x86_64 /usr/local/filebeat
#修改配置文件
vim /usr/local/filebeat/filebeat.yml
#启动服务
cd /usr/local/filebeat/
./filebeat -c filebeat.yml &
netstat -antp|grep filebeat
创建
kafka-topics.sh --create --zookeeper 192.168.48.13:2181,192.168.48.14:2181,192.168.48.16:2181 --replication-factor 1 --partitions 1 --topic nginx-es
查看
kafka-topics.sh --describe --zookeeper 192.168.48.16:2181
vim /etc/logstash/conf.d/nginx_log.conf
input {
kafka {
topics =>"nginx-es"
decorate_events => true
bootstrap_servers => "192.168.48.13:9092,192.168.48.14:9092,192.168.48.16:9092"
}
}
output {
elasticsearch {
hosts => ["192.168.48.3:9200"]
index =>"nginx-%{+YYYY.MM.dd}"
}
}
访问:192.168.48.3:9100访问nginx日志是否存在
filebeat取代logstash进行日志收集,因为logstash太过消耗系统资源,而filebeat是轻量级服务
filebeat是生产者,将收集的日志发送的kafka
logstash是消费者,将日志进行过滤并发送到ES集群存储,并最终交由kibana展示