kafka消息的可靠性

Posted 163yun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kafka消息的可靠性相关的知识,希望对你有一定的参考价值。

本文来自网易云社区

作者:田宏增


Kafka的高可靠性的保障来源于其健壮的副本(replication)策略。通过调节其副本相关参数,可以使得Kafka在性能和可靠性之间运转的游刃有余。Kafka从0.8.x版本开始提供partition级别的复制,replication的数量可以在$KAFKA_HOME/config/server.properties中配置。

Kafka中消息是以topic进行分类的,生产者通过topic向Kafka broker发送消息,消费者通过topic读取数据。然而topic在物理层面又能以partition为分组,一个topic可以分成若干个partition。Kafka中的消息以顺序的方式存储在文件中。

Kafka中的topic的partition有N个副本(replicas)。N个replicas中,其中一个replica为leader,其他都为follower, leader处理partition的所有读写请求,follower定期地去复制leader上的数据。

如果leader发生故障或挂掉,一个新leader被选举并被接受客户端的消息成功写入。Kafka确保从同步副本列表中选举一个副本为leader,或者说follower追赶leader数据。


Kafka的ack机制。

当producer向leader发送数据时,可以通过request.required.acks参数来设置数据可靠性的级别:

   1(默认):这意味着producer在ISR中的leader已成功收到的数据并得到确认后发送下一条message。如果leader宕机了,则会丢失数据。

   0:这意味着producer无需等待来自broker的确认而继续发送下一批消息。这种情况下数据传输效率最高,但是数据可靠性确是最低的。

   -1:producer需要等待ISR中的所有follower都确认接收到数据后才算一次发送完成,可靠性最高。但是这样也不能保证数据不丢失,比如当ISR中只有leader时,这样就变成了acks=1的情况。

   Kafka中的消息以一下方式存储到文件中。

技术分享图片   

HW是HighWatermark的缩写,俗称高水位,取一个partition对应的ISR中最小的LEO作为HW,consumer最多只能消费到HW所在的位置。另外每个replica都有HW,leader和follower各自负责更新自己的HW的状态。对于leader新写入的消息,consumer不能立刻消费,leader会等待该消息被所有ISR中的replicas同步后更新HW,此时消息才能被consumer消费。这样就保证了如果leader所在的broker失效,该消息仍然可以从新选举的leader中获取。对于来自内部broKer的读取请求,没有HW的限制。

LEO:LogEndOffset的缩写,表示每个partition的log最后一条Message的位置。

技术分享图片


当leader挂了之后,现在B成为了leader,A重新恢复之后需要进行消息的同步,如果使用追加的方式那么就会有冗余消息,所以A将自己的消息截取到HW的位置在进行同步。

 


网易云免费体验馆,0成本体验20+款云产品! 

更多网易研发、产品、运营经验分享请访问网易云社区 


相关文章:
【推荐】 Apache流框架Flink,SparkStreaming,Storm对比分析(一)
【推荐】 一行代码搞定Dubbo接口调用










以上是关于kafka消息的可靠性的主要内容,如果未能解决你的问题,请参考以下文章

kafka消息的可靠性

如何保证kafka生产者发送消息的可靠性

为什么消息队列Kafka的数据可靠性高达99.999999%?

kafka 消息可靠性

RabbitMQ 和 Kafka 的消息可靠性对比

Kafka的消息可靠性(防止消息丢失)