kafka消息的可靠性

叁叁肆2018-09-28 09:46


本文来自网易云社区

作者:田宏增


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

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

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

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


Kafkaack机制。

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

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

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

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

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



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

LEOLogEndOffset的缩写,表示每个partitionlog最后一条Message的位置。

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

 


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

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