美文网首页
kafka总结

kafka总结

作者: 飞天的龙王 | 来源:发表于2019-07-29 11:46 被阅读0次

    Kafka

    消息到分区

    生产者产生的消息不支持rehash,所以如果partition数量变更了,而消息又是根据key值用默认分区器hash到partition的,那么就会发生消息错乱。

    消费者支持rehash分配处理partition。

    (数据不会rehash,但是消费者会,这样可以避免数据移动的损耗,但是提供消费者横向扩展、容错处理的能力。rehash的时候消费者不可用)

    生产者配置:

    Ack:0(没),1(leader),all(isr)(解决发送时丢消息的部分问题)

    批量:是/否

    模式:同步/异步

    可以配置日志压缩

    1. 生产请求

    Accepter-》processor线程池

    请求元数据(类似nameservice存储的信息):

    任何broker都有元数据的缓存,所以可以直接获取,然后缓存在本地

    请求发送消息:

    只有通过leader分区才能发送消息。follower主动或者被动获取leader的新消息。发送消息后,根据ack值,需要等待follower接受消息

    响应后才能返回客户端。

    分区器:生产者消息发送分区策略1. RoundRobin  2. Key hash 3.自定义

    2. 消费请求

    请求获取消息:

    推拉结合。消费者或者follower可以poll获取消息;也可以broker累计的消息到达阀值主动push到对端

    消费者可以配置timeout时间,超过时间则获取足够的消息,虽然可能不满足消息推送的阀值。

    而且只能获取所有已经同步到isr的消息(高水位消息)。(防止同步不正常,因为follower的分区也是消费者)。所以复制延时也会影响消费读取延时。

    消费者绑定消费分区策略:1. Range  (默认。主题内连续数量多分区绑定到消费者)2. RoundRobin (主题分区轮训绑定消费者)

    3. 存储

    分区分配到broker:默认round robin

    Topic(1)-> Partition(N个分区*M个备份)-> Segment(N*M*K个文件)

    支持压缩消息,一个同样的消息格式中的值部分包装了n个小消息,每个小消息都有完整的消息格式

    Partition:Index为1:1.(所以索引也是分段的)索引把偏移量映射到segment和偏移量在segment里的位置 

    Kafka 通过改变主题的保留策略来满足需要的不同应用场景(最新状态或者某一个时间点之前的状态)

    通过保留键的最新值实现。

    数据压缩清理:通过选取污浊率最高的segment来清理,通过一个map记录所有污浊的消息信息,然后对比segment中的信息,把最新的消费放入替换片段。最后一次性替换片段

    4. 可靠性复制

    Kafka可靠性保证:

    •  Kafka可以保证分区消息的顺序。 

    •  只有当消息被写入分区的所有同步副本(isr)时(但不一定要写入磁盘),它才被认为是“ 已提交”的。生产者可以选择接收不同类型的ack。 

    •  只要还有一个副本是活跃的,那么已经提交的消息就不会丢失 。 消费者只能读取已经提交的悄息。 

    broker可靠性

    可靠性配置可以在:1. borker级别2. topic级别

    在topic级别配置支持:Kafka集群同时拥有可靠的主题和非可靠的主题 

    影响可用性的配置:

    1. 复制系数:replicatlon.factor,指示需要多少个副本(包括leader在内)

    2. 不完全leader选举:unclean.leader.election.enable(默认false),指示在只有不同步副本的情况下,要不要从中选举出leader(提高可用性,牺牲一致性可靠性)

    3. 最少同步副本:min.insync.replica,指示最少的同步副本情况下,才能让客户端写入,否则客户端写入返回异常,但是当小于此值的时候允许只读。(一定程度上避免2中写入与读取发生非预期的行为)

    producer可靠性

    根据可靠性需求配置恰当的 acks值(0,1,all)

    配置生产者retry次数(针对可恢复的异常,如网络链接问题、leader选举问题);配置客户应用的错误处理逻辑实现(落地或者丢弃等)

    consumer可靠性

    enable.auto.commit:配置自动确认

    auto.commit.interval.ms:自动提交频度。(性能和重复消息数量之间的权衡)

    显式提交偏移量:

     a.总是在处理完事件后再提交偏移量 

     b.注意再均衡时候偏移量的处理

     c.消费者可能需要重试(可放到另外一个主题,一个单独的线程订阅处理) 

     d.消费者可能需要维护状态 (同时保存偏移量与中间结果)

     e.长时间处理 (线程池模式)

     f.  仅一次传递 (保存到一个有唯一键的存储,幂等性写入)

    可靠性测试

    • 客户端从服务器断开连接 

    • 首领选举 :如果我停掉首领会发生什么事情?生产者和消费者重新恢复正常状态需要 多 长时间? 

    • 控制器选举 : 重启控制器后系统需要多少时间来恢复状态? 

    • 依次重启:可以依次重启 brok巳r而不丢失任何数据吗? 

    •不完全首领选举测试 :如果依次停止所有副本(确保每个副本都变为不同步的),然后 启动一个不同步的 broker会发生什么?要怎样恢复正常?这样做是可接受的吗? 

    相关文章

      网友评论

          本文标题:kafka总结

          本文链接:https://www.haomeiwen.com/subject/wtavrctx.html