概述
Kafka起初是由LinkedIn公司采用Scala语言开发的一个多分区、多副本且基于ZooKeeper协调的分布式消息系统,现已捐献Apache基金会,定位为一个分布式流式处理平台,以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。
快速部署
1 | $ docker pull wurstmeister/zookeeper |
基本概念
典型的Kafka体系架构包含若干Producer、若干Broker、若干Consumer以及一个ZooKeeper集群。如下图所示:
其中:
- Producer为生产者,负责创建消息并投递到Kafka。
- Consumer为消费者,从Kafka接收消息。
- Broker为服务代理节点,可简单看做是一个Kafka服务实例。
- ZooKeeper负责Kafka集群元数据管理和控制器选举等工作。
Kafka中还有两个重要概念:
- Topic(主题):主题是逻辑概念,消息以主题为单位归类,生产者将消息发送到指定主题,消费者订阅主题进行消费。
- Partition(分区):分区在存储层面可看作可追加日志文件。同一个主题可以细分为多个分区。同时分区也有多副本机制,leader副本负责处理读写请求,follower副本只负责同步leader消息。
- AR(Assigned Replicas):分区中所有副本。AR = ISR + OSR。
- ISR(In-Sync Replicas):所有与leader副本保持一定程度同步的副本(包含leader副本)。
- HW(High Watermark):高水位,标识特定的消息偏移量(offset),消费者只能拉取到这个offset之前的消息。
- LEO(Log End Offset):标识当前日志文件中下一条待写入消息的offset。
- OSR(Out-of-Sync Replicas):与leader副本同步滞后过多的副本,此状态的副本无选举资格。
消息在被追加到分区日志文件时会被分配一个唯一的偏移量(offset),用来保证消息在分区内的顺序性。但是offset并不跨区,也就是说Kafka保证的是分区有序而不是主题有序。
如下图所示,日志文件中有9条消息,起始消息offset为0,最后一条为8,offset=9表示下一条待写入的消息。日志文件的HW为6,表示消费者只能拉取到offset在[0,5]的消息。HW及以后的消息消费者不可见。