1.Kafka的架构图
名词解释:
Producer:消息生产者.kafka发送的一端
Consumer:消息消费者,向kafka取数据的一端
Consumer Group:消费者组,有多个consummer组成.组内每个消费者负责消费不同分区的数据.
Broker: 每台服务器就是一个broker,也就是一个节点.包含多个topic.
Topic:消费主题,消费者和生产者都是面向的是topic.
Partition:一个大的topic可以分为多个partition,每个partition内部都是有序的.
Replic:partition的副本.为了保证集群的某个节点发生故障时,该节点的partition数据不丢失,且kafka正常的工作.kafka提供副本机制,一个topic的每个分区都有若干个副本,一个leader和多个follower.
2.Kafka的工作流程
一个broker中多个topic
一个topic中可以有多个partition
一个partition多个segment
一segment有.log和.index,这两个文件位于一个文件夹下,该文件夹的命名规则为:topic+分区号. “.index”文件存储大量的索引信息,“.log”文件存储大量的数据,索引文件中的元数据指向对应数据文件中message的物理偏移地址。
3.Kafka 分区策略(producer)
为了Producer发送的数据能可靠的到达指定的topic,topic的每个partition收到数据后,都会向producer发送ack,如果producer收到ack,就会继续发送数据,否则重新发.
- 副本数据同步策略
1)半数以上完成同步,就发送ack, 优点:延迟低 缺点:选举新的leader时,容忍n台节点的故障,需要2n+1个副本
2)全部完成同步,才发送ack 优点:选举新的leader时,容忍n个节点的故障,需要n+1个副本. 缺点:延迟高.
第一种方案会造成大量的数据的冗余,虽然第二种方案的网络延迟比较高,但是网络延迟对kafka的影响比较小.所以采用的是第二种方案.
- ISR(in-sync replica set (ISR)) 解决全部完成同步,才发送ack中某个follower因故障迟迟不能与leader同步.这个时候,这个故障的follower就会被踢出ISR.如果是leader发生故障,就会从ISR中选举leader.
参数设置:
replica.lag.time.max.ms 设置时间阈值
- ack应该机制
有些数据不是很重要的数据,能够容忍数据少量丢失,所以没必要等ISR中的follower全部接收成功.
因此,kafka提供了三种可靠性,用来让用户来权衡
ack 参数配置
ack=0: producer不等待broker的ack,这种方式延时最低,broker收到没有写入磁盘就返回ack,当broker故障就有可能丢失数据.
ack=1: producer等待broker的ack,partition 的leader写入成功返回ack,如果follower在同步数据之前leader就故障,数据就会丢失.
ack=-1:producer等待broker的ack,partition的leader和follower全部成功写入.才会返回ack,但是如果在follower同步完成后,broker发送ack之前,leader发生故障那么会造成数据重复.
- Exacttly One: 将服务器的ack 级别设置为-1 保证producer到Server之间不会丢失数据这就是At least once的含义,0.11版本后引入了幂等性就构成了Exactly Once. 幂等性指的是 Producer不管想Server发送多少次重复数据,server只会持久化一条数据.
参数修改:
enable.idompotence=true
4.kafka分区(consumer端)
分区分配策略
一个consumer group中有多个consumer,一个 topic有多个partition,所以必然会涉及到partition的分配问题.
Kafka在consumer端有两种分配策略. 第一种:Roundrobin(轮询) 第二种:range
5.offset的维护
Kafka 0.9版本之前,consumer默认将offset保存在Zookeeper中,从0.9版本开始,consumer默认将offset保存在Kafka一个内置的topic中,该topic为__consumer_offsets