1、项目环境
搭建此次项目的主要用到的技术软件:centos7(三台)、nginx 、kafka、zookeeper 、mysql、celery、filebeat 、python。
2、项目描述
项目主要是关于使用filebeat作为生产者收集前端nginx集群中用户访问nginx web页面时产生的access日志,然后将收集到的日志信息统一存入kafka平台,然后编写python消费者程序对获取到的nginx日志做清洗,解析出日志中ip所在的省份、运营商、带宽等,获取流量信息之后存入mysql数据库中;并通过设置阈值,达到每分钟监控报警。
3、项目目标
主要是防止某个省份的某个运营商的流量突然增大,导致服务器异常,起到监控预警的作用。
4、项目步骤
4.1 项目框架
4.1.1 项目总体流程
分为几个部分:用户访问——>nginx负载均衡——>应用集群(nginx web服务)——>kafka集群(基于zookeeper)——>python消费者程序——>存入mysql数据库
4.1.2 项目详细流程
总体详细流程说明(以个人理解的,如有理解错误的地方请大家帮我指出):
1、用户访问:测试用户通过域名或者代理集群中的某个ip地址来访问web集群中web服务。
2、代理集群:在用户输入www.sc.com之后,dns会给用户一个负载均衡,让用户随机访问到这两台负载均衡器上的任意一台上。这两个负载均衡器都会帮助做代理转发(按照某种算法进行转发),转发到这三台 nginx web服务器上任意一台。
在使用的两个服务器做负载均衡上安装keepalived实现高可用,定义这两台机器互为主备,实现双vip功能。
**算法指的是:**1、轮询 2、加权轮询 3、ip_hash
依据ip分配方式,指定负载均衡器按照基于客户端IP分配方式,这个方法确保了相同的客户端(ip)请求一致发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。
4、least_hash:最少连接数,哪个机器连接数少就分发给哪个机器。
5、url_hash:按照访问的url的hash结果分配请求,是每个url定向到同一后端服务器上。
6、hash关键值:hash自定义的key。
负载均衡和高可用性是2个概念:
负载均衡:是将很多的请求分散到后端很多的服务器上,用来化解压力的一个软件。
高可用:有2个或者多个服务器(人)做相同的事情,互相备份。
3、web应用集群:这个时候web集群中的服务器上就会产生一个日志,然后我们会在这个nginx web服务器上安装filebeat,filebeat相当于一个生产者的角色,用来收集nginx web服务器上产生的日志。
4、kafka集群:filebeta收集到日志之后,会将数据发送到kakfa集群中,filebeat会去请求kafka集群中的任意一个broker(创建了topic)。因为如果交互的那个broker里面不是partition的leader,那么follower会返回当前请求副本leader的信息,然后filebeat再跟leader交互。这里所有的partition都加了同一个名为nginxlog的topic中。filebeat将数据随机发送给一个partition中的leader之后,(partition中的ISR列表中的会将leader中的数据做一个同步,同步到其他follower上),然后leaer会返回一个ack信息,ack默认为1,leader收到消息就给生产者发送响应,然后filebeat就会接着发送下一条数据,从而保证了发送数据的一致性。
5、zookeeper:是用来管理kafka的,用来保存kafka的元信息、topic、partition、副本信息,通过抢占的方式选举出kafka的controller,这个controller用来管理kakfa副本partition中的leader和follower的选举。而zookeeper本身也是有leader和follower的,它的选举方式是采用一致性算法(zab),根据少数服从多数,票数过半的原则来选举leader。所以在zk集群中,机器存活数必须过半,集群才能正常使用,所以我们通常也会将zk集群的节点数设为奇数个,这是为了方便选举。跟filebeat给Kafka传递数据一样,Kafka连接任意一台zookeeper都可以操作,但是数据新增修改等事务操作必须在leader上运行。
扩展:客户端如果连接到follower上进行事务操作,follower会返回给leader的IP,最终客户端还是在leader上操作,但是可以直接连接follower进行查询操作。
5、消费者:然后我们需要创建一个python消费者程序(使用了pymysql模块)来消费数据(所以是不存在消费组的。如果有消费组的话,在同一个消费组,里面的消费者同一时刻只能消费一个partition的数量。一个消费组里面的每一个消费者可以同时去消费一个topic里面的不同分区里的数据。),获取到kahka里面的数据之后,对数据进行清洗,清洗成我们需要的IP地址、时间、带宽等字段,然后再通过一个淘宝接口,将IP地址解析成省份和运营商。
6、**mysql数据块:**最后再通过一个淘宝的接口和pymysql模块存入数据库中。
5、项目涉及知识详解
5.1、用户
在进行测试时,用户直接访问nginx web也可以,绑定域名访问。例如:www.sc.com这个域名的解析放在Windows的host文件里面,客户机需要使用的。
dns(域名)也可以做负载均衡,就是通过域名(例如www.sc.com)也可以解析成多个ip地址,以轮询的方式去解析各个ip。但是如果一个服务器挂了,dns不会立马将这个地址去掉,还会继续解析成挂掉的ip,可能会造成访问失败。虽然客服端有重试,但是还是会影响用户体验。
5.2 、代理集群
1、在应用集群 nginx web服务前面加反向代理。安全性也会高一点。负载均衡控制也会容易很多。
2、反向代理机中使用keepalived双vip互为主备做高可用,提高资源利用率。
代理集群:www.baidu.com 解析成两个虚拟ip:一个域名可以解析成两个虚拟ip。
假如:当上面一台一号代理机1.5master挂掉之后,下面二号代理机的1.5backup能运行,下一台二号代理机的1.6master也能正常运行;如果二号代理机1.6master挂掉了,也能使用一号代理机上1.6backup进行访问。
5.2.1、反向代理
1、什么是反向代理呢?代理的是什么?
反向代理:代理的是服务器。
正向代理:代理的是客户机(VPN)。
反向代理是充当Web服务器网关的代理服务器。当用户将请求发送到使用反向代理的Web服务器时,他们将先转到反向代理,由该代理将确定是将其路由到Web服务器还是将其阻止。这意味着有了反向代理,我们永远不会与使用它的Web服务器进行直接通信。可以将它们看作web服务器或服务器集群的某种包装器。通过负载平衡和缓存,它们可以保护web免遭攻击,并提供更好的web性能。
2、反向代理是如何工作的?
反向代理完全是服务器端工程师的工作。反向代理它充当服务器的网关,除了通过它们,没有请求能够到达使用它们的服务器。就像用户需要隐私保护,而服务器也是如此的。但是,除了可以防御攻击之外,有些还可以利用反向代理通过负载平衡和缓存来提高其Web性能。
对于使用这种类型代理的服务器或一组服务器。我们将不知道有关实际服务器的任何信息。但是可以知道反向代理的ip地址。当用户使用反向代理向web服务发送请求的时候,用户的请求将会直接发送到这个反向代理服务器上面。
然后,代理会决定如何处理该请求,是将其中继到适当的服务器还是发回禁止的错误响应。如果它授权用户的请求,则它将保存用户的请求副本(包括IP地址),并将用户的请求中继到适当的服务器。
当响应被发送回时,它被发送到反向代理,反向代理将其转发给用户。所有这些都是在短时间内发生的,用户甚至都不会注意到。某些反向代理实际上可以缓存资源,这意味着,如果用户正在寻找的信息已经在缓存中,它不必浪费资源,试图再次获取它,它会直接发送给用户,而不打扰服务器。
3、反向代理服务器端技术
反向代理服务器可以保护 nginx web服务免受各种类型的连接的侵害,或用作过滤、防火墙或其他安全性。
反向代理的3种必要应用程序之一——负载均衡,人们使用反向代理的最重要原因是负载平衡。
高流量的网站通常每分钟处理大量请求,这可能会减慢其系统性能并破坏响应时间。为了确保更好的用户体验和更快的响应,于是就使用了反向代理。它们将具有一组服务器,它们全部执行相同的功能。它没有使一台服务器响应所有请求,而是在服务器之间分配了请求,从而缩短了响应时间,并且不会使任何服务器工作过度。
5.2.2 负载均衡
代理集群中可用dns或者nginx反向代理做负载均衡。
在负载均衡中,当我们向某个服务器发送请求的时候,服务端可能会对请求做一个负载,将流量分发到不同的服务器。
1、什么是负载均衡?
负载均衡是高可用网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。
2、为什么使用负载均衡?
①一个没有负载均衡的 web 架构类似于下图:
在流程图中,我们可以看到用户是直接连接到web服务器,如果这个服务器宕机了,那么用户将无法访问到web服务器。此外,如果同时有很多用户试图访问web服务器,超过了其能处理的极限,就会出现加载速度缓慢或根本无法连接的情况。
②有负载均衡的web框架图如下所示:
通过在后端引入一个负载均衡器和至少一个额外的 web 服务器,就可以缓解这个故障。通常情况下,所有的后端服务器会保证提供相同的内容,以便用户无论哪个服务器响应,都能收到一致的内容。
为解决负载均衡器的单点故障问题,可以将第二个负载均衡器连接到第一个上,从而形成一个集群。这样的话当主负载均衡器发生了故障,就需要将用户请求转到第二个负载均衡器。因为 DNS 更改通常会较长的时间才能生效,因此需要能灵活解决 IP 地址重新映射的方法,比如浮动 IP(floating IP)。这样域名可以保持和相同的 IP 相关联,而 IP 本身则能在服务器之间移动。
负载均衡器可以处理HTTP、HTTPS、TCP、UDP四种请求。
5.3 应用集群(nginx web服务)
应用集群:nginx web服务:仅仅做静态页面展示。在应用web前面加反向代理。安全性也会高一点。负载均衡控制也会容易很多。
用户通过域名或者代理集群中的某个ip地址来访问web集群中web服务的时候会产生nginx访问日志,日志存放在/var/log/nginx/sc_access,然后我们会在服务器上安装filebeat,filebeat相当于一个生产者的角色,用来收集nginx web服务器上的日志。
1、什么是filebeat?filebeat的工作原理是什么?
Filebeat是一个本地文件的日志数据采集器。在服务器上安装客户端后,filebeat会监控日志目录或者指定的日志文件,tail file,追踪读取这些文件(追踪文件的变化,不停的读),并且转发这些信息到MQ中间件,或者直接到elasticsearch或者logstarsh中存放,转发到kafka中进行索引 。
2、filebeat工作流程:
当开启Filebeat程序的时候,它会启动一个或多个探测器去检测指定的日志目录或文件。对于探测器找出的每一个日志文件,Filebeat会启动收集进程,每一个收集进程读取一个日志文件的内容,然后将这些日志数据发送到后台处理程序,后台处理程序会集合这些事件,最后发送集合的数据到output指定的目的地。
3、filebeat如何获取nginx日志信息?
根据filebeat的yaml格式文件的配置:数据和输入和输出来获取信息和发送信息:
#ymal格式
{
“filebeat.inputs”: [ #输入
{ “type”:“log”,
“enabled”:true,
“paths”:[“/var/log/nginx/sc/access.log” #这里在下面做了修改
},
],
}
对filebeat的/etc/filebeat/filebeat.yml的配置文件进行修改。
其中输入(input)为:nginx日志的存放路径(也就是在获取nginx上的日志信息):/var/log/nginx/sc/access.log;
输出(output)为:kafka的同一个topic中(三台安装了kafka的机器都需要配置好各自的ip地址)。
output只支持一个输出。
nginx 的web中的日志只需要吐一次,将数据吐到kafka中,不需要去filebeat里面,如果需要,直接去kafka里面去拿,而且filebeat中只支持一个输出(output)。如果在/etc/filebeat下文件写入多个output会导致服务重启不了。
基于Kafka的nginx日志收集分析与监控平台(2)+https://developer.aliyun.com/article/1557848