阅读kafka broker相关文档
This commit is contained in:
@@ -346,12 +346,27 @@ follower从leader分区消息消息,就像一个普通的消费者一样,并
|
||||
|
||||
另外,**如果一个节点仍然处于活跃状态,但是离同步leader的数据有很长的延迟,那么leader将会将该节点从ISR中移除**。延迟的最长时间通过`replica.lag.time.max.ms`来配置。如果在`replica.lag.time.max.ms`时间内副本没能通过leader到日志结尾的数据,那么副本节点将会从ISR中被移除。
|
||||
|
||||
> `replica.lag.time.max.ms`的默认值为30s
|
||||
|
||||
#### 消息提交的定义
|
||||
在某分区对应ISR中所有的副本都将消息追加到它们的log后,则可以认为该消息被提交。故而,消费者并无需担心分区的leader宕机后消息会丢失的问题,因为消息在提交前已经持久化到其分区副本中。
|
||||
|
||||
作为生产者,可以在发送消息时决定是否等待消息被提交,这需要在等待提交所带来的延迟和不等待提交所带来的消息丢失风险中进行权衡。是否等待提交取决于生产者的ack设置。
|
||||
|
||||
#### acks
|
||||
可以针对生产者设置acks模式。acks模式可设置为如下值:
|
||||
- 0:此时生产者发送消息时无需等待broker的ack,消息会被直接添加到缓冲区中,并且消息被认为已发送成功。此时并无法保证消息被发送给broker,并且重试设置也不会起作用
|
||||
- 1:这种情况下会等待来自于leader的ack,保证消息被写入到leader分区中。但是,如果leader broker返回ack后立马宕机,其他副本broker并没有同步leader分区数据,那么消息将会被丢失
|
||||
- -1(all):这种情况下,leader broker会等待ISR队列中所有的副本broker都对该消息返回ack后才对生产者返回ack。此时只要当前集群中还存在一个in-sync副本,那么消息就不会丢失
|
||||
|
||||
> `acks`的默认值是-1(all)
|
||||
|
||||
> acks=-1的情况下会产生重复数据的问题,如果发送消息后,消息已经全部存储到所有的broker,但是再尚未ack的情况下leader宕机,那么生产者会重新发送消息,此时消息会被重复存储在消息队列中
|
||||
|
||||
#### 最小写入副本数
|
||||
topic可以设置一个最小写入的副本数,通过配置`min.insync.replicas`,可以对最小写入副本数进行配置。即使消息已经同步到所有ISR副本后,如果同步数目小于该值(同步数目包含leader),消息也无法被视为提交
|
||||
当acks设置为-1(all)时,topic可以设置一个最小写入的副本数,通过配置`min.insync.replicas`,可以对最小写入副本数进行配置。即使消息已经同步到所有ISR副本后,如果同步数目小于该值(同步数目包含leader),消息也无法被视为提交
|
||||
|
||||
> `min.insync.replicas`的值默认为1. 该值只有当生产者ack模式设置为-1(all)时才起作用
|
||||
|
||||
> kafka保证一条消息只要被提交,只要有一个in-sync-replica处于活跃状态,那么消息就不会被丢失
|
||||
|
||||
|
||||
Reference in New Issue
Block a user