kafka
kafka是一款分布式消息发布和订阅系统,它由于具有高性能、高吞吐的特点而被广泛应用于大数据传输场景
kafka的应用场景
- 行为跟踪
- 日志收集
kafka的架构?
一个典型的kafka集群包含若干个Producer、若干个Broker、若干个Consumer Group以及一个Zookeeper集群。kafka通过zookeeper管理集群配置及服务协同,Producer使用push模式将消息推送到Broker,Consumer通过监听使用pull模式从Broker订阅消息并消费。多个broker协同工作,producer和consumer部署在各个业务节点。三者通过zookeeper管理协调请求和转发。这样就组成了一个高吞吐、高性能的分布式消息发布和订阅系统。
kafka的安装部署及集群部署?
下载:以kafka_2.11-1.1.0、linux系统为例,下载
解压缩:tar -xzf kafka_2.11-1.1.0.tgz ,之后:cd kafka_2.11-1.1.0
启动zookeeper:由于kafka是依赖于zookeeper的,所有在启动kafka之前要确保zookeeper已启动,如果没有单独的zookeeper,可以启动kafka中附带的,输入命令:bin/zookeeper-server-start.sh config/zookeeper.properties
启动kafka:bin/kafka-server-start.sh config/server.properties
以上为kafka的单机启动过程
如果是集群启动,修改每个kafka中config/server.properties中的参数
broker.id=1 每个kafka的此参数必须不一样
listeners=PLAINTEXT://xxx.xxx.xxx.xxx:9093 必须填写本机的IP
log.dir=/tmp/kafka-logs 消息存储的路径
Topic&partition
Topic
:在kafka中,topic是存储消息的逻辑概念,所有消息都是发送到topic之上的
partition
:由一个或一个以上的partition组成一个topic,partition是物理上的概念。同一topic上的partition是不同的。每个消息都有一个offset唯一标识。
消息分发策略
当往topic中发送消息时,kafka默认将key hash取模之后路由到不同的partition,如果key为null,则根据参数 metadata.max.age.ms的时间范围随机选择一个partition
消息消费原理
对于同一topic而言,同一groupId的多个消费者中,只发送一条消息,此group中的消费者消费一次。对于不同的groupId的多个消费者来说,每个group都会接受一次消息。这样,根据不同的group,topic可以是消息队列模式,也可以是发布/订阅模式。
消息分区
范围分区:按照顺序获取对应的分区消息,可能编号小的负载会大
轮询分区:把所有的partition和consumer线程都列出来,然后按照hashcode进行排序,最后通过轮询算法分配partition给consumer(必备条件:每个主题的消费者实例具有相同数量的流、每个消费者订阅的主题必须是相同的)
触发情况:consumer group内的成员数量有变化、topic分区的数量有变化
消息分区reblance的机制
Coordinator
:kafka集群提供了一个角色coordinator来对ConsumerGroup进行管理。当ConsumerGroup第一个consumer启动时,它会和kafka集群进行通信,用以确认coordinator,kafka集群会返回一个负载最小的broker的id返回给此consumer,此broker就为coodrinator,之后改组的所有成员都会和此coordinator进行协调通信
JoinGroup
:所有的consumer都会首先和coordinator进行通信,向coordinator发送JoinGroup请求,当所有的consumer都向coordinator发送了此请求之后,coordinator会确认一个leader,并返回信息,并且在返回给leader的信息中,会额外发送所有组员的信息。
synchronizing Group
:所有consumer向groupCoordinator发送SyncGroupRequest请求,并处理SyncGroupResponse相应(leader将消费者对应的partition分配方案通过给consumer group中所有的consumer)
消息存储策略
kafka是使用日志文件的方式来保存生产者的消息,每条消息都有一个offset来保存此消息在它分区中的偏移量。kafka将Log分为多个LogSegment,一个LogSegment对应磁盘上的一个日志文件和一个索引文件。
清理策略
:1超过指定时间之后则进行清理(默认7天)、2查过一定文件大小则清理,只要满足其中一个则进行清理,优先清理存在最久的LogSegment(log.retention.bytes log.retention.hours)
消息副本机制
每个分区中会存在多个副本,在所有的副本集中会存在一个leader副本,所有的读写请求都会由它处理,剩余的副本作为foller副本,它只会从leader同步数据。
副本消息同步原理
LEO:日志末端偏移量(Log End Offset),记录了该副本底层日志中
下一条
消息的offset。即如果LEO=10,则该副本保存的消息范围为[0,9]
HW:水位值。对于一个副本而言,其HW不会大于LEO,小于等于HW的消息表示’已备份’的消息。