kafka

观察验证ISR弹性

下面是kafka 自己维护得offset

kafka poll等待时间_kafka

创建分区

kafka-topics.sh  --zookeeper  server1:2181,server2:2181/kafka --create  --topic zjj-items --partitions 2 --replication-factor 3

查看分区

[root@localhost vmuser]#  kafka-topics.sh  --zookeeper  server1:2181,server2:2181/kafka --describe  --topic zjj-items
Topic: zjj-items        PartitionCount: 2       ReplicationFactor: 3    Configs: 
        Topic: zjj-items        Partition: 0    Leader: 1       Replicas: 1,2,0 Isr: 1,2,0
        Topic: zjj-items        Partition: 1    Leader: 2       Replicas: 2,0,1 Isr: 2,0,1

kafka poll等待时间_zookeeper_02

创建完成之后,可以在目录下查看到创建改分区结构

kafka poll等待时间_kafka poll等待时间_03

  • index 是他得偏移量、
  • log 是存入数据
  • timeiindex 时间偏移量索引

kafka poll等待时间_zookeeper_04


从上面看出来 index 与timeindex 都是10M,是因为用了mmap得预分配

jps
lsof -Pnp 25647

格式话文件内容展示

[root@localhost zjj-items-0]#  --files 00000000000000000000.log
Dumping 00000000000000000000.log
Starting offset: 0

我们从里面打点数据

kafka poll等待时间_分布式_05

可以看到里面得偏移量与数据

kafka poll等待时间_kafka poll等待时间_06

kafka poll等待时间_kafka poll等待时间_07

kafka poll等待时间_分布式_08

ack=0 的时候,将node02,指向其他位置,不让其网络通讯

kafka poll等待时间_kafka_09

这个时候kafka producer依然可以正常发送数据

ack=1 的时候

kafka poll等待时间_zookeeper_10


kafka poll等待时间_kafka_11

producer依然可以正常发送数据,但是在 isr里面 2 已经被提出去了

ack=-1 的时候

>


kafka poll等待时间_apache_13

producer 客户端会卡10秒左右正常发送数据,irs剔除node2,

kafka poll等待时间_分布式_14

注意啊 partition1 里面 isr为什么踢出去2,是因为 partition1 里面 1是leader,而partition0 里面 3是leader,3无法通信2 所以踢出去,但是 1可以正常通信2

时间戳索引,自定义offset偏移

自定义offset 本质是seek

/**
         * 以下代码是你再未来开发的时候,向通过自定时间点的方式,自定义消费数据位置
         *
         * 其实本质,核心知识是seek方法
         *
         * 举一反三:
         * 1,通过时间换算出offset,再通过seek来自定义偏移
         * 2,如果你自己维护offset持久化~!!!通过seek完成
         *
         */

        Map<TopicPartition, Long> tts =new HashMap<>();
        //通过consumer取回自己分配的分区 as

        Set<TopicPartition> as = consumer.assignment();

        while(as.size()==0){
            consumer.poll(Duration.ofMillis(100));
            as = consumer.assignment();
        }

        //自己填充一个hashmap,为每个分区设置对应的时间戳
        for (TopicPartition partition : as) {
//            tts.put(partition,System.currentTimeMillis()-1*1000);
            tts.put(partition,1610629127300L);
        }
        //通过consumer的api,取回timeindex的数据
        Map<TopicPartition, OffsetAndTimestamp> offtime = consumer.offsetsForTimes(tts);


        for (TopicPartition partition : as) {
            //通过取回的offset数据,通过consumer的seek方法,修正自己的消费偏移
            OffsetAndTimestamp offsetAndTimestamp = offtime.get(partition);
            long offset = offsetAndTimestamp.offset();  //不是通过time 换 offset,如果是从mysql读取回来,其本质是一样的
            System.out.println(offset);
            consumer.seek(partition,offset);

        }

     // 暂停查看偏移量
        try {
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        }