Kafka是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域。
1、消息队列
1)点对点模式(一对一)
消费者主动拉取数据,消息收到后消息清除
2)发布/订阅模式(一对多)
消费者消费数据之后不会清除消息,生产者产生的消息会被所有订阅者消费
2、基础架构
broker指Kafka服务器,一个broker可以容纳多个topic,topic可以理解为一个队列,为方便扩展,并提高吞吐量,一个topic分为多个partition(Topic :可以理解为一个队列,生产者和消费者面向的都是一个topic).每个分区内部有序
配合分区的设计,提出消费者组的概念,组内每个消费者并行消费(消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个消费者消费;消费者组之间互不影响)
为提高可用性,为每个partition增加若干副本,类似NameNode HA
3、命令行操作
需要配合zookeeper一同使用,分别启动
1)查看当前服务器中的所有topic
kafka-topics.sh --zookeeper hadoop102:2181 --list
2)创建topic
kafka-topics.sh --zookeeper hadoop102:2181 \
--create --replication-factor 3 --partitions 1 --topic first
3)删除topic
kafka-topics.sh --zookeeper hadoop102:2181 \
--delete --topic first
4)发送消息
afka-console-producer.sh \
--broker-list hadoop102:9092 --topic first
5)消费消息
kafka-console-consumer.sh \
--bootstrap-server hadoop102:9092 --from-beginning --topic first
6)查看某个Topic的详情
kafka-topics.sh --zookeeper hadoop102:2181 \
--describe --topic first
7)修改分区数
kafka-topics.sh --zookeeper hadoop102:2181 --alter --topic first --partitions 6
4、架构深入
Kafka中消息是以topic进行分类的,生产者生产消息,消费者消费消息,都是面向topic的。
Kafka采取了分片和索引机制,将每个partition分为多个segment。每个segment对应两个文件——“.index”文件和“.log”文件
“.index”文件存储大量的索引信息,“.log”文件存储大量的数据,索引文件中的元数据指向对应数据文件中message的物理偏移地址。
5、 Kafka生产者
同步发送和异步发送
Kafka的Producer发送消息采用的是异步发送的方式
为保证producer发送的数据,能可靠的发送到指定的topic,topic的每个partition收到producer发送的数据后,都需要向producer发送ack(acknowledgement确认收到),如果producer收到ack,就会进行下一轮的发送,否则重新发送数据。全部的follower同步完成,才可以发送ack。
Leader维护了一个动态的in-sync replica set (ISR),意为和leader保持同步的follower集合。当ISR中的follower完成数据的同步之后,leader就会给follower发送ack。如果follower长时间未向leader同步数据,则该follower将被踢出ISR,该时间阈值由replica.lag.time.max.ms参数设定。Leader发生故障之后,就会从ISR中选举新的leader。
ack应答机制:三种
故障处理细节:
(1)follower故障
follower发生故障后会被临时踢出ISR,待该follower恢复后,follower会读取本地磁盘记录的上次的HW,并将log文件高于HW的部分截取掉,从HW开始向leader进行同步。等该follower的LEO大于等于该Partition的HW,即follower追上leader之后,就可以重新加入ISR了。
(2)leader故障
leader发生故障之后,会从ISR中选出一个新的leader,之后,为保证多个副本之间的数据一致性,其余的follower会先将各自的log文件高于HW的部分截掉,然后从新的leader同步数据
注意:这只能保证副本之间的数据一致性,并不能保证数据不丢失或者不重复。
6、Kafka消费者
手动提交offset和自动提交offset
consumer采用pull(拉)模式从broker中读取数据。
push(推)模式很难适应消费速率不同的消费者,因为消息发送速率是由broker决定的
确定那个partition由哪个consumer来消费?
分区分配策略:
1)roundrobin
2)range
7、Kafka 高效读写数据
1)顺序写磁盘
2)零复制技术
8、 自定义Interceptor(拦截器)
9、Kafka监控