Skip to content

Kafka

Kafka是一个分布式、支持分区的、多副本的, 基于ZooKeeper 协调的分布式消息系统。

Kafka可以实时的处理大量数据以满足各种需求场景:比如基于Hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎,Web/Nginx日志、访问日志,消息服务等等,用 Scala语言编写 。属于Apache基金会的顶级开源项目。

Kafka组件

  • Broker :消息中间件处理节点,一个Kafka节点就是一个Broker,一个或者多个Broker可以组成一个Kafka集群
  • Topic :Kafka根据topic对消息进行归类,发布到Kafka集群的每条消息都需要指定一个topic
  • Producer :消息生产者,向Broker发送消息的客户端
  • Consumer :消息消费者,从Broker读取消息的客户端
  • ConsumerGroup :每个Consumer属于一个特定的ConsumerGroup,一条消息可以被多个不同的ConsumerGroup消费,但是一个ConsumerGroup中只能有一个Consumer能够消费该消息
  • Partition :物理上的概念,一个topic可以分为多个partition,每个partition内部消息是有序的
  • Leader :每个Partition有多个副本,其中有且仅有一个作为Leader,Leader是负责数据读写的Partition。
  • Follower :Follower跟随Leader,所有写请求都通过Leader路由,数据变更会广播给所有Follower,Follower与Leader保持数据同步。如果Leader失效,则从Follower中选举出一个新的Leader。当Follower与Leader挂掉、卡住或者同步太慢,Leader会把这个Follower从 ISR列表 中删除,重新创建一个Follower。
  • Offset :偏移量。Kafka的存储文件都是按照offset.kafka来命名,用Offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。

QA

如何理解 Topic,Partition和Broker?

一个Topic,代表逻辑上的一个业务数据集,比如订单相关操作消息放入订单Topic,用户相关操作消息放入用户Topic,对于大型网站来说,后端数据都是海量的,订单消息很可能是非常巨量的,比如有几百个G甚至达到TB级别,如果把这么多数据都放在一台机器上可定会有容量限制问题,那么就可以在Topic内部划分多个Partition来分片存储数据,不同的Partition可以位于不同的机器上,相当于 分布式存储 。每台机器上都运行一个Kafka的进程Broker。

什么是 核心总控制器Controller?

在Kafka集群中会有一个或者多个Broker,其中有一个Broker会被选举为控制器(Kafka Controller),可以理解为 Broker-Leader ,它负责管理整个 集群中所有分区和副本的状态。