我想了解log.flush.interval.messageskafka经纪人的设置.
在我们强制在日志上执行fsync之前写入日志分区的消息数
这是否意味着当它达到指定数量的消息时它会写入磁盘中的另一个文件?如果是这样的话:
同时
消息只有在从段文件刷新到磁盘后才会显示给消费者(http://notes.stephenholiday.com/Kafka.pdf)
然后,消费者总是从磁盘读取,因为它无法从段文件中读取?
存储在段文件和磁盘上有什么区别?
Luc*_*lie 15
我想要警告你的第一件事就是卡夫卡的论文有点过时,因为当时Kafka没有复制.我建议你在Kafka文档的复制部分阅读(如果还没有这样做).
正如本文所述,每个到达的消息都被写入段文件.但您必须记住,当您写入文件时,数据不会立即传输到磁盘设备,而是首先进行缓冲.强制执行此写操作的方法是调用fsync系统调用(请参阅man fsync),这就是"log.flush.interval.messages"和"log.flush.interval.ms"的用法.通过这些设置,您可以准确地告诉Kafka何时进行此刷新(在一定数量的消息或一段时间之后).但请注意,Kafka一般建议您不要设置这些并使用复制来提高持久性,并允许操作系统的后台刷新功能,因为它更有效(请参阅Kafka文档中的Broker配置).
对于问题的第二部分,正如Kafka文档的复制部分中所提到的,只有已提交的消息(当该分区的所有同步副本将其应用于其日志时,该消息被视为"已提交")对消费者而言.这是为了避免消费者在领导失败时可能会看到可能丢失的消息(因为它还没有被丢弃到磁盘).
@用户1870400
log.flush.interval.ms和均log.flush.interval.messages设置为 Max。它使 Kafka 将日志刷新到磁盘(例如fsync在 Linux 中)仅取决于文件系统。因此,即使您将 ack 设置为“all”,追随者副本(以及领导者本身)也无法确保从领导者获取的日志已刷新到磁盘。如果所有副本在刷新之前崩溃,日志就会丢失。Kafka之所以选择这样“不安全”的选择,是因为,正如论文所说:
Kafka avoid explicitly caching messages in memory at the Kafka layer.
Kafka rely on the underlying file system page cache.
This has the main benefit of avoiding double buffering---messages are only cached in the page cache.
This has the additional benefit of retaining warm cache even when a broker process is restarted.
Run Code Online (Sandbox Code Playgroud)
为了更好地利用文件系统缓存,kafka默认将两个flush间隔都设置为max。如果你想摆脱丢失的消息,即使 N 个代理崩溃,请将主题级配置flush.messages或代理级配置设置log.flush.interval.messages为 1。
| 归档时间: |
|
| 查看次数: |
7152 次 |
| 最近记录: |