目录
项目描述
通过模拟企业的环境,实现一个双VIP高可用的Web服务器集群,使用Nginx做负载均衡,用中间件kafka收集用户访问的Nginx Web集群日志,用淘宝接口清洗数据,得出IP所属的 isp. provinEe和bandwidth并入库。
项目环境
entos8台,Nginx(1. 14. 1), keepalived(2. 1.5),filebeat,kafka(2.12),zookeeper,mysql等
项目原理:
前面写的博客讲解了原理
1.1kafka必备知识
1.2kafka的数据可靠性和一致性
kafka学习(2)数据的可靠性和一致性_meikokoo的博客-CSDN博客
2.1zookeeper是什么?
zookeeper:分布式应用程序协调管理服务,用于配置管理、域名管理、分布式数据存储、集群管理;在kafka3.0版本已经脱离zookeeper,kafka自己实现zookeeper功能。
2.2zookeeper中数据同步问题
zookeeper中数据的同步只需要过半节点同步完成,就表示数据已经commit。需要注意的是zookeeper不是强一致性,它属于最终一致性,由于每个节点的数据量默认不超过1M,所以最终同步性不影响使用。
2.3zookeeper中的leader和follower
在kafka中生产者和消费者只和leader打交道,但是生产者和任何一台broker连接都可以,因为broker会返回当前请求副本leader的信息,最后生产者再跟leader打交道。而在zookeeper中也差不多,客户端连接任意一台zk都可以进行操作,但是数据新增修改等事务的操作必须在leader上运行,客户端如果连接到follower上进行事务操作,follower会返回给leader的ip,最终客户端还是会在leader上操作。
zookeeper中的follower用于查询和选举
2.4、zookeeper中的选举机制
zookeeper中选举采用一致性算法zab,遵循少数服从多数的原则,随机投票票数过半的当选leader,如果出现平票的情况则重新投票,所以通常将节点数设置为奇数。
2.5、zookeeper的脑裂问题
zookeeper集群中,节点间的网络通信不良时,容易出现脑裂的现象。集群中的节点监听不到leader节点的心跳,就会认为leader节点出现异常,此时一个大集群将分成小集群,在这些小集群会各自选举出自己的leader,一旦网络通信恢复,原有的集群就会出现多个leader造成脑裂。
所以可以通过设置节点的数量,比如节点数量设置为5,当分裂成小集群时候分为2、3,节点数为2的那个集群很再难选出leader。
项目原理图
· 项目步骤
- 规划整个项目的拓扑结构和数据走向;
- 使用Nginx实现Web集群部署,用Nginx+keepalived实现双VIP负载均衡高可用;
- 创建 NFS 服务服务器为所有的节点提供相同 Web 数据,实现数据一致性
- 使用filebeat收集每台Web服务器的日志,吐到kafka里;
- 搭建 kafka集群和zookeeper集群,创建 topic,指定 partition数量,在kafka中创建虚拟消费者;
- 编写一个python脚本进行日志清洗,用淘宝免费接口,提取相关信息存放进mysql数据库;
· 项目心得
- 通过网络拓补图和思维导图的建立,提高了项目整体的落实和效率;
- 慢慢理解了集群的概念,对keepalived+nginx实现高可用负载均衡有更为了解;
- 引入中间层的思维非常重要,引入中间层可以解决很多问题;很多服务都应该考虑到高可用和负载均衡;
- 对于脑裂现象的出现有了更加清晰的认识 ;
- 通过官方文档安装与使用nginx和kafka到项目部署,进一步提高了自主学习和troubleshooting能力