经过了一段时间对kafka的开发,谈谈自己的理解,并附上一幅自己画的思维导图(画的有点烂)
kafka同时支持离线和实时系统,我在工作中它的主要工作是给storm信息,其实可以将它理解为一个消息缓冲。
1.架构
架构上分为:topic、broker、producer、consumer。后两个不用说就知道啥意思了,broker就是代理就是分布式系统中的节点。
我们把传送的一系列信息抽象为topic(话题),不同的消费者可以订阅某个话题(topic),不同的生产者可以生产话题。举个例子:比如新闻,我们到体育专题就相当于我们订阅体育的topic,这个topic里面用许多新闻,它们来自不同的媒体。
逻辑上为了实现队列功能(一条信息只能被一个消费者消费)kafka在高层消费者层有一个group的概念,就是同组的消费者消费订阅了一个topic,其中的一条信息只能被一个消费者消费,其实也不是真正的队列因为它实现的是消费不同的分区信息(每有一个同group的消费者加入都会执行rebalance算法重新分配分区)。
2.信息
每个topic都可以分多个partition(分区)存在不同节点上,我的理解是:
如果一个topic的分区只有一个partition的话,该topic的吞吐能力只取决于1个broker的吞吐能力。
offset表示该分区的第几条信息(信息是顺序存储的)
每一个分区的文件都分为多个seggment文件,seggment文件分为两个索引文件.index和日志文件.log,文件名是前一个offset值。引入seggment的主要原因我认为是删除,虽然就kafka理论上来说为了持久性不应该删除信息,但我们的磁盘也不是无限大的,所以在配置文件中我们可以设置定时删除或者存储量超过一定大小后删除,也就是一个seggment一个seggment删除。
3.备份
我们把备份分为一个leader和多个follower,leader与producer和consumer沟通,follower数据上跟随leader。这里注意的是跟随动作会影响系统的吞吐率。
当leader的节点宕机了,会在follower中选出一个leader,0.8版本前是zookeeper选,之后是broker中有一个controller节点来选举。