当其中一个副本出现故障并且该副本中的分区被重新分配给其他代理时,kafka生产者会怎么样?他们会开始失败吗?或者这个故障转移过程是完全透明的?
4si2a6ki1#
这取决于你的制片人( acks )以及 retries 配置和代理端 min.insync.replicas 配置和主题 replication-factor .如果您有适当的配置和适当的集群大小,那么在大多数情况下,一个副本故障转移是透明的。例如,acks=1并重试2或3次,min.insync.replicas小于主题复制因子。
acks
retries
min.insync.replicas
replication-factor
qojgxg4l2#
只要可以在可配置的时间段内为失败的分区引线分配一个新的引线,该过程就是透明的。分配给其前导位于失败的代理中的分区的消息在生产者中排队等待request.timeout.ms。如果在这段时间内分配了一个新的前导,这是当您有多个代理且rf>1时的正常情况,那么所有排队的消息都将发送给新的前导。如果在该时间之后无法为失败分区分配新的前导,则生产者将抛出org.apache.kafka.common.errors.timeoutexception:batch expired。还可能发生这样的情况:生产者在新的引线可用之前填充发送缓冲区(使用可配置的大小buffer.memory)。在这种情况下,producer将阻塞max.block.ms,之后还会抛出timeoutexception。
2条答案
按热度按时间4si2a6ki1#
这取决于你的制片人(
acks
)以及retries
配置和代理端min.insync.replicas
配置和主题replication-factor
.如果您有适当的配置和适当的集群大小,那么在大多数情况下,一个副本故障转移是透明的。例如,acks=1并重试2或3次,min.insync.replicas小于主题复制因子。
qojgxg4l2#
只要可以在可配置的时间段内为失败的分区引线分配一个新的引线,该过程就是透明的。
分配给其前导位于失败的代理中的分区的消息在生产者中排队等待request.timeout.ms。如果在这段时间内分配了一个新的前导,这是当您有多个代理且rf>1时的正常情况,那么所有排队的消息都将发送给新的前导。如果在该时间之后无法为失败分区分配新的前导,则生产者将抛出org.apache.kafka.common.errors.timeoutexception:batch expired。
还可能发生这样的情况:生产者在新的引线可用之前填充发送缓冲区(使用可配置的大小buffer.memory)。在这种情况下,producer将阻塞max.block.ms,之后还会抛出timeoutexception。