作者:神秘雯泽芳子 | 来源:互联网 | 2023-07-07 16:29
1.Topic的分片与副本机制分片:逻辑概念相当于将一个topic(大容器)拆分为N多个小的容器,多个小的容器构建为一个Topic(大容器)目的:1-提高读写的效率:分片可以分布
1. Topic的分片与副本机制
分片: 逻辑概念
相当于将一个topic(大容器)拆分为N多个小的容器, 多个小的容器构建为一个Topic(大容器)
目的:
1- 提高读写的效率: 分片可以分布在不同节点上, 在进行读写的时候, 可以让多个节点一起负责
2- 分布式存储: 解决单台节点存储容量有限的问题
分片的数量: 分片是可以创建N多个, 理论上没有任何的限制
副本: 物理概念
针对每个分片的数据, 可以设置备份, 可以将其备份多个
目的:
提高数据的可靠性, 防止数据丢失
副本的数量: 副本的数量最多与节点的数量保持一致, 但是一般设置2个 或者 3个最多了
2. kafka如何保证数据不丢失
2.1AC机制
当生产者将数据生产到Broker后, Broker应该给予一个ack确认响应, 在kafka中, 主要提供了三种ack的方案:
ack=0 : 生产者只管发送数据, 不关心不接收Broker给予的响应
ack=1 : 生产者将数据发送到Broker端, 需要等待Broker端对应的Topic上对应分片上的主副本接收到消息后, 才认为发送成功了
ack=-1|ALL: 生产者将数据发送到Broker端, 需要等待Broker端对应的Topic上对应分片上的所有的副本都接收到消息后, 才认为发送成功了
效率角度: 0 > 1 > -1
安全角度: -1 > 1 > 0
思考: 请问在实际使用中, 使用什么方案呢? 三种都有可能
一般要根据消息的重要程度, 来选择对应的方案, 如果数据非常重要, 不能丢失, 选择为 -1 ,如果说无所谓 那么就选择 0 , 可以允许一定丢失 1 同时还要结合生产的速率也要作为一定判定依据
2.2相关思考
思考1: 如果Broker迟迟没有给予ACK响应如何解决呢?
解决方案: 设置超时时间, 如果超时触发重试策略, 如果多次重试依然无法解决, 此时程序直接报错
思考2: 每发送一次数据, broker就要给予一次ACK响应, 这样是否会对网络带宽产生影响, 如何解决?
解决方案: 会,引入缓存池, 满足一批数据后, 异步发送给Broker端, Broker端只需要针对这一批数据给予一次响应即可
思考3: 通过一批一批的异步发送数据, 如果Broker端对这一批数据没有给予响应, 但是缓存池子中数据已经满了, 如何解决呢?
解决方案: 选择清空缓存池 或者 不清空. 如果数据是可重复读的, 那么直接让程序报错即可, 通知处理, 处理后, 直接在重新读取发送即可, 如果数据不是可重复读, 为了避免这个问题的发生, 我们可以将生产的数据在其他的位置也写一份, 当数据生产成功, 那么就删除其中相关数据, 如果生成失败, 后续从对应位置上在重新拉取处理即可 如果选择不清空, 那么阻塞写入, 一直等待即可...