LearningKafka学习笔记(三) - 18965050/learning-kafka GitHub Wiki
- Kafka设计原理
- Kafka消息压缩
- Kafka复制
Kafka设计原理

- Kafka topic会被进行分区. 每个分区对应由一组相同大小的段文件组成的日志文件.每个分区都是有序, 不可变的(消息只能追加).
- 当达到配置数量的消息或经过配置的时间,段文件会被刷新到磁盘中,以供消费者进行消费
- 每个消息都有个唯一标识符,称之为offset,来表示消息在分区中的位移
- 分区是在不同的broker server上,由一个leader和0个或多个follower组成.leader负责分区的读写请求,follower负责异步从leader同步数据.kafka保存一个动态的ISR(in-sync replicas)机制保证follower能追上leader. 如果leader崩溃了,follower就会进行leader选举,直至选出另一个leader.因此,在kafka中,每个broker server都有双重的身份: 可能是某个分区的leader,或是其他分区的follower
- 消费者可以组织成消费者组(consumer group).消息只能被消费者组中的某个消费者消费. 如果需要多个消费者消费同一个消息, 则它们应该在不同的消费者组中.消费者消费完消息会发送一个响应(acknowledgement), 此响应表明此消息之前的所有消息均已消费了
- broker是无状态的.消息状态被保留在消费者中. broker通过基于时间的SLA(service level agreement)消息保留策略来保留消息. 过了这个时间,消息就会在broker中删除
Kafka设计理念
- topic分区消息保持有序
- 每个消息都有个有序的(sequential)offset,且此offset不会变化
- 从offset为0开始的读进程(消费者消费),能看到消息写入(生产者推送)的最终顺序
- Kafka中,消息会立刻写入OS内核.缓存和刷新是可配置的
- Kafka broker提供长消息保留策略, 使得消息可被反复消费
- Kafka使用消息集合(message set)来分组消息, 减少网络负载
- 消息状态被保存在consumer中,这也解决了消息丢失和同一消息多个递送的问题. consumer将消息状态保存在zk上
- 生产者和消费者以push-and-pull的方式进行工作
- kafka中每个broker都是平等的. 没有master节点的概念
- 生产者有个配置选项,可配置同步或异步将消费发送到broker上
消息压缩
- 在0.7版本中,压缩消息由consumer来解压缩并确定每条消息的offset,在0.8+版本中,broker会先解压缩确定消息offset,再压缩存储,最后由consumer解压缩
- 消息压缩配置参数如下:

复制
- kafka中,消息分区策略由producer决定,分区数量在broker配置文件中配置
- kafka 消息复制策略保证消息即使在某些broker宕机情况下也不会丢失.

- 消息复制对于有n个复制的server,可承受n-1个server宕机.复制中某个broker server为leader,其他为follower. follower采用ISR策略保持和leader同步
- kafka支持两种复制方式(request.required.acks):
- 同步复制(-1): leader收到消息并按顺序通知每一个follower,同时写入到日志文件中. follower收到消息写入日志后,发送ack给leader. 当leader收到所有follower的ack后,发送ack和producer
- 异步复制(1): leader收到消息并写入日志后, 直接发ack给producer,不会等待通知每个follower的ack
- 如果follower宕机, leader会将此follower从ISR中删除. 当此follower恢复后, 此follower会将日志截取到最后一个检查点(checkpoint),并从此点开始和leader同步
- 如果leader宕机, 生产者会重发消息给新当选的leader.新当选的leader应该持有最大的offset