Kafka broker 和 集群
kafka架构图:
- 生产者发送消息给kafka服务器;
- 消费者从kafka服务器读取消息;
- kafka服务器依托zookeeper集群进行服务的协调管理;
broker —— kafka服务器的官方名字
一个独立的kafka服务器被称为broker;broker用来接收来自生产者的消息,为消息设置偏移量,并把消息保存到磁盘;
换句话说,多个kafka实例组成kafka集群;
kafka集群、broker、主题及分区、生产者、消费者 关系示意图:
broker中央控制器:kafka集群中由多个broker,在kafka启动时,只有一个会被选举为broker中央控制器(controller leader);
broker中央控制器选举过程:当broker启动的时候,都会创建KafkaController对象,但集群中只能由一个leader对外服务,这些每个节点上的KafkaController会在指定的zookeeper路径下创建临时节点,只有第一个成功创建的节点的KafkaController才可以称为leader,其余的都是follower。当leader故障后,所有的follower都会收到通知,再次竞争在该路径下创建节点从而选举新的leader;
中央控制器的工作:
- 管理整个集群中的分区;
- 监控副本的状态;
这些工作如:
- leader副本故障后,由中央控制器 负责为该partition重新选举新的leader副本;
- 当检测到同步列表发生变化后,由中央控制器 通知集群中所有leader更新其元数据缓存信息;
- 当增加某个topic分区的时候也会由中央控制器管理 分区的重新分配工作;
Kafka 主题 和 分区
消息、主题(topic)、分区(partition)、副本(replica)
消息
kafka的消息个是经过3次版本变迁,分别被称为 V0,V1,V2;
3个主要字段的含义:
- Key:消息键,对消息做 partition 时使用,即决定消息被保存在某个 topic 下那个 partition;
- Value:消息体,保存实际的消息数据;
- Timestamp:消息发送时间戳,用于流式处理 及 其他依赖时间的处理语义。如果不指定则取当前时间;
- 属性:一共1Byte,目前只用了最低的3bit来做压缩类型的存储;
- CRC32校验码
Kafka消息设计的好处:
1、使用 紧凑的二进制数组 Bytebuffer 而不是独立的对象,因此我们至少能够访问多一倍的可用内存;
2、而且不在堆上分配内存,避免了GC的糟糕性能;
3、大量使用页缓存,当broker进程崩溃时,堆内存上的数据也一并消失,但页缓存的数据依然存在;下次broker重启后可以继续提供服务,不用单独在热缓存;
主题(topic)和 分区(partition)
topic :只是一个逻辑概念,代表了一类消息。通常 topic 用来区分实际业务;
partition:每个topic都由若干个 partition 组成;
- partition 是不可修改的有序消息序列,也可以说是有序的消息日志;
- 每个partition 都有自己专属的 partition号,通常是从0开始的;
- 用户堆 partition 唯一能做的操作就是 在 消息序列的尾部 追加写入消息;
- partition 上的每条消息都会被分配一个唯一的序列号,该序列号被称为位移(offset);
partition 实际上并没有太多的业务含义,partition的引入 只是为了提升系统的吞吐量;可以根据集群的实际配置设置具体的partition数,实现整体性能最大化;
位移(offset)
topic partition 下的每条消息都被分配一个位移值;kafka 消费端也有 位移(offset)的概念;
要注意区分这两offset 的不同含义:
由此我们可以断言, 一条消息就是一个三元组<topic,partition,offset>
副本(replica)
分布式系统为了实现高可靠性,目前主要实现方式还是 冗余机制;即备份多份日志;这些备份日志在 kafka 中被称为 副本(replica);
副本存在的唯一目的:防止数据丢失;
副本分两类:领导者副本(leader replica) 和 追随者副本(follower replica);
follower replica 不能给客户端提供服务,只是被动的 向 leader replica 获取数据;
一旦 leader replica 所在的 broker 宕机,kafka 会从 剩余的replica中选举出新的 leader 继续提供服务;
ISR(in-sync replica)
ISR 全称 in-sync replica,翻译过来就是 与 leader replica 保持同步的 replica集合;
注意:不是所有的 replica 都能与 leader replica 保持同步;
kafka 为 partition 动态维护一个 replica 集合 —— 该集合中所有的replica保存的消息日志都与leader replica保持同步状态;正常情况下,所有的 replica 都应该和 leader replica 保持同步状态,但由于各种各样的原因如果滞后到一定程度后,kafka 会把这些 replica 踢出 ISR,如果这些 replica 慢慢的追上了 leader replica,kafka会把他们重新加入 ISR;
只有 ISR 集合中的 replica 才能被选举为 leader;
kafka承诺,只要 ISR 中 至少存在一个 replica,那些”已提交“的消息就不会丢失;
kafka 生产者 和 消费者
生产者(producer)
功能:将 消息 发布到相应的 topic 中;
生产者发送模式:
- 同步方式(synchronized):调用send方法发送,它会返回一个Future对象,调用future对象就知道消息是否发送成功。(kafka 默认为同步,即producer.type = sync);
- 异步方式(asynchronized):调用send方法并指定一个回调函数,服务器在返回响应时调用该函数;
- 发送了不管(oneway):把消息发送给服务器,但并不关心是否正常到达。多数情况下,消息会正常到达,但有时也会丢失一些消息;
消费者(consumer)
功能:主题 topic 中的数据被 消费者 使用;