赞
踩
本项目是基于Kafka的一个日志收集分析平台,用到的主要技术有nginx、filebeat、Kafka、zookeeper、python、mysql等。做完这个项目,你对于技术的整合使用将会有更进一步的体会。大概的流程就是使用nginx集群模拟用户访问网站的行为,让其产生nginx的access日志,然后由filebeat收集这个日志,再统一吐到Kafka中,然后使用python的pykafka模块编写一个消费者,对Kafka的数据进行清洗,解析出日志中IP所属的省份和运营商以及带宽和时间,通过设置阈值,达到每分钟监控、邮件报警,最后再将分析后存到mysql数据库中。
项目目标主要防止某个省份的某个运营商的流量突然增大,导致服务器异常,起到监控预警作用。
该项目分为以下几个模块:用户—>代理集群—>web集群—>kafka和zookeeper集群—>消费者—>数据库
nginx是一个高性能的web服务器,但是由于其只能展示静态页面,所以通常我们不会吧一个完整项目部署在nginx上,而是通常用nginx来做负载均衡以及反向代理。
反向代理就是代理服务器,为服务器作代理人,站在服务器这边,它就是对外屏蔽了服务器的信息,常用的场景就是多台服务器分布式部署,像一些大的网站,由于访问人数很多,就需要多台服务器来解决人数多的问题,这时这些服务器就由一个反向代理服务器来代理,客户端发来请求,先由反向代理服务器,然后按一定的规则分发到明确的服务器,而客户端不知道是哪台服务器。常常用nginx来作反向代理。(想象一下每个人都是访问www.baidu.com,但是百度绝对不可能只有一个服务器接受访问)
负载:就是Nginx接受请求
均衡:Nginx将收到的请求按照一定的规则分发到不同的服务器进行处理
nginx支持多种不同的负载均衡算法,如轮询、ip_hash、url_hash等
关于nginx的更多知识可以查看我的另外一篇博客:nginx相关内容以及配置文件详解
在第一个集群中,我们使用nginx来做负载均衡以及反向代理。
负载均衡是指我们将客户端的访问请求,按照某种nginx指定的算法分配到web集群中的服务器上,这样可以减少某一台服务器的重担,避免所有请求都在一台服务器上,使其分散开来。并且如果某台服务器挂掉了,nginx的负载均衡策略也会帮我们转发到起到服务器上去。
反向代理是指我们使用nginx做了一个转发的功能,不让客户端的请求直接发送到web服务器上,这样可以提高我们服务器的安全性,不让客户端知道我们真实服务器的IP地址,可以避免一些黑客的攻击
之前也有使用DNS做负载均衡的,就是将一个域名(类似于www.sc.com)解析成多个IP地址,一般来说会轮询的方式去解析成各个IP。但是如果其中一个服务器挂了,DNS不会立马将这个IP地址从解析列表中去掉,还是会解析成挂掉的IP,可能会造成访问失败。虽然客户端有重试,但是还是会影响用户体验。
在第二个集群中,我们使用nginx来展示静态页面,并且产生访问日志
filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Kafka中进行索引。
启动filebeat时,它将启动一个或多个输入,这些输入将在为日志数据指定的位置中查找。对于Filebeat所找到的每个日志,Filebeat都会启动收集器。每个收集器都读取单个日志以获取新内容,并将新日志数据发送到libbeat,libbeat将聚集事件,并将聚集的数据发送到Filebeat配置的输出。
filebeat在整个项目中扮演的是生产者的角色,它主要的作用是用来收集nginx产生的数据。你肯定会想,nginx产生的数据为什么不直接发送到kafka中,而是要经过filebeat这个步骤呢?这是因为,我们有多个web服务器,每个web服务器产生的日志都不相同,如果一个一个的发送给kafka,效率非常低下,而且不方便统一管理,这对于kafka取数据来说也是非常不方便的。
Filebeat之所以能保证事件至少被传递到配置的输出一次,没有数据丢失,是因为filebeat将每个事件的传递状态保存在文件中。在未得到输出方确认时,filebeat会尝试一直发送,直到得到回应。若filebeat在传输过程中被关闭,则不会再关闭之前确认所有事件。任何在filebeat关闭之前未确认的事件,都会在filebeat重启之后重新发送。这可确保至少发送一次,但有可能会重复。可通过设置shutdown_timeout 参数来设置关闭之前的等待事件回应的时间(默认禁用)。
将文件状态记录在文件中(默认在/var/lib/filebeat/registry)。此状态可以记住Harvester收集文件的偏移量。若连接不上输出设备,如ES等,filebeat会记录发送前的最后一行,并再可以连接的时候继续发送。Filebeat在运行的时候,Prospector状态会被记录在内存中。Filebeat重启的时候,利用registry记录的状态来进行重建,用来还原到重启之前的状态。每个Prospector会为每个找到的文件记录一个状态,对于每个文件,Filebeat存储唯一标识符以检测文件是否先前被收集。
kafka又称为消息中间件:消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。
Kafka是一个分布式的基于发布订阅的消息系统,它是一种消息队列,一般用来做日志的处理。
多个broker,多个partition,多个replica
方便数据清理,Kafka可以按时间或者按数据大小两个维度清理数据(任意一个条件满足,都可以触发日志清理),不会永久保存,定期保存,默认是保存七天(可修改Kafka的配置文件server.properties 中的log.retention.hours这个参数)
[root@nginx-kafka01 data]# ls
nginxlog-0
__consumer_offsets-11
[root@nginx-kafka01 data]# cd nginxlog-0/
[root@nginx-kafka01 nginxlog-0]# ls
00000000000000000000.index 00000000000000000000.timeindex
00000000000000000000.log leader-epoch-checkpoint
*.log文件存放的真正的kafka的数据,*.index存放的是索引
log.segment.bytes=1073741824 (可以通过Kafka配置文件server.properties中的log.segment.bytes设置的每个段的大小)
Kafka3.0版本已经脱离zookeeper,Kafka自己实现zookeeper功能,通过KRaft进行了自己的集群管理
目前我使用的zookeeper版本是3.6.3版本,Kafka是2.12版本
mysql数据库中的表需要自己先建好
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。