概念Kafka是一个高吞吐量、分布式、基于发布/订阅的消息系统,最初由LinkedIn开发,使用Scala(JAVA)语言编写,目前一个Apache开源项目。主要解决应用解耦、异步消息、流量削峰等问题。Kafka其实是一个主从架构,有一个Controller角色,控制器,负责协调和管理整个集群。关键术语brokerKafka服务器负责消息的存储和转发。topic消息类别,Kafka根据topic对消息进行分类;类似于关系数据库的表。partitiontopic分区,一个topic可以包含多个partition,topic消息保存在每个partition上。offset消息在日志中的位置可以理解为消息在partition上的偏移量,也是代表消息的唯一序号。Producer消息生产者将消息推送给Kafka集群中的Broker。Consumer消息消费者,从kafka集群拉取消息,消费消息。ConsumerGroupConsumer分组,每个Consumer必须属于一个groupZookeeper保存集群broker、topic、partition等元数据;此外,它还负责broker故障发现、partitionleader选举、负载均衡等功能。从抽象到具体,从宏观层面理解Kafka的架构设计,就是一个存储系统。再细分一下,就是多生产者,多消费者,Broker集群和Kafka。再细分,broker有controller角色,每个broker可能存放多个topic的不同partition,每个partition有leader和follower。这些信息将在zk上注册。集群架构的理解和新版优化控制器我们熟悉一个规律:在大数据分布式文件系统中,95%是主从架构,也有一些是对等架构,比如ElasticSearch.Kafka也是主从架构。主节点称为控制器,其余为从节点。controller需要配合zookeeper来管理整个kafka集群。该角色负责协调和管理整个集群。职责Topic增删改查Partition重新分配Leader选举Metadata管理Broker成员管理,宕机或加入controller选举是基于zookeeper,使用zookeeper的znode模型和监控机制。controllerfailover存在单点故障,但每个broker节点都可以成为controller;failover,即failover,也是基于zookeeper,znode模型和监控机制,/controller节点实现的。kafka和zookeeper如何协同工作Kafka严重依赖zookeeper集群。所有代理在启动时都会向ZooKeeper注册。目的是选举一个控制器。选举过程非常简单粗暴,就是一个谁先得手的过程,不涉及任何算法问题。成为controller后,会监听zookeeper中的多个目录。注册时,每个节点都要暴露自己的主机名、端口号等信息,此时控制器要读取注册从节点的数据(通过监控机制),生成集群元数据信息,然后分发信息传递给其他服务器,使其他服务器可以感知集群中其他成员的存在。新版Kafka将放弃ZooKeeper!!!!!!2021年3月30日,Kafka背后的公司Confluent发布了一篇博客称,在即将推出的2.8版本中,用户可以在完全没有ZooKeeper的情况下运行Kafka。将依赖ZooKeeper的controller改造为基于KafkaRaft的Quormcontroller。在以前的版本中,没有ZooKeeper,Kafka将无法运行。但是,两个不同系统的管理和部署,不仅使运维的复杂度成倍增加,而且使Kafka变得笨重,限制了Kafka在轻量级环境下的应用。同时,ZooKeeper的分区特性也限制了Kafka的承载能力。用户第一次可以在没有ZooKeeper的情况下运行Kafka。这是一次重大的架构升级,让一向“重量级”的Kafka变得更简单。轻量级单进程部署可以作为ActiveMQ或RabbitMQ的替代方案,也适用于边缘场景和使用轻量级硬件的场景。为什么要放弃用了十年的ZooKeeper?zk的缺点:zookeeper的缺点之一就是同步数据不能太大。zookeeper集群中leader和follower同步数据的限制值为500M,500M数据加载到内存中,占用内存3G左右。数据太大。每次选举后,都需要从server同步到follower,这很可能会造成以下两个问题:触发重选io时间过长。ZooKeeper作为Kafka的leader,更新集群中的拓扑变化;根据ZooKeeper提供的通知,生产者和消费者发现整个Kafka集群中是否有新的broker或broker故障。大多数运维操作,如扩容、分区迁移等,都需要与ZooKeeper进行交互。也就是说,Kafka代码库中有很大一部分负责实现分布式系统功能,例如在集群中的多个Broker之间分配分区(即日志)、分配领导权和处理故障。而ZooKeeper已经在业界得到了广泛的应用和验证,是分布式代码工作的关键一环。假设没有ZooKeeper,Kafka连进程都启动不了,但是严重依赖ZooKeeper也给Kafka带来了约束。不过目前大部分都是用kafka结合zk。
