项目描述
搭建nginx web静态网页,收集访问日志access.log,对access.log做数据清洗,获取所需的流量信息,并存入数据库以达到数据的持久化
项目环境
centos7机器共3台,nginx1.20、filebeat7.17、kafka2.12、zookeeper3.6、python3.6、mariadb5.5
项目步骤
1、使用nginx搭建一个web页面
2、搭建kafka集群,搭建zookeeper集群
3、部署filebeat,收集日志吐到kafka
4、编写消费者脚本,取出日志并做数据清洗
5、最后将收集到的流量存入数据库
架构图
项目原理
1.负载均衡
负载均衡的作用
负载均衡就是优化资源使用,最大吞吐量,最小化响应时间并且避免任何单一资源的过载,简单来说就是做流量分摊,避免某一台服务器的流量过大
怎么做负载均衡
我使用DNS做负载均衡,主要是因为它实现比较灵活、方便,简单易行,成本低,修改 etc下的 hosts 文件,添加域名映射
DNS做负载均衡:一个域名可以解析成多个ip地址,一般来说会以轮询的方式去解析成各个ip。但是如果其中一个服务器挂了,DNS不会立马将这个ip地址去掉,还是会解析成挂掉的ip,可能会造成访问失败。虽然客户端有重试机制,但是还是会影响用户体验
DNS解析的步骤:
1、找浏览器里面的缓存
2、找本地hosts文件 (Linux下的/etc/hosts文件)
3、找本地域名服务器(Linux下的/etc/resolv.conf文件)
还可以使用nginx做负载均衡
2.web应用
搭建nginx服务,这里只是搭建一个静态页面,用来做测试,用户访问这个nginx页面,生成访问日志access.log
3.kafka
消息中间件
消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。
常见的消息中间件:ActiveMQ、RabbitMQ、RocketMQ、Kafka、ZeroMQ等,其中应用最为广泛的要数RabbitMQ、RocketMQ、Kafka 这三款。
kafka采取的通信模式
发布订阅
kafka的常见用途
日志收集、业务解耦、流量削峰
用kafka做日志统一收集的好处
1、故障发生时方便定位问题
2、日志的集中管理,后续需要日志的程序直接到kafka获取即可,尽可能减少日志处理对nginx的影响
常见名词
broker:节点
topic:主题
消费者订阅了哪个topic,就可以消费哪个topic里的资源
partition:分区
提高吞吐量,提高并发
replica:副本
就是完整的分区备份
broker数量如果和replica一致,则可以坏掉n-1台机器
leader和follower
leader只有一个,follower可以有多个
生产者和消费者只和leader打交道,leader再根据ISR同步给follower
生产者跟任何一台broker连接都可以,broker会返回当前请求副本的leader的信息,最后生产者再跟leader交互
kafka如何保证高可用
多个broker+多个partition+多个replica
ISR: in-sync-replica 列表集合,即需要同步的follower的集合
如果说6个副本, 1个leader 5 follower
有一条消息来了,leader怎么知道要同步哪些副本呢?
1、根据ISR来,如果一个follower挂了,那就从这个列表里删除了
2、如果一个follower卡住了或者同步过慢,它也会从ISR里删除
3、如果有一个机器宕机了,后续启动之后想要重新加入ISR,必须得同步到High Watermark最高水位线才行
如何保证数据的一致性
保证生成数据一致性
producer可以通过request.required.acks设置,ack可以为0,1,-1
ack=0 生产者不需要接受响应,发完就发下一条
ack=1(默认) leader收到就会给生产者发送响应,然后再发下一条
ack=-1 ISR列表中的每一个副本都接收到,才给生产者响应,才会发送下一条
0最快但不安全,1中等,-1最慢但最安全
保证消费数据一致性
引入了High Watermark 机制,只能消费ISR列表里偏移量最少的副本消息数量
为什么还要用filebeat / 生产者
filebeat是轻量级日志采集器,用来将nginx里面收集的日志送给kafka,这里的filebeat充当了生产者的身份
消费者
同一个消费组,里面的消费者同一时刻只能消费一个partition,那么消费者怎么知道自己消费到哪里了,下次从哪里开始消费?
消费者消费的时候,会记录自己的消费偏移量,消费偏移量可以保存在本地,也可以保存在kafka里面,在kafka里面有一个topic叫__consumer__offsets用来记录消费偏移量
数据存储
1、文件夹:<topic_name>-<分区号>
2、每一个partition的数据都是由很多个segment存储的,每一个segment由一个index和log文件组成
3、分出多个segment便于数据处理
kafka可以按照两个维度清理数据:
1、按大小
2、按时间
任意一个条件满足,都可以触发日志清理
4.zookeeper
ZooKeeper 为分布式应用提供了高效且可靠的分布式协调服务,提供了诸如统一命名服务、配置管理和分布式锁等分布式的基础服务。
我这里使用zk,主要是用于管理kafka
zk管理kafka
1、保存kafka的元数据,topic,partiton,replia
2、选举kafka controller,通过抢占的方式选举,选举出的kafka controller管理kafka副本的leader和follower的同步、选举
zk的选举
一致性算法,少数服从多数原则,票数过半的当选为leader
操作
客户端连接任意一台zk都可以操作,但是数据新增修改等事务操作必须在leader上运行,客户端如果连接到follower上进行事务操作,follower会返回给leader的ip,最终客户端还是在leader上操作;如果进行查询操作,可以直接连接follower进行查询操作
zk中的leader和follower
follower:查询和选举
leader:数据的写入、修改和同步
数据的同步
1、只要过半的节点同步完成,就表示数据已经写入完成
2、zookeeper不是强一致性,它属于最终一致性
zk的正常使用
1、zk集群中,节点存活数必须要过半,集群才能正常使用
2、zk集群的节点数,一般来说都设置成奇数,方便选举leader