异步、解耦、削峰填谷
kafka的topic和分区内部是如何存储的,有什么特点?- 在Kafka文件存储中,同一个topic下有多个不同partition,每个partition为一个目录,partiton命名规则为topic名称+有序序号,第一个partiton序号从0开始,序号最大值为partitions数量减1。
- 每个partion(目录)相当于一个巨型文件被平均分配到多个大小相等segment(段)数据文件中。但每个段segment file消息数量不一定相等,这种特性方便old segment file快速被删除。
- segment file组成:由2大部分组成,分别为index file和data file,此2个文件一一对应,成对出现,后缀".index"和“.log”分别表示为segment索引文件、数据文件.
Kafka 采取拉取模型(Poll),由自己控制消费速度,以及消费的进度,消费者可以按照任意的偏移量进行消费。
kafka如何实现分布式的数据存储和数据读取?kafka通过副本的形式来完成kafka服务的高可用性,每个分区可以有多个副本,由一个leader和多个follower组成。
数据存储的时候先要计算出数据将要存储在哪个分区,再找到这个分区的leader节点,将数据存储进去,分区的其他follower节点定时从leader节点同步数据,通过ack的机制确保数据同步完成。同步完成后更新LEO和HW。
数据读取时从leader读取数据,可见的数据最多到HW。
为什么需要分区,也就是说主题只有一个分区,难道不行吗?分区可以提高topic的并发吞吐量,每个分区的数据都是有序的,多个分区就可以用多个consumer进行消费。
日志为什么要分段?一个日志文件如果过大,会降低查找数据的速度。
kafka是依靠什么机制保持高可靠,高可用?通过ack、事务、LEO、HW的机制保证数据可靠性,
通过副本以及ISR的机制保证服务高可用性。
通过事务
重平衡(reblance)的触发条件:重平衡的触发条件主要有三个:
- 消费者组内成员发生变更,这个变更包括了增加和减少消费者。注意这里的减少有很大的可能是被动的,就是某个消费者崩溃退出了
- 主题的分区数发生变更,kafka目前只支持增加分区,当增加的时候就会触发重平衡
- 订阅的主题发生变化,当消费者组使用正则表达式订阅主题,而恰好又新建了对应的主题,就会触发重平衡
选择合适的Partition数量。
如何降低集群不可用性,单节点上Partition数目不超过3000;整个集群的分区总数不超过10000。
如何减少端对端的延迟,每个broker的partition数量最好不超过100*broker*replica个。
建议:单个Partition的磁盘占用最大不超过100GB(计算方法:所属Topic的数据流量除以Partition数,然后乘以保存时间)
*
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)