kafka-5.观察验证ISR弹性,时间戳索引,自定义offset偏移

kafka

观察验证ISR弹性

下面是kafka 自己维护得offset

在这里插入图片描述

创建分区

 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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述
从上面看出来 index 与timeindex 都是10M,是因为用了mmap得预分配

jps
lsof -Pnp 25647

格式话文件内容展示

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

我们从里面打点数据

在这里插入图片描述

可以看到里面得偏移量与数据
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

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

ack=1 的时候

在这里插入图片描述
在这里插入图片描述

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

ack=-1 的时候

>
在这里插入图片描述

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

在这里插入图片描述

注意啊 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();
        }


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值