kafka是一种分布式的,基于发布订阅的消息系统。具有以下几个方面的特性。
1.能够提供常数时间的消息持久化及访问性能。
2.高吞吐率。廉价的商用机器上能够达到每秒100k条的消息传输。
3.支持kafka server间的消息消息分区,分布式消费,分区内消息的顺序性。
4.支持水平扩展。
5.支持离线数据处理和实时数据处理。
kafka架构
kafka的拓扑结构:
1.producer:消息生产者。
2.consumer:消息消费者。
3.broker:kafka集群由一个或者多个服务器组成。服务器被称为broker。消息由producer发送到broker。consumer从borker中消费消息。
4.Toptic:消息主题。每条发送到kafka集群的消息都有一个Topic,物理上不同topic的消息分开存储 。逻辑上一个topic的消息保存于一个或多个broker上。
5.partition:消息分区。每个topic包括一个或多个partition
6.consumer group:每个consumer属于特定的group,可以为每个consumer指定group name,不指定,则属于默认的group。
从图中我么可以看出。kafka集群由若干producer,consumer grouper,broker,zookeeper组成。kafka通过zookeeper来管理集群的配置,以及在consumer发生变化进行reblance。
topic & partion
topic在逻辑上可以被理解为一个队列,消息必须指明它的topic,可以理解为消息必须指定放到哪一个队列中。为了提高kafka的吞吐率,物理上把topic分成一个或多个partion,每个partion物理上对应一个文件夹。该文件夹下存储该partition下的消息及索引文件。
若创建两个topic,topic1和topic2,每个topic对应有13个和19个分区,其中集群中共有8个结点,则集群中会创建32个文件夹。如下图所示:
每个日志文件都是一个log entry序列,每个log entry序列包含一个四字节整形值(消息长度,1+4+n),一字节magic value,四字节的crc校验码,n字节的消息体长度组成。每条消息都有在当前partition下的唯一的64字节的offset。它指明了消息的的存储位置,磁盘上消息的存储格式如下:
message length : 4 bytes (value: 1+4+n) "magic" value : 1 byte crc : 4 bytes payload : n bytes
这个log entries并非由一个文件组成,而是分成多个segment,每个segment以该segment下的第一条消息的offset命名并以kafka为后缀。另外会有一个索引文件,他标明每个 segment下的log entry的offset的范围,如下图所示: kafka高吞吐率的一个很重要的保证就是消息会被顺序写到partition中。如下图所示: 对于传统的消息系统,通常会删除已经消费过的消息,kafka会保存已经消费的消息。并且根据实际情况对已经消费的消息提供两种删除策略,分别是基于消息的消费时间以及partition文件的大小。 我们可以通过配置文件$KAFKA_HOME/config/server.properties,让Kafka删除一周前的数据,也可在Partition文件超过1GB时删除旧数据。配置如下所示:
# The minimum age of a log file to be eligible for deletion log.retention.hours=168 # The maximum size of a log segment file. When this size is reached a new log segment will be created. log.segment.bytes=1073741824 # The interval at which log segments are checked to see if they can be deleted according to the retention policies log.retention.check.interval.ms=300000 # If log.cleaner.enable=true is set the cleaner will be enabled and individual logs can then be marked for log compaction. log.cleaner.enable