Kafka——简介与架构
一、简介
1.1 概述
什么是Kafka:
- 最初由Linkedin公司开发,由scala编写,其诞生是为了解决Linkedin的数据管道问题——由于各种缺陷而导致消息阻塞或者服务无法正常访问;
- 分布式消息队列。Kafka对消息保存时根据topic进行归类,发送消息者称为producer,消息接受者称为consumer,Kafka集群由多个Kafka实例组成,每个实例(server)称为broker;
- 无论是Kafka集群,还是consumer都依赖于Zookeeper集群保存一些meta信息,来保证系统可用性。
Kafka主要设计目标:
- 通过O(1)的磁盘数据结构提供消息的持久化,对于即使数以TB的消息存储也能够保持长时间的稳定性能;
- 高吞吐量 :即使是非常普通的硬件Kafka也可以支持每秒数百万的消息;
- 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输;
- 支持离线数据处理和实时数据处理;
- 使用推送和拉取模型解耦生产者和消费者;
- 系统可以随着数据流的增长进行横向扩展。
1.2 消息队列
Kafka属于发布-订阅模式。消息传递方式:
- 点对点模式:一对一;一条消息只能被消费一次,消费后清除;
- 发布-订阅模式:一对多;消费者可以订阅一个或多个topic,同一条数据可以被多个消费者消费,消息被消费后不会立马清除。
1.3 Kafka的优点
- 解耦
- 冗余
- 扩展性
- 灵活性&峰值处理能力
- 可恢复性
- 顺序保证
- 缓冲
- 异步通信
二、Kafka基础角色
producer
:消息生产者,向消息系统发送消息的客户端;consumer
:消息消费者,从消息系统读取消息的客户端;topic
:主题。是一个逻辑概念。其作用类似于关系型数据库的表;partition
:分区。为了实现扩展性,一个非常大的topic可以分布到多个broker上,一个topic分为多个partition(分布在不同的服务器上,具体在.log
文件里),序号从0开始,每个partition是一个有序队列。partition中每条消息都会被分配一个有序的ID(offset)。Kafka只保证一个partition中的消息的有序性,不保证一个topic的多个partition间的顺序;offset
:偏移量。partition中的每个消息都有一个连续的序号,用于partition唯一标识一条消息;
consumer group
:消费者群组。一个topic可以有多个consumer,每个partition只会把消息发给消费者组中的一个consumer;
controller
:Kafka是主从式的架构,主节点就叫controller,其余的为从节点,controller是需要和zookeeper进行配合管理整个kafka集群。
三、Kafka架构
Kafka详细架构图:
- 一个典型的Kafka集群包含若干个producer、broker、consumer(group)以及一个zookeeper;
- Kafka通过zookeeper管理集群配置,选举leader,以及在consumer group发生变化时进行rebalance;
a通过zookeeper管理集群配置,选举leader,以及在consumer group发生变化时进行rebalance; - producer使用push模式将消息发布到broker,consumer使用pull模式从broker订阅并消费消息。