kafka原理及调优
原理
topic对应一个业务,partition是其中一个分区,message是其消息,新的message添会加到其中一个分区尾部。message包含offset,对应在partition中的位置,MessageSize是消息的字节大小,data是具体内容。一个partition的消息会按offset顺序分成segment保存,内存会保存每个segment的开始offset。消费者会消费partition的leader节点,如果此节点挂了,leader会转移到副本节点上,继续消费。一个partition在一个consumer group里面只有一个consumer能消费。一个consumer如果消费多个partition,只能对partition一个一个消费,会因为消费不同partition而导致数据无序。
kafka可以实现三种语义,至少一次在enable.auto.commit为false的情况下,通过consumer.commitSync()手动提交offset,这样会出现数据处理了,但没提交offset。至多一次在enable.auto.commit设置为true,并且auto.commit.interval.ms值较小的情况下,会出现offset提交,但数据没处理的情况。仅一次在enable.auto.commit设置为false,使用consumer.seek(topicPartition,offset)来指定offset,在处理消息的时候,要同时保存住每个消息的offset,相当于以事物形式每处理一条消息自己保存一次offset。
调优
kafka-server-start.sh中的 KAFKA_HEAP_OPTS可以修改分配内存大小,可以在jstat -gcutil发现频繁GC的时候调整。
replica.socket.timeout.ms和replica.lag.time.max.ms可以适当调大,防止因网络问题,导致副本被误判下线。
log.retention.hours是kafka数据保存时间,根据需要调整。