kafka总结
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会发生什么?要怎样恢复正常?这样做是可接受的吗?