1.Kafka介绍

Kafka 是一个java和scala开发的mq中间件,依赖于zookeper,有高可用,高吞吐量等特点。可靠性(分区,容错),可扩展性,耐用性(磁盘-持久),性能(快、稳定、高吞吐量)

本例kafka版本号:kafka_2.11-2.1.0.tgz

2.优势

  • 可靠性:partition机制和replication机制,使消息的传递有着很高的可靠性
  • 稳定性,支持集群
  • 高性能,高吞吐量,即使在TB的数据存储情况下,仍然表现出很好的稳定性
  • 支持消息广播和单播,可以根据重设offset实现消息的重复消费

3.Kafka组件说明

Topic:Kafka中消息的类别,也就是同类消息的集合
Producer:消息生产者,发布消息的服务
Consumer:消费消息的服务
Broker:集群中每一个服务都是一个Broker(代理)
Partition:每个Topic包含一个或多个Partition分区,Kafka分配的单位是分区
Segment:Partition在物理上由多个Segment段组成(默认Segment分段为1G)
offset:每个Partition是由一系列有序的、不可变的消息组成,这些消息被连续追加到Partition中,Partition中每个消息都有一个连续递增的序列号offset,偏移量offset在分区中是唯一的。
Replica:是Partition的副本,保障Partition高可用
Follower:Replica中的一个角色,从leader中复制数据
Leader:Replica中的一个角色,Producer和Consumer只跟Leader交互
Controller:负责整个集群中所有分区和副本的状态,当某个分区的leader副本出现故障时,由控制器负责为该分区选举新的leader副本。
Zookeeper:存储集群中的meta信息,管理broker节点信息,Topic分区信息及 与broker对应关系也都在zookeeper维护
Consumer group:每个consumer都属于一个consumer group,每条消息和partition只能被一个consumer group中的一个consumer消费,但可以被多个consumer group消费。

4.生产者和消费者通讯机制:

说明:Producer通过分片规则将message发送到Topic的指定分区。zk保存了topic的相关信息,如topic列表、topic的partition数量、副本的位置等。每个partition只能被消费组的一个consumer消费,

5.Offset的存储方式

  • 1、在kafka 0.9版本之后,kafka为了降低zookeeper的io读写,减少network data transfer,也自己实现了在kafka server上存储consumer,topic,partitions,offset信息将消费的 offset 迁入到了 Kafka 一个名为 __consumer_offsets 的Topic中。
  • 2、将消费的 offset 存放在 Zookeeper 集群中。
  • 3、将offset存放至第三方存储,如Redis, 为了严格实现不重复消费

6.Producer写入消息流程图

  1. producer 从 zookeeper 的 “/brokers/…/state” 节点找到该 partition 的 leader分区
  2. producer 将消息发送给该 leader分区
  3. leader 将消息写入本地 log文件
  4. followers 从 leader pull 消息,写入本地 log文件 后 leader 发送 ACK给leader
  5. leader 收到所有 ISR 中的 replica 的 ACK 后,增加 HW(high watermark,最后 commit 的 offset) 并向 producer 发送 ACK

ack有3个可选值,分别是1,0,-1,ack默认是1
ack=1表示producer只要收到leader分区的成功写入通知就认为消息发送成功
ack=0表示producer只发送一次消息,不管发送成功与否
ack=-1表示producer只有收到所有副本的成功写入通知才认为消息发送成功

7.Consumer拉取消息流程图

消息的消费模型有两种:
1).推送模型(push)
2).拉取模型(pull)
pull拉取模型缺点:
如果kafka没有数据,消费者会陷入循环,一直等待消息达到。但可以在拉取消失时设置”长轮询”进行阻塞。
消费者总结:
1).kafka采用pull拉取模型,由消费者自己记录消费状态,每个消费者相互独立的顺序拉取每个分区的消息。
2).kafka生产者发布的所有消息会保存在kafka集群中,不管消息有没有被消费。用户可以通过设置保留时间来清理过期的数据,比如,设置保留策略为两天。那么,在消息发布之后,它可以被不同的消息消费,在两天之后,过期的消息就会自动消费。
3).消费者是以consumer group消费组的方式工作,由一个或多个消费者组成一个组,共同消费一个topic。每个分区在同一时间只能由group中的一个消费者读取,但是多个group可以同时消费这个partitionf分区。
4).消费者可以通过水平扩展的方式同时读取大量的消息,如果一个消费者失败了,那么group中的其他消费者成员会自动负载均衡读取之前消费者读取失败的分区。
图例说明:
上图中topic名称为”test_topic”,该topic有4个partition分区。有一个消费者组的3个consumer消费该主题,其中consumer0消费Partition0分区,consumer1消费partiton1和partition2分区,consumer2消费partition3分区。

发表评论

电子邮件地址不会被公开。 必填项已用*标注