kafka生产数据的分组策略
生产者决定数据产生到集群的哪个partition中
- 轮巡方式;
- 自定义分组策略;
- 指定具体分区;
kafka的ack机制
0:生产者不会等待broker的ack,这个延迟最低但是存储的保证最弱,当server挂掉的时候就会丢数据;
1:等待服务端的ack值,leader副本确认接收到消息后发送ack,但是如果leader挂掉后它
不保证是否对follower复制完成,新leader也会导致数据丢失;
-1(all):在1的基础上服务端会等所有的follower的副本收到数据后才会收到leader发出的ack,这样数据不会丢失;
topic partition的数据如何保存到硬盘
topic的partition以文件夹的形式保存到broker,每个分区序号从0开始递增,且消息有序;
partition文件夹下有多个segment(xxx.index,xxx.log),segment文件大小默认为1G,可以通过配置文件修改此默认值,如果大小大于1G时,会生成新的segment文件并且以上一个segment最后一条消息的偏移量命名;
kafka新建的topic partition会在哪个目录下创建
在启动Kafka集群之前,我们需要配置好log.dirs参数,其值是Kafka数据的存放目录,
这个参数可以配置多个目录,目录之间使用逗号分隔,通常这些目录是分布在不同的磁盘
上用于提高读写性能。
当然我们也可以配置log.dir参数,含义一样。只需要设置其中一个即可。
如果log.dirs参数只配置了一个目录,那么分配到各个Broker上的分区肯定只能在这个
目录下创建文件夹用于存放数据。
但是如果log.dirs参数配置了多个目录,那么Kafka会在哪个文件夹中创建分区目录呢?
答案是:Kafka会在含有分区目录最少的文件夹中创建新的分区目录,分区目录名为Topic
名+分区ID。注意是分区文件夹总数最少的目录,而不是磁盘使用量最少的目录!也就是说,如果你给log.dirs参数新增了一个新的目录,新的分区目录肯定是先在这个新的目录上创建直到这个新的磁盘目录拥有的分区目录不是最少为止。
kafka创建topic时如何将分区分配到不同的broker中
5个broker,5个分区,假设第一个分区分配到第四个broker上,那么第二个分区会分配到第五个broker上,第三个分区会分配到第一个broker上,依次类推。
第一个分区随机分配broker。
kafka与传统消息系统之间有三个关键区别
1、Kafka持久化日志,这些日志可以被重复读取,默认保留7天;
2、kafka是一个分布式系统:它以集群的方式运行,可以灵活伸缩,在内部通过复制数据提升容错能力和高可用性;
3、kafka支持实时的流式处理;
kafka高效文件存储设计特点
1、kafka把topic中每一个parition大文件分成多个小文件段,通过多个小文件段,就容易定期清除或删除已经消费完的文件,减少磁盘占用;
2、通过索引信息可以快速定位message和确定response的最大大小;
3、通过index元数据全部映射到memory,可以避免segment file的IO磁盘操作;
4、通过索引文件稀疏存储,可以大幅降低index文件元数据占用空间大小;
kafka存储在硬盘上的消息格式
消息由一个固定长度的头部和可变长度的字节数组组成。头部包含了一个版本号和CRC32
校验码。
kafka消息是采用Pull模式,还是Push模式?
Kafka最初考虑的问题是,customer 应该从 brokes 拉取消息还是 brokers 将消息推送到
consumer,也就是 pull 还 push。在这方面,Kafka 遵循了一种大部分消息系统共同的传统的设计:producer 将消息推送到 broker,consumer 从 broker 拉取消息。
一些消息系统比如 Scribe 和 Apache Flume 采用了 push 模式,将消息推送到下游的
consumer。这样做有好处也有坏处:由 broker 决定消息推送的速率,对于不同消费速率的consumer 就不太好处理了。消息系统都致力于让 consumer 以最大的速率最快速的消费消息,但不幸的是,push 模式下,当 broker 推送的速率远大于 consumer 消费的速率时,consumer 恐怕就要崩溃了。最终 Kafka 还是选取了传统的 pull 模式。
Pull 模式的另外一个好处是 consumer 可以自主决定是否批量的从 broker 拉取数据。Push模式必须在不知道下游 consumer 消费能力和消费策略的情况下决定是立即推送每条消息还是缓存之后批量推送。如果为了避免 consumer 崩溃而采用较低的推送速率,将可能导致一次只推送较少的消息而造成浪费。Pull 模式下,consumer 就可以根据自己的消费能力去决定这些策略。
Pull 有个缺点是:如果 broker 没有可供消费的消息,将导致 consumer 不断在循环中轮询,直到新消息到达。为了避免这点,Kafka 可以使用poll(long timeout)阻塞等待一段时间。
数据传输的事物定义有哪三种?
1、最多一次:消息不会被重复发送,最多被传输一次,但也有可能一次不传输;
2、最少一次:消息不会被漏发送,最少被传输一次,但也有可能被重复传输;
3、精确的一次(Exactly once):不会漏传也不会重复传输,每个消息都传输被一次而且仅仅被传输一次,这是大家所期望的;