相关术语
从集群模型上说:
broker:
kafka集群中的每一个存储节点,用来持久化存储消息队列的. 可以自定义存储时间.可以保证消息的安全性(重用性:消费者可以重新消费信息
Broker没有副本机制,一旦broker宕机,该broker的消息将都不可用。 Broker不保存订阅者的状态,由订阅者自己保存。
无状态导致消息的删除成为难题(可能删除的消息正在被订阅),Kafka采用基于时间的SLA(服务保证),消息保存一定时间(通常7天)后会删除。
消费订阅者可以rewind back到任意位置重新进行消费,当订阅者故障时,可以选择最小的offset(id)进行重新读取消费消息
zookeeper :
维护一个整个集群的controller角色. 及宕机后的重新选举
producer
用于生产消息
从消息上来说
topic
生产者生产的消息时按照主题来分类的
partition
生产者为每一个主题生产的消息又被划分为不同的分区
为什么要分区?(提高消息消费的并行度)
replica:
每一个分区的数据都有N个副本,提高message数据的安全性,可靠性
为什么要存副本? 防止数据丢失
Leader
每个partition有多个副本,其中有且仅有一个作为Leader,Leader是当前负责数据的读写。
Follower
同步leader写的数据.
ISR
现存活的副本数
Segment
partition 物理上由多个 segment 组成,每个 Segment 存着 message 信息。
Offset
kafka的存储文件都是按照offset.log来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.log的文件即可。当然the first offset就是00000000000.log
架构
通常,一个典型的Kafka集群中包含
1 若干Producer(可以是web前端产生的Page View,或者是服务器日志,系统CPU、Memory等),
2若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),
3若干Consumer Group,
4一个Zookeeper集群。
Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance。
5 Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消息。

kafka的分布式模型
1 一个主题的消息是分不同分区的
2 每一个分区的数据有多个副本,副本存在不同的机器
3 副本中之一为leader负责数据读写,其他作为备胎同步leader的数据
4 如果leader挂掉,follower中的某一个会选举成为new leader,(体现了kafka的去中心化)
5 消息的分区数决定了消费的并行度
kafka分区
为什么要分区?
kafka可以将一个topic的 消息分目录来管理.
分区本质上就是分目录
分区有如下好处
- 方便集群扩展
- 多个生产者key向同一个topic的不同分区同时写数据,做到并发
- 读数据也可以并发
分区策略
如何分区?
假设有3个broker,4个分区,不考虑副本的情况下
算法 分区数 mod broker数

副本分配策略
(分区号+副本编号) mod broker数目负载均衡
消息分配策略
所谓消息分配策略,就是消生产者发送消息时,消息要进入哪个分区.有这么几种情况
- 发送消息的时候指定分区,就是你说放哪个分区就放在哪个分区
- 如果不指定分区,但是发送的消息有key,那么会依据key的hash来选择分区
- 如果不指定分区,还没有key,那就通过轮询算法来确定分区
确定分区本质上是确定消息进入hdfs哪个目录上保存!
















