kafka 学习笔记

特点: 每秒几十万条 consumer主动pull消息  分区  副本,所有消息都会存在磁盘上

应用场景:行为跟踪 日志

 

角色:

    consumer:消息的接受者

    broker:消kafka服务提供者 

    producer:消息的生产者

    coordinator:Rebalace 以及管理,consumer, 一个group中有一个coordinator   (当前负载最小的broker); 当第一台组中的consumer启动时kafka 会和broker确认 cooedinator

    consumer leader: 制定rebalance策略发给coordinator

      

     

概念:

    topic:消息的集合(消息存储的逻辑概念)  物理层面:不同的topic是分开存储的

    partition:分区  每个topic可以划分多个分区 ,相同topic的不同分区下的消息是不同的;同一个分区可以保证消息的顺序,跨分区了则不保证

                    物理路径:/tmp/kakka-lofs/...-1

    group:消费者中的概念  一条消息会发送给所有订阅该topic的消费组   但一个消费组只有一个消费者能收到该消息 

    replication:副本 消息冗余的备份(分散存放在其他broker节点 )  提高可靠性 当某个节点挂掉后不会丢消息

    offset消息的指针 每个group都有一个

 

命令:

    启动:./kafka-server-start.sh -daemon ../config/server.properties 

 

集群:

    1.修改server.properties 文件  

            zookeeper,connection 改成一样的节点 ,号隔开 

            broker.id唯一性

            listeners:当前ip 地址

    2.选举逻辑:

        最早注册 ids:最小的节点

 

在zookeeper中的节点含义:

    controller:控制中心信息

        

[zk: localhost:2181(CONNECTED) 1] get /controller

{"version":1,"brokerid":0,"timestamp":"1535464742258"}  //brokerid  master节点 

cZxid = 0x1600000010

ctime = Tue Aug 28 21:59:00 CST 2018

mZxid = 0x1600000010

mtime = Tue Aug 28 21:59:00 CST 2018

pZxid = 0x1600000010

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x26580d3f8010000

dataLength = 54

numChildren = 0

 

 

javaAPI参数:

    

1.ProducerConfig.ACKS_CONFIG //发送给broker以后是否需要确认 (0:消息发送给broker后不需要确认  ,1:只需要kafka集群中的leader节点的确认即可返回 ,-1:需要集群中的所有节点都确认)

2.ProducerConfig.BATCH_SIZE_CONFIG   //  ,默认16KB producer中 对于同一个分区来说 会按照batch.size的大小手机统一进行批量发送

3.ProducerConfig.LINGER_MS_CONFIG //默认值是0  在该属性设置的时间内批量发送    ps:2,3可配合使用满足其中之一就会发送  故如果不修改lingerMs时 batchSize也不会起作用

4.ProducerConfig.MAX_REQUEST_SIZE_CONFIG // 默认1mb  超过该值的大小则发送失败

5.ProducerConfig.RETRIES_CONFIG  //失败的重试次数

6.ProducerConfig.PARTITIONER_CLASS_CONFIG //自定义分区策略的类全路径  

 

 

1.ConsumerConfig.AUTO_OFFSET_RESET_CONFIG  //earliest 对于新的groupid来说从头开始取最新的   对于已经消费过的groupid来说 他会从已经消费的最大的offset来取

                                                                                  //latest 对于新的groupid来说直接取已经消费并且提交的最大的offset   

                                                                                  //none 对于新的groupid来说 没有offset则抛异常          

2.ConsumerConfig.GROUP_ID_CONFIG //groupId 

3.ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG //true 消息读取后自动提交读取已读取信息  false:手动提交  更灵活 有回调等

4.ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG //自动提交间隔时间

5.ConsumerConfig.MAX_POLL_RECORDS_CONFIG //一次poll拿到的最多消息数 

 

 

注意 Or QA

1.kafka 1.0版本以后默认是异步发送,当然也可以设置为同步发送

2.消息是由[key]-value组成   key:决定放到哪个分区 ;可以扩展自定义分区策略  实现Partitioner  ;默认算法为hash取模  如果key是null会随机选择 (metadata.max) 10分钟更新一次

3.消费者可以指定消费哪个分区

4.如果存在多个消费者并且不指定消费者消费哪个分区的话,kafka会按照一定策略平均分配分区(最好消费者数量是分区数的整数倍  达到平局分配的目的) 消费者>分区数 会有部分消费者不工作

5.在一个分区中是不予许并发的,否则会出现问题

6.增减consumer,broker,partition会导致Rebalance(重置负载策略)

7.分区分配策略     

    Range(范围)->默认 缺点:如果有3个消费者 ,消费2个topic每个topic有10个分区 第一个消费者就需要比其他消费者多消费两个分区 

    

    RoundBobin(轮询):消费者和分区数都列出来按照hashcode排序后轮询

        必须满足条件:  1.每个消费者订阅的主题必须相同 2.每个主题的消费者必须具有相同数据的流??

 8.什么时候回触发rebalance 

     对于consumer group新增消费者的时候

     消费者离开了consumer group

    topic中新增了分区

    消费者主动取消了订阅 

 

9.谁来执行Rebalance 策略

   consumer制定策略 coordinator 下发策略  consumer执行分配策略(新版本 1.0 )   zookeeper执行(老版本 )

 

10.offset在哪里维护

    zk:/brokers/topics  _consumer_offsets 50个分区 保存消费者 offset的位置   ,持久化在/tmp/kafka-logs

 

11.如何找到当前的consumer group的offset维护在哪个分区中

    1.("groupID".hashCode())%50(默认是50) 假设等于A

    2.找到_consumer_offsets-A  

    3.查看 consumer_offsets-A  命令:

    

sh kafka-simple-consumer-shell.sh --topic _consumer_offsets --partion A --broker-list 集群IP --formatter "kafka.coordinator.groupMetaManager\$OffsetsMessageFormatter"

 

12.以上 tmp目录是可以配置的 默认是tmp生产的时候最好不要放在tmp上

 

13.broker如何分配分区

    根据broker数量和分区数顺序分配


14.消息的写入性能保证:

        写入的顺序性(追加)

 

        0拷贝(sendfile)

            直接从内核空间拷贝到socket buffer 不用拷贝到应用的用户空间

 

        消息的存储机制

            根据阈值(可配置 log.segment.bytes) 分段 保存logSegment(消息) 

 

15.如何查看消息内容

    命令:

sh kafka-run-class.sh kafka.tools.DumpLogSegments --files /tmp/kafuka-logs/.....log --prit-data-log

 

 16.topic_*文件含义

    .index:文件索引

    .timeindex:时间索引

    .log:消息信息

    leader-epoch-checkpoint
 

17.索引的查找思想

   稀疏索引

    

   18.如果已知offset怎么查找消息的内容

        index:

            通过二分查找文件的名称(文件的名称是文件中第一条消息的offset) 找到索引文件

             因为索引文件中索引的稀疏度一致所以能通过索引定位position

             通过position定位log文件中的位置范围 然后查找该offset的内容

        

        timeindex:

            通过时间代替物理偏移量查找

    

    19.消息的清理和压缩

           清理:根据时间或大小(可配)清理

           压缩:相同的key 保留最新的value值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值