kafka总结

2019-07-29  本文已影响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会发生什么?要怎样恢复正常?这样做是可接受的吗? 

上一篇 下一篇

猜你喜欢

热点阅读