文章目录

一、Kafka的基本框架

在Kafka中,发布和订阅的对象称为主题(Topic),主题可以有多个。向主题发布消息的应用称为生产者(Producer),订阅这些主题消息的称为消费者(Consumer)。生产者可以有多个,可以在不同的系统;消费者也可以有多个,同样也可以在不同的系统。生产者和消费者都称为客户端(Clients),这个概念与Kafka服务器(Server)对应。 

Kafka服务端可以有多个实例构成集群,每个实例都称为一个消息代理(Broker),这些实例可以分布在一台机器上,也可以分布在多台机器上以达到高可用的目的。你可以在消息中间件中经常看到Broker这个词,例如MQTT Broker等,Broker的本意是“经纪人”、“代理人”等等,中间件正是这样一个中间代理的角色。

Kafka的分布式一致性由Zookeeper来保证,Kafka的集群状态等等数据都保存在Zookeeper上,zookeeper通常也是一个集群。Kafka对zookeeper的性能要求不太高。Broker中有且仅有1台会成为控制者(Controller),它从zookeeper拷贝了完整的集群状态缓存,并负责一些集群管理事务比如Broker的加入和退出、Topic的创建和删除。 

二、主题、分区、副本和消息

每个主题被划分为了多个分区(Partition),这个概念类似于MongoDB的Sharding、HBase的Region等。分区从0开始编号,例如2个分区则编号为0、1。每个主题的分区会根据你设定的副本因子,拷贝N个副本(Replica),分布在各个Broker上。其中1个分区只会有1个成为领导者副本(Leader Replica),其余的全是追随者副本(Follower Replica)。和其他分布式设计如Cassandra不同的是,Kafka只有领导者副本对外提供服务,追随者副本只是单纯地复制领导者副本的数据作为备份而已。也就是说,生产者只会往领导者副本写入消息,消费者只会从领导者副本读取消息。分区和副本的机制保证了高可用的同时,使得读写压力分散在了各个机器上。

根据设定的路由规则(一般为哈希),1条消息(Message/Record)只能被发往1个分区,消息在分区中的位置由位移(Offset)来表征。分区位移从0开始单调递增。

三、日志、日志段

Kafka使用消息日志(Log)来持久化消息,日志是在物理磁盘上的一个只能追加写(Append-Only)的物理文件。这种设计在很多地方都很常见,例如Redis的AOF(Append Only File)持久化。好处在于,磁盘是块设备,随机读写还要去寻道之类的,非常慢,而顺序读写可以使得普通机械硬盘也能够拥有较好的I/O性能。Kafka会为每个主题分区建立一个文件夹,里面存放了该主题分区的所有日志。日志被切分为了一个一个的日志段(Log Segment),引入这个概念,除了考虑到Linux等操作系统的文件大小限制(比如4GB),还能够让查找、删除操作更加高效。比如Kafka建立了时间索引(timeindex)、位移索引(index),通过改进的二分查找法,直接排除掉多个日志段,快速定位指定时间、位移的日志物理位置;又比如当设定某个时间点让消息过期的时候,直接找出那些过期时间点的日志段,将后缀改为.delete,并在下一次后台运行清理线程的时候删除整个日志段文件,十分高效。

四、消费者、消费者组

在Kafka中,多个消费者可以构建一个消费者组(Consumer Group),如果该消费者组只有1个消费者,那么相当于点对点模型,如果有多个消费者组,那么相当于订阅-发布模型(有点类似于JMS)。如果一个消费者组里有多个消费者,Kafka可以根据你设定的规则(比如轮询、随机等等)进行负载均衡,消费者组里面只会有一个消费者得到数据。在1个消费者组中,每个消费者会被分配到指定的多个分区,如果消费者数量多于分区数量,则多余的消费者不会被分配到任何分区,会被闲置。当消费者组发生消费者加入、退出等事件时,会触发消费者重平衡(Rebalance),重新给消费者们分配分区。消费者消费的位置被称为消费位移(Consumer Offset),一个消费者组只会按组号(Group Id)记录消费位移,因为消费者组里面的消费者是负载均衡地消费。0.9.x以前的kafka的消费位移保存在zookeeper中,然而zookeeper并不适合频繁地写入,因此新版本已经改为了保存在kafka的一个特殊主题__consumer_offsets中了,这样客户端对zookeeper是无感知的,也是kafka逐渐去zookeeper化的成果之一。

转载请注明出处http://www.bewindoweb.com/298.html | 三颗豆子
分享许可方式知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
重大发现:转载注明原文网址的同学刚买了彩票就中奖,刚写完代码就跑通,刚转身就遇到了真爱。
你可能还会喜欢
具体问题具体杠