kafka 深入

一、数据日志

  进入到日志目录里面有__consumer_offsets_*的文件夹,指的是有一个__consumer_offsets的topic,有50个分区在不同的broker数据目录中,里面有topic_0文件夹有00000000000000000000.index、00000000000000000000.log(数据)等,文件夹名称指的是offset的值,.log数据达到server.properties中配置的数据大小时会生成一个新的.log

二、kafka生产者

1、分区策略

1⃣️、分区的原因

(1)方便在集群中扩展,每个partition可以通过调整以适应它所在的机器,而一个topic又可以有多个partition组成,因此整个集群就可以适应任意大小的数据了;

(2)可以提高并发,因为可以以partition为单位读写。

2⃣️、分区的原则

2、数据可靠性保证

    为保证producer发送的数据,能可靠的发送到指定的topic,topic的每个partition收到producer发送的数据后,都需要向producer发送ack(acknowledgement确认收到),如果producer收到ack,就会进行下一轮的发送,否则重新发送数据。

1⃣️、副本数据同步策略

2⃣️、ISR

    采用第二种方案之后,设想一下情景:leader收到数据,所有的follower都开始同步数据,但有一个follower,因为某种故障,迟迟不能于leader进行同步,那leader就要一直等下去,直到它同步完成,才能发送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。

3⃣️、ack应答机制

    对于某些不太重要的数据,对数据的可靠性要求不是很高,能够容忍数据的少量丢失,所以没必要等ISR中的follower全部接受成功。所以Kafka为用户提供了三种可靠性级别,用户根据可靠性和延迟的要求进行权衡,选择以下的配置

ack参数配置:

    0:producer不等待broker的ack,这一操作提供了一个最低的延迟,broker一接受到还没有写入磁盘就已经返回,当broker故障时有可能丢失数据;

    1: producer等待broker的ack,partition的leader写入成功后返回ack,如果在follower同步成功之前leader故障,那么将会丢失数据;

    -1(all):producer等待broker的ack,partition的leader和follower全部写入成功后才会返回ack,但是如果在follower同步完成后,broker发送ack之前,leader发生故障,那么会造成数据重复。

4⃣️、故障处理细节

LEO:指的是每个副本最大的offset;

HW:指的是消费者能见到的最大的offset,ISR队列中最小的LEO

(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同步数据。

三、kafka消费者

1、消费方式

    consumer采用poll模式从broker中读取数据。push模式很难适应消费速率不同的消费者,因为消息发送速率是由broker决定的。

    poll模式不足之处是,如果kafka没有数据,消费者可能会陷入循环中,一直返回空数据。针对这一点,kafka的消费者在消费数据时会传入一个时长的参数,如果当前没有数据可供消费,consumer会等待一段时间之后在返回,这段时长即为timeout。

2、分区分配策略

    一个consumer group中有多个consumer,一个topic有多个partition,所以必然会涉及到partition的分配问题,即确定哪个partition由哪个consumer来消费。kafka有两种分配策略,一个是RoundRobin,一个是Range(默认)。

3、offset的维护

    由于consuemr在消费过程中可能会出现断电宕机等故障,consumer恢复后,需要从故障前的位置继续消费,所以consumer要记录自己消费到了哪个offset,以便故障恢复后继续消费。

    kafka0.9版本之前,consumer默认将offset保存在zookeeper中,从0.9版本开始,offset放到了一个内置的topic中__consumer_offsets。

该topic可以消费,修改consumer.properties将exclude.internal.topics=false。

读取offset

/usr/local/kafka/bin/kafka-console-consumer.sh --topic __consumer_offsets --bootstrap-server kafka-a:9092 --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter" --consumer.config /usr/local/kafka/config/consumer.properties  --from-beginning

offset : consuemr group + topic + partition

四、kafka高效读写数据

1、顺序写磁盘

    同样的磁盘,顺序写能到600M/s,而随机写只有100K/s

2、零拷贝

五、zookeeper在kafka中的作用

    kafka集群中有一个broker会选举为controller,负责管理集群broker的上下线,所有的topic的分区副本分配和leader选举等工作

leader选举流程

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值