Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
kafkaÊý¾Ý¿É¿¿ÐÔÉî¶È½â¶Á
 
À´Ô´£ºÍøÂç ·¢²¼ÓÚ£º 2017-5-9
  2356  次浏览      27
 

1 ¸ÅÊö

KakfaÆð³õÊÇÓÉLinkedIn¹«Ë¾¿ª·¢µÄÒ»¸ö·Ö²¼Ê½µÄÏûϢϵͳ£¬ºó³ÉΪApacheµÄÒ»²¿·Ö£¬ËüʹÓÃScala±àд£¬ÒÔ¿ÉˮƽÀ©Õ¹ºÍ¸ßÍÌÍÂÂʶø±»¹ã·ºÊ¹Óá£Ä¿Ç°Ô½À´Ô½¶àµÄ¿ªÔ´·Ö²¼Ê½´¦ÀíϵͳÈçCloudera¡¢Apache Storm¡¢SparkµÈ¶¼Ö§³ÖÓëKafka¼¯³É¡£

Kafkaƾ½è×Å×ÔÉíµÄÓÅÊÆ£¬Ô½À´Ô½Êܵ½»¥ÁªÍøÆóÒµµÄÇàíù£¬Î¨Æ·»áÒ²²ÉÓÃKafka×÷ΪÆäÄÚ²¿ºËÐÄÏûÏ¢ÒýÇæÖ®Ò»¡£Kafka×÷Ϊһ¸öÉÌÒµ¼¶ÏûÏ¢Öмä¼þ£¬ÏûÏ¢¿É¿¿ÐÔµÄÖØÒªÐÔ¿ÉÏë¶øÖª¡£ÈçºÎÈ·±£ÏûÏ¢µÄ¾«È·´«Ê䣿ÈçºÎÈ·±£ÏûÏ¢µÄ׼ȷ´æ´¢£¿ÈçºÎÈ·±£ÏûÏ¢µÄÕýÈ·Ïû·Ñ£¿ÕâЩ¶¼ÊÇÐèÒª¿¼ÂǵÄÎÊÌâ¡£±¾ÎÄÊ×ÏÈ´ÓKafkaµÄ¼Ü¹¹×ÅÊÖ£¬ÏÈÁ˽âÏÂKafkaµÄ»ù±¾Ô­Àí£¬È»ºóͨ¹ý¶ÔkakfaµÄ´æ´¢»úÖÆ¡¢¸´ÖÆÔ­Àí¡¢Í¬²½Ô­Àí¡¢¿É¿¿ÐԺͳ־ÃÐÔ±£Ö¤µÈµÈÒ»²½²½¶ÔÆä¿É¿¿ÐÔ½øÐзÖÎö£¬×îºóͨ¹ýbenchmarkÀ´ÔöÇ¿¶ÔKafka¸ß¿É¿¿ÐÔµÄÈÏÖª¡£

2 KafkaÌåϵ¼Ü¹¹

ÈçÉÏͼËùʾ£¬Ò»¸öµäÐ͵ÄKafkaÌåϵ¼Ü¹¹°üÀ¨Èô¸ÉProducer£¨¿ÉÒÔÊÇ·þÎñÆ÷ÈÕÖ¾£¬ÒµÎñÊý¾Ý£¬Ò³ÃæÇ°¶Ë²úÉúµÄpage viewµÈµÈ£©£¬Èô¸Ébroker£¨KafkaÖ§³ÖˮƽÀ©Õ¹£¬Ò»°ãbrokerÊýÁ¿Ô½¶à£¬¼¯ÈºÍÌÍÂÂÊÔ½¸ß£©£¬Èô¸ÉConsumer (Group)£¬ÒÔ¼°Ò»¸öZookeeper¼¯Èº¡£Kafkaͨ¹ýZookeeper¹ÜÀí¼¯ÈºÅäÖã¬Ñ¡¾Ùleader£¬ÒÔ¼°ÔÚconsumer group·¢Éú±ä»¯Ê±½øÐÐrebalance¡£ProducerʹÓÃpush(ÍÆ)ģʽ½«ÏûÏ¢·¢²¼µ½broker£¬ConsumerʹÓÃpull(À­)ģʽ´Óbroker¶©ÔIJ¢Ïû·ÑÏûÏ¢¡£

Ãû´Ê½âÊÍ£º

2.1 Topic & Partition

Ò»¸ötopic¿ÉÒÔÈÏΪһ¸öÒ»ÀàÏûÏ¢£¬Ã¿¸ötopic½«±»·Ö³É¶à¸öpartition£¬Ã¿¸öpartitionÔÚ´æ´¢²ãÃæÊÇappend logÎļþ¡£Èκη¢²¼µ½´ËpartitionµÄÏûÏ¢¶¼»á±»×·¼Óµ½logÎļþµÄβ²¿£¬Ã¿ÌõÏûÏ¢ÔÚÎļþÖеÄλÖóÆÎªoffset(Æ«ÒÆÁ¿)£¬offsetΪһ¸ölongÐ͵ÄÊý×Ö£¬ËüΨһ±ê¼ÇÒ»ÌõÏûÏ¢¡£Ã¿ÌõÏûÏ¢¶¼±»appendµ½partitionÖУ¬ÊÇ˳Ðòд´ÅÅÌ£¬Òò´ËЧÂʷdz£¸ß£¨¾­ÑéÖ¤£¬Ë³Ðòд´ÅÅÌЧÂʱÈËæ»úдÄڴ滹Ҫ¸ß£¬ÕâÊÇKafka¸ßÍÌÍÂÂʵÄÒ»¸öºÜÖØÒªµÄ±£Ö¤£©¡£

ÿһÌõÏûÏ¢±»·¢Ë͵½brokerÖУ¬»á¸ù¾Ýpartition¹æÔòÑ¡Ôñ±»´æ´¢µ½ÄÄÒ»¸öpartition¡£Èç¹ûpartition¹æÔòÉèÖõĺÏÀí£¬ËùÓÐÏûÏ¢¿ÉÒÔ¾ùÔÈ·Ö²¼µ½²»Í¬µÄpartitionÀÕâÑù¾ÍʵÏÖÁËˮƽÀ©Õ¹¡££¨Èç¹ûÒ»¸ötopic¶ÔÓ¦Ò»¸öÎļþ£¬ÄÇÕâ¸öÎļþËùÔڵĻúÆ÷I/O½«»á³ÉΪÕâ¸ötopicµÄÐÔÄÜÆ¿¾±£¬¶øpartition½â¾öÁËÕâ¸öÎÊÌ⣩¡£ÔÚ´´½¨topicʱ¿ÉÒÔÔÚ$KAFKA_HOME/config/server.propertiesÖÐÖ¸¶¨Õâ¸öpartitionµÄÊýÁ¿£¨ÈçÏÂËùʾ£©£¬µ±È»¿ÉÒÔÔÚtopic´´½¨Ö®ºóÈ¥ÐÞ¸ÄpartitionµÄÊýÁ¿¡£

# The default number 
of log partitions per topic.
More partitions allow greater
# parallelism for consumption,
but this will also result in more files across
# the brokers.
num.partitions=3

ÔÚ·¢ËÍÒ»ÌõÏûϢʱ£¬¿ÉÒÔÖ¸¶¨Õâ¸öÏûÏ¢µÄkey£¬producer¸ù¾ÝÕâ¸ökeyºÍpartition»úÖÆÀ´ÅжÏÕâ¸öÏûÏ¢·¢Ë͵½Äĸöpartition¡£partition»úÖÆ¿ÉÒÔͨ¹ýÖ¸¶¨producerµÄpartition.classÕâÒ»²ÎÊýÀ´Ö¸¶¨£¬¸Ãclass±ØÐëʵÏÖkafka.producer.Partitioner½Ó¿Ú¡£

ÓйØTopicÓëPartitionµÄ¸ü¶àϸ½Ú£¬¿ÉÒԲο¼ÏÂÃæµÄ¡°KafkaÎļþ´æ´¢»úÖÆ¡±ÕâÒ»½Ú¡£

3 ¸ß¿É¿¿ÐÔ´æ´¢·ÖÎö

KafkaµÄ¸ß¿É¿¿ÐԵı£ÕÏÀ´Ô´ÓÚÆä½¡×³µÄ¸±±¾£¨replication£©²ßÂÔ¡£Í¨¹ýµ÷½ÚÆä¸±±¾Ïà¹Ø²ÎÊý£¬¿ÉÒÔʹµÃKafkaÔÚÐÔÄܺͿɿ¿ÐÔÖ®¼äÔËתµÄÓÎÈÐÓÐÓà¡£Kafka´Ó0.8.x°æ±¾¿ªÊ¼Ìṩpartition¼¶±ðµÄ¸´ÖÆ,replicationµÄÊýÁ¿¿ÉÒÔÔÚ$KAFKA_HOME/config/server.propertiesÖÐÅäÖã¨default.replication.refactor£©¡£

ÕâÀïÏÈ´ÓKafkaÎļþ´æ´¢»úÖÆÈëÊÖ£¬´Ó×îµ×²ãÁ˽âKafkaµÄ´æ´¢Ï¸½Ú£¬½ø¶ø¶ÔÆäµÄ´æ´¢Óиö΢¹ÛµÄÈÏÖª¡£Ö®ºóͨ¹ýKafka¸´ÖÆÔ­ÀíºÍͬ²½·½Ê½À´²ûÊöºê¹Û²ãÃæµÄ¸ÅÄî¡£×îºó´ÓISR£¬HW£¬leaderÑ¡¾ÙÒÔ¼°Êý¾Ý¿É¿¿ÐԺͳ־ÃÐÔ±£Ö¤µÈµÈ¸÷¸öά¶ÈÀ´·á¸»¶ÔKafkaÏà¹ØÖªÊ¶µãµÄÈÏÖª¡£

3.1 KafkaÎļþ´æ´¢»úÖÆ

KafkaÖÐÏûÏ¢ÊÇÒÔtopic½øÐзÖÀàµÄ£¬Éú²úÕßͨ¹ýtopicÏòKafka broker·¢ËÍÏûÏ¢£¬Ïû·ÑÕßͨ¹ýtopic¶ÁÈ¡Êý¾Ý¡£È»¶øtopicÔÚÎïÀí²ãÃæÓÖÄÜÒÔpartitionΪ·Ö×飬һ¸ötopic¿ÉÒÔ·Ö³ÉÈô¸É¸öpartition£¬ÄÇôtopicÒÔ¼°partitionÓÖÊÇÔõô´æ´¢µÄÄØ£¿partition»¹¿ÉÒÔϸ·ÖΪsegment£¬Ò»¸öpartitionÎïÀíÉÏÓɶà¸ösegment×é³É£¬ÄÇôÕâЩsegmentÓÖÊÇÊ²Ã´ÄØ£¿ÏÂÃæÎÒÃÇÀ´Ò»Ò»½ÒÏþ¡£

ΪÁ˱ãÓÚ˵Ã÷ÎÊÌ⣬¼ÙÉèÕâÀïÖ»ÓÐÒ»¸öKafka¼¯Èº£¬ÇÒÕâ¸ö¼¯ÈºÖ»ÓÐÒ»¸öKafka broker£¬¼´Ö»ÓÐһ̨ÎïÀí»ú¡£ÔÚÕâ¸öKafka brokerÖÐÅäÖã¨$KAFKA_HOME/config/server.propertiesÖУ©log.dirs=/tmp/kafka-logs£¬ÒÔ´ËÀ´ÉèÖÃKafkaÏûÏ¢Îļþ´æ´¢Ä¿Â¼£¬Óë´Ëͬʱ´´½¨Ò»¸ötopic£ºtopic_zzh_test£¬partitionµÄÊýÁ¿Îª4£¨$KAFKA_HOME/bin/kafka-topics.sh ¨Ccreate ¨Czookeeper localhost:2181 ¨Cpartitions 4 ¨Ctopic topic_vms_test ¨Creplication-factor 4£©¡£ÄÇôÎÒÃÇ´Ëʱ¿ÉÒÔÔÚ/tmp/kafka-logsĿ¼ÖпÉÒÔ¿´µ½Éú³ÉÁË4¸öĿ¼£º

drwxr-xr-x 2 root root 4096 Apr 10 16:10 topic_zzh_test-0
drwxr-xr-x 2 root root 4096 Apr 10 16:10 topic_zzh_test-1
drwxr-xr-x 2 root root 4096 Apr 10 16:10 topic_zzh_test-2
drwxr-xr-x 2 root root 4096 Apr 10 16:10 topic_zzh_test-3

ÔÚKafkaÎļþ´æ´¢ÖУ¬Í¬Ò»¸ötopicÏÂÓжà¸ö²»Í¬µÄpartition£¬Ã¿¸öpartitonΪһ¸öĿ¼£¬partitionµÄÃû³Æ¹æÔòΪ£ºtopicÃû³Æ+ÓÐÐòÐòºÅ£¬µÚÒ»¸öÐòºÅ´Ó0¿ªÊ¼¼Æ£¬×î´óµÄÐòºÅΪpartitionÊýÁ¿¼õ1£¬partitionÊÇʵ¼ÊÎïÀíÉϵĸÅÄ¶øtopicÊÇÂß¼­ÉϵĸÅÄî¡£

ÉÏÃæÌáµ½partition»¹¿ÉÒÔϸ·ÖΪsegment£¬Õâ¸ösegmentÓÖÊÇʲô£¿Èç¹û¾ÍÒÔpartitionΪ×îС´æ´¢µ¥Î»£¬ÎÒÃÇ¿ÉÒÔÏëÏóµ±Kafka producer²»¶Ï·¢ËÍÏûÏ¢£¬±ØÈ»»áÒýÆðpartitionÎļþµÄÎÞÏÞÀ©ÕÅ£¬ÕâÑù¶ÔÓÚÏûÏ¢ÎļþµÄά»¤ÒÔ¼°ÒѾ­±»Ïû·ÑµÄÏûÏ¢µÄÇåÀí´øÀ´ÑÏÖØµÄÓ°Ï죬ËùÒÔÕâÀïÒÔsegmentΪµ¥Î»ÓÖ½«partitionϸ·Ö¡£Ã¿¸öpartition(Ŀ¼)Ï൱ÓÚÒ»¸ö¾ÞÐÍÎļþ±»Æ½¾ù·ÖÅäµ½¶à¸ö´óСÏàµÈµÄsegment(¶Î)Êý¾ÝÎļþÖУ¨Ã¿¸ösegment ÎļþÖÐÏûÏ¢ÊýÁ¿²»Ò»¶¨ÏàµÈ£©ÕâÖÖÌØÐÔÒ²·½±ãold segmentµÄɾ³ý£¬¼´·½±ãÒѱ»Ïû·ÑµÄÏûÏ¢µÄÇåÀí£¬Ìá¸ß´ÅÅ̵ÄÀûÓÃÂÊ¡£Ã¿¸öpartitionÖ»ÐèÒªÖ§³Ö˳Ðò¶Áд¾ÍÐУ¬segmentµÄÎļþÉúÃüÖÜÆÚÓÉ·þÎñ¶ËÅäÖòÎÊý£¨log.segment.bytes£¬log.roll.{ms,hours}µÈÈô¸É²ÎÊý£©¾ö¶¨¡£

segmentÎļþÓÉÁ½²¿·Ö×é³É£¬·Ö±ðΪ¡°.index¡±ÎļþºÍ¡°.log¡±Îļþ£¬·Ö±ð±íʾΪsegmentË÷ÒýÎļþºÍÊý¾ÝÎļþ¡£ÕâÁ½¸öÎļþµÄÃüÁî¹æÔòΪ£ºpartitionÈ«¾ÖµÄµÚÒ»¸ösegment´Ó0¿ªÊ¼£¬ºóÐøÃ¿¸ösegmentÎļþÃûΪÉÏÒ»¸ösegmentÎļþ×îºóÒ»ÌõÏûÏ¢µÄoffsetÖµ£¬ÊýÖµ´óСΪ64룬20λÊý×Ö×Ö·û³¤¶È£¬Ã»ÓÐÊý×ÖÓÃ0Ìî³ä£¬ÈçÏ£º

00000000000000000000.index 00000000000000000000.log
00000000000000170410.index
00000000000000170410.log
00000000000000239430.index
00000000000000239430.log

ÒÔÉÏÃæµÄsegmentÎļþΪÀý£¬Õ¹Ê¾³ösegment£º00000000000000170410µÄ¡°.index¡±ÎļþºÍ¡°.log¡±ÎļþµÄ¶ÔÓ¦µÄ¹ØÏµ£¬ÈçÏÂͼ£º

ÈçÉÏͼ£¬¡°.index¡±Ë÷ÒýÎļþ´æ´¢´óÁ¿µÄÔªÊý¾Ý£¬¡°.log¡±Êý¾ÝÎļþ´æ´¢´óÁ¿µÄÏûÏ¢£¬Ë÷ÒýÎļþÖеÄÔªÊý¾ÝÖ¸Ïò¶ÔÓ¦Êý¾ÝÎļþÖÐmessageµÄÎïÀíÆ«ÒÆµØÖ·¡£ÆäÖÐÒÔ¡°.index¡±Ë÷ÒýÎļþÖеÄÔªÊý¾Ý[3, 348]ΪÀý£¬ÔÚ¡°.log¡±Êý¾ÝÎļþ±íʾµÚ3¸öÏûÏ¢£¬¼´ÔÚÈ«¾ÖpartitionÖбíʾ170410+3=170413¸öÏûÏ¢£¬¸ÃÏûÏ¢µÄÎïÀíÆ«ÒÆµØÖ·Îª348¡£

ÄÇôÈçºÎ´ÓpartitionÖÐͨ¹ýoffset²éÕÒmessageÄØ£¿

ÒÔÉÏͼΪÀý£¬¶ÁÈ¡offset=170418µÄÏûÏ¢£¬Ê×ÏȲéÕÒsegmentÎļþ£¬ÆäÖÐ00000000000000000000.indexΪ×ʼµÄÎļþ£¬µÚ¶þ¸öÎļþΪ00000000000000170410.index£¨ÆðÊ¼Æ«ÒÆÎª170410+1=170411£©£¬¶øµÚÈý¸öÎļþΪ00000000000000239430.index£¨ÆðÊ¼Æ«ÒÆÎª239430+1=239431£©£¬ËùÒÔÕâ¸öoffset=170418¾ÍÂäµ½Á˵ڶþ¸öÎļþÖ®ÖС£ÆäËûºóÐøÎļþ¿ÉÒÔÒÀ´ÎÀàÍÆ£¬ÒÔÆäÊµÆ«ÒÆÁ¿ÃüÃû²¢ÅÅÁÐÕâЩÎļþ£¬È»ºó¸ù¾Ý¶þ·Ö²éÕÒ·¨¾Í¿ÉÒÔ¿ìËÙ¶¨Î»µ½¾ßÌåÎļþλÖá£Æä´Î¸ù¾Ý00000000000000170410.indexÎļþÖеÄ[8,1325]¶¨Î»µ½00000000000000170410.logÎļþÖеÄ1325µÄλÖýøÐжÁÈ¡¡£

ÒªÊǶÁÈ¡offset=170418µÄÏûÏ¢£¬´Ó00000000000000170410.logÎļþÖеÄ1325µÄλÖýøÐжÁÈ¡£¬ÄÇôÔõô֪µÀºÎʱ¶ÁÍê±¾ÌõÏûÏ¢£¬·ñÔò¾Í¶Áµ½ÏÂÒ»ÌõÏûÏ¢µÄÄÚÈÝÁË£¿

Õâ¸ö¾ÍÐèÒªÁªÏµµ½ÏûÏ¢µÄÎïÀí½á¹¹ÁË£¬ÏûÏ¢¶¼¾ßÓй̶¨µÄÎïÀí½á¹¹£¬°üÀ¨£ºoffset£¨8 Bytes£©¡¢ÏûÏ¢ÌåµÄ´óС£¨4 Bytes£©¡¢crc32£¨4 Bytes£©¡¢magic£¨1 Byte£©¡¢attributes£¨1 Byte£©¡¢key length£¨4 Bytes£©¡¢key£¨K Bytes£©¡¢payload(N Bytes)µÈµÈ×ֶΣ¬¿ÉÒÔÈ·¶¨Ò»ÌõÏûÏ¢µÄ´óС£¬¼´¶ÁÈ¡µ½ÄÄÀï½ØÖ¹¡£

3.2 ¸´ÖÆÔ­ÀíºÍͬ²½·½Ê½

KafkaÖÐtopicµÄÿ¸öpartitionÓÐÒ»¸öԤдʽµÄÈÕÖ¾Îļþ£¬ËäÈ»partition¿ÉÒÔ¼ÌÐøÏ¸·ÖΪÈô¸É¸ösegmentÎļþ£¬µ«ÊǶÔÓÚÉϲãÓ¦ÓÃÀ´Ëµ¿ÉÒÔ½«partition¿´³É×îСµÄ´æ´¢µ¥Ôª£¨Ò»¸öÓжà¸ösegmentÎļþÆ´½ÓµÄ¡°¾ÞÐÍ¡±Îļþ£©£¬Ã¿¸öpartition¶¼ÓÉһЩÁÐÓÐÐòµÄ¡¢²»¿É±äµÄÏûÏ¢×é³É£¬ÕâЩÏûÏ¢±»Á¬ÐøµÄ×·¼Óµ½partitionÖС£

ÉÏͼÖÐÓÐÁ½¸öÐÂÃû´Ê£ºHWºÍLEO¡£ÕâÀïÏȽéÉÜÏÂLEO£¬LogEndOffsetµÄËõд£¬±íʾÿ¸öpartitionµÄlog×îºóÒ»ÌõMessageµÄλÖá£HWÊÇHighWatermarkµÄËõд£¬ÊÇÖ¸consumerÄܹ»¿´µ½µÄ´ËpartitionµÄλÖã¬Õâ¸öÉæ¼°µ½¶à¸±±¾µÄ¸ÅÄÕâÀïÏÈÌἰһϣ¬Ï½ÚÔÙÏê±í¡£

ÑÔ¹éÕý´«£¬ÎªÁËÌá¸ßÏûÏ¢µÄ¿É¿¿ÐÔ£¬Kafkaÿ¸ötopicµÄpartitionÓÐN¸ö¸±±¾£¨replicas£©£¬ÆäÖÐN(´óÓÚµÈÓÚ1)ÊÇtopicµÄ¸´ÖÆÒò×Ó£¨replica fator£©µÄ¸öÊý¡£Kafkaͨ¹ý¶à¸±±¾»úÖÆÊµÏÖ¹ÊÕÏ×Ô¶¯×ªÒÆ£¬µ±Kafka¼¯ÈºÖÐÒ»¸öbrokerʧЧÇé¿öÏÂÈÔÈ»±£Ö¤·þÎñ¿ÉÓá£ÔÚKafkaÖз¢Éú¸´ÖÆÊ±È·±£partitionµÄÈÕÖ¾ÄÜÓÐÐòµØÐ´µ½ÆäËû½ÚµãÉÏ£¬N¸öreplicasÖУ¬ÆäÖÐÒ»¸öreplicaΪleader£¬ÆäËû¶¼Îªfollower, leader´¦ÀípartitionµÄËùÓжÁдÇëÇó£¬Óë´Ëͬʱ£¬follower»á±»¶¯¶¨ÆÚµØÈ¥¸´ÖÆleaderÉϵÄÊý¾Ý¡£

ÈçÏÂͼËùʾ£¬Kafka¼¯ÈºÖÐÓÐ4¸öbroker, ijtopicÓÐ3¸öpartition,ÇÒ¸´ÖÆÒò×Ó¼´¸±±¾¸öÊýҲΪ3£º

KafkaÌṩÁËÊý¾Ý¸´ÖÆËã·¨±£Ö¤£¬Èç¹ûleader·¢Éú¹ÊÕÏ»ò¹Òµô£¬Ò»¸öÐÂleader±»Ñ¡¾Ù²¢±»½ÓÊܿͻ§¶ËµÄÏûÏ¢³É¹¦Ð´Èë¡£KafkaÈ·±£´Óͬ²½¸±±¾ÁбíÖÐÑ¡¾ÙÒ»¸ö¸±±¾Îªleader£¬»òÕß˵follower×·¸ÏleaderÊý¾Ý¡£leader¸ºÔðά»¤ºÍ¸ú×ÙISR(In-Sync ReplicasµÄËõд£¬±íʾ¸±±¾Í¬²½¶ÓÁУ¬¾ßÌå¿É²Î¿¼Ï½Ú)ÖÐËùÓÐfollowerÖͺóµÄ״̬¡£µ±producer·¢ËÍÒ»ÌõÏûÏ¢µ½brokerºó£¬leaderдÈëÏûÏ¢²¢¸´ÖƵ½ËùÓÐfollower¡£ÏûÏ¢Ìá½»Ö®ºó²Å±»³É¹¦¸´ÖƵ½ËùÓеÄͬ²½¸±±¾¡£ÏûÏ¢¸´ÖÆÑÓ³ÙÊÜ×îÂýµÄfollowerÏÞÖÆ£¬ÖØÒªµÄÊÇ¿ìËÙ¼ì²âÂý¸±±¾£¬Èç¹ûfollower¡°Âäºó¡±Ì«¶à»òÕßʧЧ£¬leader½«»á°ÑËü´ÓISRÖÐɾ³ý¡£

3.3 ISR

ÉϽÚÎÒÃÇÉæ¼°µ½ISR (In-Sync Replicas)£¬Õâ¸öÊÇÖ¸¸±±¾Í¬²½¶ÓÁС£¸±±¾Êý¶ÔKafkaµÄÍÌÍÂÂÊÊÇÓÐÒ»¶¨µÄÓ°Ï죬µ«¼«´óµÄÔöÇ¿ÁË¿ÉÓÃÐÔ¡£Ä¬ÈÏÇé¿öÏÂKafkaµÄreplicaÊýÁ¿Îª1£¬¼´Ã¿¸öpartition¶¼ÓÐÒ»¸öΨһµÄleader£¬ÎªÁËÈ·±£ÏûÏ¢µÄ¿É¿¿ÐÔ£¬Í¨³£Ó¦ÓÃÖн«ÆäÖµ(ÓÉbrokerµÄ²ÎÊýoffsets.topic.replication.factorÖ¸¶¨)´óСÉèÖÃΪ´óÓÚ1£¬±ÈÈç3¡£ ËùÓеĸ±±¾£¨replicas£©Í³³ÆÎªAssigned Replicas£¬¼´AR¡£ISRÊÇARÖеÄÒ»¸ö×Ó¼¯£¬ÓÉleaderά»¤ISRÁÐ±í£¬follower´Óleaderͬ²½Êý¾ÝÓÐһЩÑÓ³Ù£¨°üÀ¨ÑÓ³Ùʱ¼äreplica.lag.time.max.msºÍÑÓ³ÙÌõÊýreplica.lag.max.messagesÁ½¸öά¶È, µ±Ç°×îеİ汾0.10.xÖÐÖ»Ö§³Öreplica.lag.time.max.msÕâ¸öά¶È£©£¬ÈÎÒâÒ»¸ö³¬¹ýãÐÖµ¶¼»á°ÑfollowerÌÞ³ý³öISR, ´æÈëOSR£¨Outof-Sync Replicas£©ÁÐ±í£¬Ð¼ÓÈëµÄfollowerÒ²»áÏÈ´æ·ÅÔÚOSRÖС£AR=ISR+OSR¡£

Kafka 0.10.x°æ±¾ºóÒÆ³ýÁËreplica.lag.max.messages²ÎÊý£¬Ö»±£ÁôÁËreplica.lag.time.max.ms×÷ΪISRÖи±±¾¹ÜÀíµÄ²ÎÊý¡£ÎªÊ²Ã´ÕâÑù×öÄØ£¿replica.lag.max.messages±íʾµ±Ç°Ä³¸ö¸±±¾ÂäºóleaederµÄÏûÏ¢ÊýÁ¿³¬¹ýÁËÕâ¸ö²ÎÊýµÄÖµ£¬ÄÇôleader¾Í»á°Ñfollower´ÓISRÖÐɾ³ý¡£¼ÙÉèÉèÖÃreplica.lag.max.messages=4£¬ÄÇôÈç¹ûproducerÒ»´Î´«ËÍÖÁbrokerµÄÏûÏ¢ÊýÁ¿¶¼Ð¡ÓÚ4Ìõʱ£¬ÒòΪÔÚleader½ÓÊܵ½producer·¢Ë͵ÄÏûÏ¢Ö®ºó¶øfollower¸±±¾¿ªÊ¼À­È¡ÕâЩÏûϢ֮ǰ£¬followerÂäºóleaderµÄÏûÏ¢Êý²»»á³¬¹ý4ÌõÏûÏ¢£¬¹Ê´ËûÓÐfollowerÒÆ³öISR£¬ËùÒÔÕâʱºòreplica.lag.max.messageµÄÉèÖÃËÆºõÊǺÏÀíµÄ¡£µ«ÊÇproducer·¢Æð˲ʱ¸ß·åÁ÷Á¿£¬producerÒ»´Î·¢Ë͵ÄÏûÏ¢³¬¹ý4Ìõʱ£¬Ò²¾ÍÊdz¬¹ýreplica.lag.max.messages£¬´Ëʱfollower¶¼»á±»ÈÏΪÊÇÓëleader¸±±¾²»Í¬²½ÁË£¬´Ó¶ø±»Ìß³öÁËISR¡£µ«Êµ¼ÊÉÏÕâЩfollower¶¼ÊÇ´æ»î״̬µÄÇÒûÓÐÐÔÄÜÎÊÌâ¡£ÄÇôÔÚÖ®ºó×·ÉÏleader,²¢±»ÖØÐ¼ÓÈëÁËISR¡£ÓÚÊǾͻá³öÏÖËüÃDz»¶ÏµØÌÞ³öISRÈ»ºóÖØÐ»عéISR£¬ÕâÎÞÒÉÔö¼ÓÁËÎÞνµÄÐÔÄÜËðºÄ¡£¶øÇÒÕâ¸ö²ÎÊýÊÇbrokerÈ«¾ÖµÄ¡£ÉèÖÃÌ«´óÁË£¬Ó°ÏìÕæÕý¡°Âäºó¡±followerµÄÒÆ³ý£»ÉèÖõÄ̫СÁË£¬µ¼ÖÂfollowerµÄƵ·±½ø³ö¡£ÎÞ·¨¸ø¶¨Ò»¸öºÏÊʵÄreplica.lag.max.messagesµÄÖµ£¬¹Ê´Ë£¬Ð°汾µÄKafkaÒÆ³ýÁËÕâ¸ö²ÎÊý¡£

×¢£ºISRÖаüÀ¨£ºleaderºÍfollower¡£

ÉÏÃæÒ»½Ú»¹Éæ¼°µ½Ò»¸ö¸ÅÄ¼´HW¡£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µÄÏÞÖÆ¡£

ÏÂͼÏêϸµÄ˵Ã÷Á˵±producerÉú²úÏûÏ¢ÖÁbrokerºó£¬ISRÒÔ¼°HWºÍLEOµÄÁ÷ת¹ý³Ì£º

Óɴ˿ɼû£¬KafkaµÄ¸´ÖÆ»úÖÆ¼È²»ÊÇÍêÈ«µÄͬ²½¸´ÖÆ£¬Ò²²»Êǵ¥´¿µÄÒì²½¸´ÖÆ¡£ÊÂʵÉÏ£¬Í¬²½¸´ÖÆÒªÇóËùÓÐÄܹ¤×÷µÄfollower¶¼¸´ÖÆÍ꣬ÕâÌõÏûÏ¢²Å»á±»commit£¬ÕâÖÖ¸´ÖÆ·½Ê½¼«´óµÄÓ°ÏìÁËÍÌÍÂÂÊ¡£¶øÒì²½¸´ÖÆ·½Ê½Ï£¬followerÒì²½µÄ´Óleader¸´ÖÆÊý¾Ý£¬Êý¾ÝÖ»Òª±»leaderдÈëlog¾Í±»ÈÏΪÒѾ­commit£¬ÕâÖÖÇé¿öÏÂÈç¹ûfollower¶¼»¹Ã»Óи´ÖÆÍ꣬ÂäºóÓÚleaderʱ£¬Í»È»leaderå´»ú£¬Ôò»á¶ªÊ§Êý¾Ý¡£¶øKafkaµÄÕâÖÖʹÓÃISRµÄ·½Ê½ÔòºÜºÃµÄ¾ùºâÁËÈ·±£Êý¾Ý²»¶ªÊ§ÒÔ¼°ÍÌÍÂÂÊ¡£

KafkaµÄISRµÄ¹ÜÀí×îÖÕ¶¼»á·´À¡µ½Zookeeper½ÚµãÉÏ¡£¾ßÌåλÖÃΪ£º/brokers/topics/[topic]/partitions/[partition]/state¡£Ä¿Ç°ÓÐÁ½¸öµØ·½»á¶ÔÕâ¸öZookeeperµÄ½Úµã½øÐÐά»¤£º

ControllerÀ´Î¬»¤£ºKafka¼¯ÈºÖÐµÄÆäÖÐÒ»¸öBroker»á±»Ñ¡¾ÙΪController£¬Ö÷Òª¸ºÔðPartition¹ÜÀíºÍ¸±±¾×´Ì¬¹ÜÀí£¬Ò²»áÖ´ÐÐÀàËÆÓÚÖØ·ÖÅäpartitionÖ®ÀàµÄ¹ÜÀíÈÎÎñ¡£ÔÚ·ûºÏÄ³Ð©ÌØ¶¨Ìõ¼þÏ£¬ControllerϵÄLeaderSelector»áÑ¡¾ÙеÄleader£¬ISRºÍеÄleader_epoch¼°controller_epochдÈëZookeeperµÄÏà¹Ø½ÚµãÖС£Í¬Ê±·¢ÆðLeaderAndIsrRequest֪ͨËùÓеÄreplicas¡£

leaderÀ´Î¬»¤£ºleaderÓе¥¶ÀµÄÏ̶߳¨ÆÚ¼ì²âISRÖÐfollowerÊÇ·ñÍÑÀëISR, Èç¹û·¢ÏÖISR±ä»¯£¬Ôò»á½«ÐµÄISRµÄÐÅÏ¢·µ»Øµ½ZookeeperµÄÏà¹Ø½ÚµãÖС£

3.4 Êý¾Ý¿É¿¿ÐԺͳ־ÃÐÔ±£Ö¤

µ±producerÏòleader·¢ËÍÊý¾Ýʱ£¬¿ÉÒÔͨ¹ýrequest.required.acks²ÎÊýÀ´ÉèÖÃÊý¾Ý¿É¿¿ÐԵļ¶±ð£º

1£¨Ä¬ÈÏ£©£ºÕâÒâζ×ÅproducerÔÚISRÖеÄleaderÒѳɹ¦ÊÕµ½µÄÊý¾Ý²¢µÃµ½È·ÈϺó·¢ËÍÏÂÒ»Ìõmessage¡£Èç¹ûleaderå´»úÁË£¬Ôò»á¶ªÊ§Êý¾Ý¡£

0£ºÕâÒâζ×ÅproducerÎÞÐèµÈ´ýÀ´×ÔbrokerµÄÈ·È϶ø¼ÌÐø·¢ËÍÏÂÒ»ÅúÏûÏ¢¡£ÕâÖÖÇé¿öÏÂÊý¾Ý´«ÊäЧÂÊ×î¸ß£¬µ«ÊÇÊý¾Ý¿É¿¿ÐÔÈ·ÊÇ×îµÍµÄ¡£

-1£ºproducerÐèÒªµÈ´ýISRÖеÄËùÓÐfollower¶¼È·ÈϽÓÊÕµ½Êý¾Ýºó²ÅËãÒ»´Î·¢ËÍÍê³É£¬¿É¿¿ÐÔ×î¸ß¡£µ«ÊÇÕâÑùÒ²²»Äܱ£Ö¤Êý¾Ý²»¶ªÊ§£¬±ÈÈçµ±ISRÖÐÖ»ÓÐleaderʱ£¨Ç°ÃæISRÄÇÒ»½Ú½²µ½£¬ISRÖеijÉÔ±ÓÉÓÚijЩÇé¿ö»áÔö¼ÓÒ²»á¼õÉÙ£¬×îÉÙ¾Íֻʣһ¸öleader£©£¬ÕâÑù¾Í±ä³ÉÁËacks=1µÄÇé¿ö¡£

Èç¹ûÒªÌá¸ßÊý¾ÝµÄ¿É¿¿ÐÔ£¬ÔÚÉèÖÃrequest.required.acks=-1µÄͬʱ£¬Ò²Òªmin.insync.replicasÕâ¸ö²ÎÊý(¿ÉÒÔÔÚbroker»òÕßtopic²ãÃæ½øÐÐÉèÖÃ)µÄÅäºÏ£¬ÕâÑù²ÅÄÜ·¢»Ó×î´óµÄ¹¦Ð§¡£min.insync.replicasÕâ¸ö²ÎÊýÉ趨ISRÖеÄ×îС¸±±¾ÊýÊǶàÉÙ£¬Ä¬ÈÏֵΪ1£¬µ±ÇÒ½öµ±request.required.acks²ÎÊýÉèÖÃΪ-1ʱ£¬´Ë²ÎÊý²ÅÉúЧ¡£Èç¹ûISRÖеĸ±±¾ÊýÉÙÓÚmin.insync.replicasÅäÖõÄÊýÁ¿Ê±£¬¿Í»§¶Ë»á·µ»ØÒì³££ºorg.apache. kafka.common.errors.NotEnoughReplicasExceptoin: Messages are rejected since there are fewer in-sync replicas than required¡£

½ÓÏÂÀ´¶Ôacks=1ºÍ-1µÄÁ½ÖÖÇé¿ö½øÐÐÏêϸ·ÖÎö£º

1. request.required.acks=1

producer·¢ËÍÊý¾Ýµ½leader£¬leaderд±¾µØÈÕÖ¾³É¹¦£¬·µ»Ø¿Í»§¶Ë³É¹¦£»´ËʱISRÖеĸ±±¾»¹Ã»ÓÐÀ´µÃ¼°À­È¡¸ÃÏûÏ¢£¬leader¾Íå´»úÁË£¬ÄÇô´Ë´Î·¢Ë͵ÄÏûÏ¢¾Í»á¶ªÊ§¡£

2. request.required.acks=-1

ͬ²½£¨KafkaĬÈÏΪͬ²½£¬¼´producer.type=sync£©µÄ·¢ËÍģʽ£¬replication.factor>=2 ÇÒmin.insync.replicas>=2µÄÇé¿öÏ£¬²»»á¶ªÊ§Êý¾Ý¡£

ÓÐÁ½ÖÖµäÐÍÇé¿ö¡£acks=-1µÄÇé¿öÏ£¨ÈçÎÞÌØÊâ˵Ã÷£¬ÒÔÏÂacks¶¼±íʾΪ²ÎÊýrequest.required.acks£©£¬Êý¾Ý·¢Ë͵½leader, ISRµÄfollowerÈ«²¿Íê³ÉÊý¾Ýͬ²½ºó£¬leader´Ëʱ¹Òµô£¬ÄÇô»áÑ¡¾Ù³öеÄleader£¬Êý¾Ý²»»á¶ªÊ§¡£

acks=-1µÄÇé¿öÏ£¬Êý¾Ý·¢Ë͵½leaderºó £¬²¿·ÖISRµÄ¸±±¾Í¬²½£¬leader´Ëʱ¹Òµô¡£±ÈÈçfollower1hºÍfollower2¶¼ÓпÉÄܱä³ÉеÄleader, producer¶Ë»áµÃµ½·µ»ØÒì³££¬producer¶Ë»áÖØÐ·¢ËÍÊý¾Ý£¬Êý¾Ý¿ÉÄÜ»áÖØ¸´¡£

µ±È»ÉÏͼÖÐÈç¹ûÔÚleader crashµÄʱºò£¬follower2»¹Ã»ÓÐͬ²½µ½ÈκÎÊý¾Ý£¬¶øÇÒfollower2±»Ñ¡¾ÙΪеÄleaderµÄ»°£¬ÕâÑùÏûÏ¢¾Í²»»áÖØ¸´¡£

×¢£ºKafkaÖ»´¦Àífail/recoverÎÊÌâ,²»´¦ÀíByzantineÎÊÌâ¡£

3.5 ¹ØÓÚHWµÄ½øÒ»²½Ì½ÌÖ

¿¼ÂÇÉÏͼ£¨¼´acks=-1,²¿·ÖISR¸±±¾Í¬²½£©ÖеÄÁíÒ»ÖÖÇé¿ö£¬Èç¹ûÔÚLeader¹ÒµôµÄʱºò£¬follower1ͬ²½ÁËÏûÏ¢4,5£¬follower2ͬ²½ÁËÏûÏ¢4£¬Óë´Ëͬʱfollower2±»Ñ¡¾ÙΪleader£¬ÄÇô´Ëʱfollower1ÖеĶà³öµÄÏûÏ¢5¸Ã×öÈçºÎ´¦ÀíÄØ£¿

ÕâÀï¾ÍÐèÒªHWµÄЭͬÅäºÏÁË¡£ÈçǰËùÊö£¬Ò»¸öpartitionÖеÄISRÁбíÖУ¬leaderµÄHWÊÇËùÓÐISRÁбíÀ︱±¾ÖÐ×îСµÄÄǸöµÄLEO¡£ÀàËÆÓÚľͰԭÀí£¬Ë®Î»È¡¾öÓÚ×îµÍÄÇ¿é¶Ì°å¡£

ÈçÉÏͼ£¬Ä³¸ötopicµÄijpartitionÓÐÈý¸ö¸±±¾£¬·Ö±ðΪA¡¢B¡¢C¡£A×÷Ϊleader¿Ï¶¨ÊÇLEO×î¸ß£¬B½ôËæÆäºó£¬C»úÆ÷ÓÉÓÚÅäÖñȽϵͣ¬ÍøÂç±È½Ï²î£¬¹Ê¶øÍ¬²½×îÂý¡£Õâ¸öʱºòA»úÆ÷å´»ú£¬ÕâʱºòÈç¹ûB³ÉΪleader£¬¼ÙÈçûÓÐHW£¬ÔÚAÖØÐ»ָ´Ö®ºó»á×öͬ²½(makeFollower)²Ù×÷£¬ÔÚå´»úʱlogÎļþÖ®ºóÖ±½Ó×ö×·¼Ó²Ù×÷£¬¶ø¼ÙÈçBµÄLEOÒѾ­´ïµ½ÁËAµÄLEO£¬»á²úÉúÊý¾Ý²»Ò»ÖµÄÇé¿ö£¬ËùÒÔʹÓÃHWÀ´±ÜÃâÕâÖÖÇé¿ö¡£

AÔÚ×öͬ²½²Ù×÷µÄʱºò£¬ÏȽ«logÎļþ½Ø¶Ïµ½Ö®Ç°×Ô¼ºµÄHWµÄλÖ㬼´3£¬Ö®ºóÔÙ´ÓBÖÐÀ­È¡ÏûÏ¢½øÐÐͬ²½¡£

Èç¹ûʧ°ÜµÄfollower»Ö¸´¹ýÀ´£¬ËüÊ×ÏȽ«×Ô¼ºµÄlogÎļþ½Ø¶Ïµ½ÉÏ´Îcheckpointedʱ¿ÌµÄHWµÄλÖã¬Ö®ºóÔÙ´ÓleaderÖÐͬ²½ÏûÏ¢¡£leader¹Òµô»áÖØÐÂÑ¡¾Ù£¬ÐµÄleader»á·¢ËÍ¡°Ö¸ÁÈÃÆäÓàµÄfollower½Ø¶ÏÖÁ×ÔÉíµÄHWµÄλÖÃÈ»ºóÔÙÀ­È¡ÐµÄÏûÏ¢¡£

µ±ISRÖеĸö¸±±¾µÄLEO²»Ò»ÖÂʱ£¬Èç¹û´Ëʱleader¹Òµô£¬Ñ¡¾ÙеÄleaderʱ²¢²»Êǰ´ÕÕLEOµÄ¸ßµÍ½øÐÐÑ¡¾Ù£¬¶øÊǰ´ÕÕISRÖеÄ˳ÐòÑ¡¾Ù¡£

3.6 LeaderÑ¡¾Ù

Ò»ÌõÏûÏ¢Ö»Óб»ISRÖеÄËùÓÐfollower¶¼´Óleader¸´ÖƹýÈ¥²Å»á±»ÈÏΪÒÑÌá½»¡£ÕâÑù¾Í±ÜÃâÁ˲¿·ÖÊý¾Ý±»Ð´½øÁËleader£¬»¹Ã»À´µÃ¼°±»ÈκÎfollower¸´ÖƾÍå´»úÁË£¬¶øÔì³ÉÊý¾Ý¶ªÊ§¡£¶ø¶ÔÓÚproducer¶øÑÔ£¬Ëü¿ÉÒÔÑ¡ÔñÊÇ·ñµÈ´ýÏûÏ¢commit£¬Õâ¿ÉÒÔͨ¹ýrequest.required.acksÀ´ÉèÖá£ÕâÖÖ»úÖÆÈ·±£ÁËÖ»ÒªISRÖÐÓÐÒ»¸ö»òÕßÒÔÉϵÄfollower£¬Ò»Ìõ±»commitµÄÏûÏ¢¾Í²»»á¶ªÊ§¡£

ÓÐÒ»¸öºÜÖØÒªµÄÎÊÌâÊǵ±leaderå´»úÁË£¬ÔõÑùÔÚfollowerÖÐÑ¡¾Ù³öеÄleader£¬ÒòΪfollower¿ÉÄÜÂäºóºÜ¶à»òÕßÖ±½ÓcrashÁË£¬ËùÒÔ±ØÐëÈ·±£Ñ¡Ôñ¡°×îС±µÄfollower×÷ΪеÄleader¡£Ò»¸ö»ù±¾µÄÔ­Ôò¾ÍÊÇ£¬Èç¹ûleader²»ÔÚÁË£¬ÐµÄleader±ØÐëÓµÓÐÔ­À´µÄleader commitµÄËùÓÐÏûÏ¢¡£Õâ¾ÍÐèÒª×öÒ»¸öÕÛÖУ¬Èç¹ûleaderÔÚ±íÃûÒ»¸öÏûÏ¢±»commitǰµÈ´ý¸ü¶àµÄfollowerÈ·ÈÏ£¬ÄÇôÔÚËü¹ÒµôÖ®ºó¾ÍÓиü¶àµÄfollower¿ÉÒÔ³ÉΪеÄleader£¬µ«ÕâÒ²»áÔì³ÉÍÌÍÂÂʵÄϽµ¡£

Ò»Öַdz£³£ÓõÄÑ¡¾ÙleaderµÄ·½Ê½ÊÇ¡°ÉÙÊý·þ´Ó¶àÊý¡±£¬Kafka²¢²»ÊDzÉÓÃÕâÖÖ·½Ê½¡£ÕâÖÖģʽÏ£¬Èç¹ûÎÒÃÇÓÐ2f+1¸ö¸±±¾£¬ÄÇôÔÚcommit֮ǰ±ØÐë±£Ö¤ÓÐf+1¸öreplica¸´ÖÆÍêÏûÏ¢£¬Í¬Ê±ÎªÁ˱£Ö¤ÄÜÕýÈ·Ñ¡¾Ù³öеÄleader£¬Ê§°ÜµÄ¸±±¾Êý²»Äܳ¬¹ýf¸ö¡£ÕâÖÖ·½Ê½ÓиöºÜ´óµÄÓÅÊÆ£¬ÏµÍ³µÄÑÓ³ÙÈ¡¾öÓÚ×î¿ìµÄ¼¸Ì¨»úÆ÷£¬Ò²¾ÍÊÇ˵±ÈÈ縱±¾ÊýΪ3£¬ÄÇôÑÓ³Ù¾ÍÈ¡¾öÓÚ×î¿ìµÄÄǸöfollower¶ø²»ÊÇ×îÂýµÄÄǸö¡£¡°ÉÙÊý·þ´Ó¶àÊý¡±µÄ·½Ê½Ò²ÓÐһЩÁÓÊÆ£¬ÎªÁ˱£Ö¤leaderÑ¡¾ÙµÄÕý³£½øÐУ¬ËüËùÄÜÈÝÈ̵Äʧ°ÜµÄfollowerÊý±È½ÏÉÙ£¬Èç¹ûÒªÈÝÈÌ1¸öfollower¹Òµô£¬ÄÇôÖÁÉÙÒª3¸öÒÔÉϵĸ±±¾£¬Èç¹ûÒªÈÝÈÌ2¸öfollower¹Òµô£¬±ØÐëÒªÓÐ5¸öÒÔÉϵĸ±±¾¡£Ò²¾ÍÊÇ˵£¬ÔÚÉú²ú»·¾³ÏÂΪÁ˱£Ö¤½Ï¸ßµÄÈÝ´íÂÊ£¬±ØÐëÒªÓдóÁ¿µÄ¸±±¾£¬¶ø´óÁ¿µÄ¸±±¾ÓÖ»áÔÚ´óÊý¾ÝÁ¿Ïµ¼ÖÂÐÔÄܵļ±¾çϽµ¡£ÕâÖÖËã·¨¸ü¶àÓÃÔÚZookeeperÕâÖÖ¹²Ïí¼¯ÈºÅäÖõÄϵͳÖжøºÜÉÙÔÚÐèÒª´óÁ¿Êý¾ÝµÄϵͳÖÐʹÓõÄÔ­Òò¡£HDFSµÄHA¹¦ÄÜÒ²ÊÇ»ùÓÚ¡°ÉÙÊý·þ´Ó¶àÊý¡±µÄ·½Ê½£¬µ«ÊÇÆäÊý¾Ý´æ´¢²¢²»ÊDzÉÓÃÕâÑùµÄ·½Ê½¡£

ʵ¼ÊÉÏ£¬leaderÑ¡¾ÙµÄËã·¨·Ç³£¶à£¬±ÈÈçZookeeperµÄZab¡¢RaftÒÔ¼°Viewstamped Replication¡£¶øKafkaËùʹÓõÄleaderÑ¡¾ÙËã·¨¸üÏñÊÇ΢ÈíµÄPacificAËã·¨¡£

KafkaÔÚZookeeperÖÐΪÿһ¸öpartition¶¯Ì¬µÄά»¤ÁËÒ»¸öISR£¬Õâ¸öISRÀïµÄËùÓÐreplica¶¼¸úÉÏÁËleader£¬Ö»ÓÐISRÀïµÄ³ÉÔ±²ÅÄÜÓб»Ñ¡ÎªleaderµÄ¿ÉÄÜ£¨unclean.leader.election.enable=false£©¡£ÔÚÕâÖÖģʽÏ£¬¶ÔÓÚf+1¸ö¸±±¾£¬Ò»¸öKafka topicÄÜÔÚ±£Ö¤²»¶ªÊ§ÒѾ­commitÏûÏ¢µÄǰÌáÏÂÈÝÈÌf¸ö¸±±¾µÄʧ°Ü£¬ÔÚ´ó¶àÊýʹÓó¡¾°Ï£¬ÕâÖÖģʽÊÇÊ®·ÖÓÐÀûµÄ¡£ÊÂʵÉÏ£¬ÎªÁËÈÝÈÌf¸ö¸±±¾µÄʧ°Ü£¬¡°ÉÙÊý·þ´Ó¶àÊý¡±µÄ·½Ê½ºÍISRÔÚcommitǰÐèÒªµÈ´ýµÄ¸±±¾µÄÊýÁ¿ÊÇÒ»ÑùµÄ£¬µ«ÊÇISRÐèÒªµÄ×ܵĸ±±¾µÄ¸öÊý¼¸ºõÊÇ¡°ÉÙÊý·þ´Ó¶àÊý¡±µÄ·½Ê½µÄÒ»°ë¡£

ÉÏÎÄÌáµ½£¬ÔÚISRÖÐÖÁÉÙÓÐÒ»¸öfollowerʱ£¬Kafka¿ÉÒÔÈ·±£ÒѾ­commitµÄÊý¾Ý²»¶ªÊ§£¬µ«Èç¹ûijһ¸öpartitionµÄËùÓÐreplica¶¼¹ÒÁË£¬¾ÍÎÞ·¨±£Ö¤Êý¾Ý²»¶ªÊ§ÁË¡£ÕâÖÖÇé¿öÏÂÓÐÁ½ÖÖ¿ÉÐеķ½°¸£º

µÈ´ýISRÖÐÈÎÒâÒ»¸öreplica¡°»î¡±¹ýÀ´£¬²¢ÇÒÑ¡Ëü×÷Ϊleader

Ñ¡ÔñµÚÒ»¸ö¡°»î¡±¹ýÀ´µÄreplica£¨²¢²»Ò»¶¨ÊÇÔÚISRÖУ©×÷Ϊleader

Õâ¾ÍÐèÒªÔÚ¿ÉÓÃÐÔºÍÒ»ÖÂÐÔµ±ÖÐ×÷³öÒ»¸ö¼òµ¥µÄ¾ñÔñ¡£Èç¹ûÒ»¶¨ÒªµÈ´ýISRÖеÄreplica¡°»î¡±¹ýÀ´£¬ÄDz»¿ÉÓõÄʱ¼ä¾Í¿ÉÄÜ»áÏà¶Ô½Ï³¤¡£¶øÇÒÈç¹ûISRÖÐËùÓеÄreplica¶¼ÎÞ·¨¡°»î¡±¹ýÀ´ÁË£¬»òÕßÊý¾Ý¶ªÊ§ÁË£¬Õâ¸öpartition½«ÓÀÔ¶²»¿ÉÓá£Ñ¡ÔñµÚÒ»¸ö¡°»î¡±¹ýÀ´µÄreplica×÷Ϊleader,¶øÕâ¸öreplica²»ÊÇISRÖеÄreplica,ÄǼ´Ê¹Ëü²¢²»±£ÕÏÒѾ­°üº¬ÁËËùÓÐÒÑcommitµÄÏûÏ¢£¬ËüÒ²»á³ÉΪleader¶ø×÷ΪconsumerµÄÊý¾ÝÔ´¡£Ä¬ÈÏÇé¿öÏ£¬Kafka²ÉÓõڶþÖÖ²ßÂÔ£¬¼´unclean.leader.election.enable=true£¬Ò²¿ÉÒÔ½«´Ë²ÎÊýÉèÖÃΪfalseÀ´ÆôÓõÚÒ»ÖÖ²ßÂÔ¡£

unclean.leader.election.enableÕâ¸ö²ÎÊý¶ÔÓÚleaderµÄÑ¡¾Ù¡¢ÏµÍ³µÄ¿ÉÓÃÐÔÒÔ¼°Êý¾ÝµÄ¿É¿¿ÐÔ¶¼ÓÐÖÁ¹ØÖØÒªµÄÓ°Ïì¡£ÏÂÃæÎÒÃÇÀ´·ÖÎöϼ¸ÖÖµäÐ͵ij¡¾°¡£

Èç¹ûÉÏͼËùʾ£¬¼ÙÉèij¸öpartitionÖеĸ±±¾ÊýΪ3£¬replica-0, replica-1, replica-2·Ö±ð´æ·ÅÔÚbroker0, broker1ºÍbroker2ÖС£AR=(0,1,2)£¬ISR=(0,1)¡£

ÉèÖÃrequest.required.acks=-1, min.insync.replicas=2£¬ unclean.leader.election.enable=false¡£ÕâÀï½²broker0Öеĸ±±¾Ò²³ÆÖ®Îªbroker0Æð³õbroker0Ϊleader£¬broker1Ϊfollower¡£

µ±ISRÖеÄreplica-0³öÏÖcrashµÄÇé¿öʱ£¬broker1Ñ¡¾ÙΪеÄleader[ISR=(1)]£¬ÒòΪÊÜmin.insync.replicas=2Ó°Ï죬write²»ÄÜ·þÎñ£¬µ«ÊÇreadÄܼÌÐøÕý³£·þÎñ¡£´ËÖÖÇé¿ö»Ö¸´·½°¸£º

³¢ÊÔ»Ö¸´(ÖØÆô)replica-0£¬Èç¹ûÄÜÆðÀ´£¬ÏµÍ³Õý³££»

Èç¹ûreplica-0²»Äָܻ´£¬ÐèÒª½«min.insync.replicasÉèÖÃΪ1£¬»Ö¸´write¹¦ÄÜ¡£

µ±ISRÖеÄreplica-0³öÏÖcrash£¬½ô½Ó×Åreplica-1Ò²³öÏÖÁËcrash, ´Ëʱ[ISR=(1),leader=-1],²»ÄܶÔÍâÌṩ·þÎñ£¬´ËÖÖÇé¿ö»Ö¸´·½°¸£º

³¢ÊÔ»Ö¸´replica-0ºÍreplica-1£¬Èç¹û¶¼ÄÜÆðÀ´£¬Ôòϵͳ»Ö¸´Õý³££»

Èç¹ûreplica-0ÆðÀ´£¬¶øreplica-1²»ÄÜÆðÀ´£¬ÕâʱºòÈÔÈ»²»ÄÜÑ¡³öleader£¬ÒòΪµ±ÉèÖÃunclean.leader.election.enable=falseʱ£¬leaderÖ»ÄÜ´ÓISRÖÐÑ¡¾Ù£¬µ±ISRÖÐËùÓи±±¾¶¼Ê§Ð§Ö®ºó£¬ÐèÒªISRÖÐ×îºóʧЧµÄÄǸö¸±±¾Äָܻ´Ö®ºó²ÅÄÜÑ¡¾Ùleader, ¼´replica-0ÏÈʧЧ£¬replica-1ºóʧЧ£¬ÐèÒªreplica-1»Ö¸´ºó²ÅÄÜÑ¡¾Ùleader¡£±£Êصķ½°¸½¨Òé°Ñunclean.leader.election.enableÉèÖÃΪtrue,µ«ÊÇÕâÑù»áÓжªÊ§Êý¾ÝµÄÇé¿ö·¢Éú£¬ÕâÑù¿ÉÒÔ»Ö¸´read·þÎñ¡£Í¬ÑùÐèÒª½«min.insync.replicasÉèÖÃΪ1£¬»Ö¸´write¹¦ÄÜ£»

replica-1»Ö¸´£¬replica-0²»Äָܻ´£¬Õâ¸öÇé¿öÉÏÃæÓöµ½¹ý£¬read·þÎñ¿ÉÓã¬ÐèÒª½«min.insync.replicasÉèÖÃΪ1£¬»Ö¸´write¹¦ÄÜ£»

replica-0ºÍreplica-1¶¼²»Äָܻ´£¬ÕâÖÖÇé¿ö¿ÉÒԲο¼ÇéÐÎ2.

µ±ISRÖеÄreplica-0, replica-1ͬʱ崻ú,´Ëʱ[ISR=(0,1)],²»ÄܶÔÍâÌṩ·þÎñ£¬´ËÖÖÇé¿ö»Ö¸´·½°¸£º³¢ÊÔ»Ö¸´replica-0ºÍreplica-1£¬µ±ÆäÖÐÈÎÒâÒ»¸ö¸±±¾»Ö¸´Õý³£Ê±£¬¶ÔÍâ¿ÉÒÔÌṩread·þÎñ¡£Ö±µ½2¸ö¸±±¾»Ö¸´Õý³££¬write¹¦ÄܲÅÄָܻ´£¬»òÕß½«½«min.insync.replicasÉèÖÃΪ1¡£

3.7 KafkaµÄ·¢ËÍģʽ

KafkaµÄ·¢ËÍģʽÓÉproducer¶ËµÄÅäÖòÎÊýproducer.typeÀ´ÉèÖã¬Õâ¸ö²ÎÊýÖ¸¶¨ÁËÔÚºǫ́Ïß³ÌÖÐÏûÏ¢µÄ·¢ËÍ·½Ê½ÊÇͬ²½µÄ»¹ÊÇÒì²½µÄ£¬Ä¬ÈÏÊÇͬ²½µÄ·½Ê½£¬¼´producer.type=sync¡£Èç¹ûÉèÖóÉÒì²½µÄģʽ£¬¼´producer.type=async£¬¿ÉÒÔÊÇproducerÒÔbatchµÄÐÎʽpushÊý¾Ý£¬ÕâÑù»á¼«´óµÄÌá¸ßbrokerµÄÐÔÄÜ£¬µ«ÊÇÕâÑù»áÔö¼Ó¶ªÊ§Êý¾ÝµÄ·çÏÕ¡£Èç¹ûÐèҪȷ±£ÏûÏ¢µÄ¿É¿¿ÐÔ£¬±ØÐëÒª½«producer.typeÉèÖÃΪsync¡£

¶ÔÓÚÒ첽ģʽ£¬»¹ÓÐ4¸öÅäÌ׵IJÎÊý£¬ÈçÏ£º

ÒÔbatchµÄ·½Ê½ÍÆËÍÊý¾Ý¿ÉÒÔ¼«´óµÄÌá¸ß´¦ÀíЧÂÊ£¬kafka producer¿ÉÒÔ½«ÏûÏ¢ÔÚÄÚ´æÖÐÀۼƵ½Ò»¶¨ÊýÁ¿ºó×÷Ϊһ¸öbatch·¢ËÍÇëÇó¡£batchµÄÊýÁ¿´óС¿ÉÒÔͨ¹ýproducerµÄ²ÎÊý£¨batch.num.messages£©¿ØÖÆ¡£Í¨¹ýÔö¼ÓbatchµÄ´óС£¬¿ÉÒÔ¼õÉÙÍøÂçÇëÇóºÍ´ÅÅÌIOµÄ´ÎÊý£¬µ±È»¾ßÌå²ÎÊýÉèÖÃÐèÒªÔÚЧÂʺÍʱЧÐÔ·½Ãæ×öÒ»¸öȨºâ¡£ÔڱȽÏеİ汾Öл¹ÓÐbatch.sizeÕâ¸ö²ÎÊý¡£

4 ¸ß¿É¿¿ÐÔʹÓ÷ÖÎö

4.1 ÏûÏ¢´«Êä±£ÕÏ

Ç°ÃæÒѾ­½éÉÜÁËKafkaÈçºÎ½øÐÐÓÐЧµÄ´æ´¢£¬ÒÔ¼°Á˽âÁËproducerºÍconsumerÈçºÎ¹¤×÷¡£½ÓÏÂÀ´ÌÖÂÛµÄÊÇKafkaÈçºÎÈ·±£ÏûÏ¢ÔÚproducerºÍconsumerÖ®¼ä´«Êä¡£ÓÐÒÔÏÂÈýÖÖ¿ÉÄܵĴ«Êä±£ÕÏ£¨delivery guarantee£©:

At most once: ÏûÏ¢¿ÉÄܻᶪ£¬µ«¾ø²»»áÖØ¸´´«Êä

At least once£ºÏûÏ¢¾ø²»»á¶ª£¬µ«¿ÉÄÜ»áÖØ¸´´«Êä

Exactly once£ºÃ¿ÌõÏûÏ¢¿Ï¶¨»á±»´«ÊäÒ»´ÎÇÒ½ö´«ÊäÒ»´Î

KafkaµÄÏûÏ¢´«Êä±£ÕÏ»úÖÆ·Ç³£Ö±¹Û¡£µ±producerÏòbroker·¢ËÍÏûϢʱ£¬Ò»µ©ÕâÌõÏûÏ¢±»commit£¬ÓÉÓÚ¸±±¾»úÖÆ£¨replication£©µÄ´æÔÚ£¬Ëü¾Í²»»á¶ªÊ§¡£µ«ÊÇÈç¹ûproducer·¢ËÍÊý¾Ý¸øbrokerºó£¬Óöµ½µÄÍøÂçÎÊÌâ¶øÔì³ÉͨÐÅÖжϣ¬ÄÇproducer¾ÍÎÞ·¨ÅжϸÃÌõÏûÏ¢ÊÇ·ñÒѾ­Ìá½»£¨commit£©¡£ËäÈ»KafkaÎÞ·¨È·¶¨ÍøÂç¹ÊÕÏÆÚ¼ä·¢ÉúÁËʲô£¬µ«ÊÇproducer¿ÉÒÔretry¶à´Î£¬È·±£ÏûÏ¢ÒѾ­ÕýÈ·´«Êäµ½brokerÖУ¬ËùÒÔĿǰKafkaʵÏÖµÄÊÇat least once¡£

consumer´ÓbrokerÖжÁÈ¡ÏûÏ¢ºó£¬¿ÉÒÔÑ¡Ôñcommit£¬¸Ã²Ù×÷»áÔÚZookeeperÖдæÏ¸ÃconsumerÔÚ¸Ãpartition϶ÁÈ¡µÄÏûÏ¢µÄoffset¡£¸ÃconsumerÏÂÒ»´ÎÔÙ¶Á¸Ãpartitionʱ»á´ÓÏÂÒ»Ìõ¿ªÊ¼¶ÁÈ¡¡£Èçδcommit£¬ÏÂÒ»´Î¶ÁÈ¡µÄ¿ªÊ¼Î»Öûá¸úÉÏÒ»´ÎcommitÖ®ºóµÄ¿ªÊ¼Î»ÖÃÏàͬ¡£µ±È»Ò²¿ÉÒÔ½«consumerÉèÖÃΪautocommit£¬¼´consumerÒ»µ©¶ÁÈ¡µ½Êý¾ÝÁ¢¼´×Ô¶¯commit¡£Èç¹ûÖ»ÌÖÂÛÕâÒ»¶ÁÈ¡ÏûÏ¢µÄ¹ý³Ì£¬ÄÇKafkaÊÇÈ·±£ÁËexactly once, µ«ÊÇÈç¹ûÓÉÓÚÇ°ÃæproducerÓëbrokerÖ®¼äµÄijÖÖÔ­Òòµ¼ÖÂÏûÏ¢µÄÖØ¸´£¬ÄÇôÕâÀï¾ÍÊÇat least once¡£

¿¼ÂÇÕâÑùÒ»ÖÖÇé¿ö£¬µ±consumer¶ÁÍêÏûÏ¢Ö®ºóÏÈcommitÔÙ´¦ÀíÏûÏ¢£¬ÔÚÕâÖÖģʽÏ£¬Èç¹ûconsumerÔÚcommitºó»¹Ã»À´µÃ¼°´¦ÀíÏûÏ¢¾ÍcrashÁË£¬Ï´ÎÖØÐ¿ªÊ¼¹¤×÷ºó¾ÍÎÞ·¨¶Áµ½¸Õ¸ÕÒÑÌá½»¶øÎ´´¦ÀíµÄÏûÏ¢£¬Õâ¾Í¶ÔÓ¦ÓÚat most onceÁË¡£

¶ÁÍêÏûÏ¢ÏÈ´¦ÀíÔÙcommit¡£ÕâÖÖģʽÏ£¬Èç¹û´¦ÀíÍêÁËÏûÏ¢ÔÚcommit֮ǰconsumer crashÁË£¬Ï´ÎÖØÐ¿ªÊ¼¹¤×÷ʱ»¹»á´¦Àí¸Õ¸ÕδcommitµÄÏûÏ¢£¬Êµ¼ÊÉϸÃÏûÏ¢ÒѾ­±»´¦Àí¹ýÁË£¬Õâ¾Í¶ÔÓ¦ÓÚat least once¡£

Òª×öµ½exactly once¾ÍÐèÒªÒýÈëÏûÏ¢È¥ÖØ»úÖÆ¡£

4.2 ÏûÏ¢È¥ÖØ

ÈçÉÏÒ»½ÚËùÊö£¬KafkaÔÚproducer¶ËºÍconsumer¶Ë¶¼»á³öÏÖÏûÏ¢µÄÖØ¸´£¬Õâ¾ÍÐèÒªÈ¥ÖØ´¦Àí¡£

KafkaÎĵµÖÐÌá¼°GUID(Globally Unique Identifier)µÄ¸ÅÄͨ¹ý¿Í»§¶ËÉú³ÉËã·¨µÃµ½Ã¿¸öÏûÏ¢µÄunique id£¬Í¬Ê±¿ÉÓ³ÉäÖÁbrokerÉÏ´æ´¢µÄµØÖ·£¬¼´Í¨¹ýGUID±ã¿É²éѯÌáÈ¡ÏûÏ¢ÄÚÈÝ£¬Ò²±ãÓÚ·¢ËÍ·½µÄÃݵÈÐÔ±£Ö¤£¬ÐèÒªÔÚbrokerÉÏÌṩ´ËÈ¥ÖØ´¦ÀíÄ£¿é£¬Ä¿Ç°°æ±¾Éв»Ö§³Ö¡£

Õë¶ÔGUID, Èç¹û´Ó¿Í»§¶ËµÄ½Ç¶ÈÈ¥ÖØ£¬ÄÇôÐèÒªÒýÈ뼯ÖÐʽ»º´æ£¬±ØÈ»»áÔö¼ÓÒÀÀµ¸´ÔÓ¶È£¬ÁíÍ⻺´æµÄ´óСÄÑÒԽ綨¡£

²»Ö»ÊÇKafka, ÀàËÆRabbitMQÒÔ¼°RocketMQÕâÀàÉÌÒµ¼¶Öмä¼þÒ²Ö»±£ÕÏat least once, ÇÒÒ²ÎÞ·¨´Ó×ÔÉíÈ¥½øÐÐÏûÏ¢È¥ÖØ¡£ËùÒÔÎÒÃǽ¨ÒéÒµÎñ·½¸ù¾Ý×ÔÉíµÄÒµÎñÌØµã½øÐÐÈ¥ÖØ£¬±ÈÈçÒµÎñÏûÏ¢±¾Éí¾ß±¸ÃݵÈÐÔ£¬»òÕß½èÖúRedisµÈÆäËû²úÆ·½øÐÐÈ¥ÖØ´¦Àí¡£

4.3 ¸ß¿É¿¿ÐÔÅäÖÃ

KafkaÌṩÁ˺ܸߵÄÊý¾ÝÈßÓ൯ÐÔ£¬¶ÔÓÚÐèÒªÊý¾Ý¸ß¿É¿¿ÐԵij¡¾°£¬ÎÒÃÇ¿ÉÒÔÔö¼ÓÊý¾ÝÈßÓ౸·ÝÊý£¨replication.factor£©£¬µ÷¸ß×îСдÈ븱±¾ÊýµÄ¸öÊý£¨min.insync.replicas£©µÈµÈ£¬µ«ÊÇÕâÑù»áÓ°ÏìÐÔÄÜ¡£·´Ö®£¬ÐÔÄÜÌá¸ß¶ø¿É¿¿ÐÔÔò½µµÍ£¬Óû§ÐèÒª×ÔÉíÒµÎñÌØÐÔÔڱ˴ËÖ®¼ä×öһЩȨºâÐÔÑ¡Ôñ¡£

Òª±£Ö¤Êý¾ÝдÈëµ½KafkaÊǰ²È«µÄ£¬¸ß¿É¿¿µÄ£¬ÐèÒªÈçϵÄÅäÖãº

topicµÄÅäÖãºreplication.factor>=3,¼´¸±±¾ÊýÖÁÉÙÊÇ3¸ö£»2<=min.insync.replicas<=replication.factor

brokerµÄÅäÖãºleaderµÄÑ¡¾ÙÌõ¼þunclean.leader.election.enable=false

producerµÄÅäÖãºrequest.required.acks=-1(all)£¬producer.type=sync

5 BenchMark

KafkaÔÚΨƷ»áÓÐןÜÉîµÄÀúÊ·Ô¨Ô´£¬¸ù¾ÝΨƷ»áÏûÏ¢Öмä¼þÍŶӣ¨VMSÍŶӣ©ËùÕÆÎÕµÄ×ÊÁÏÏÔʾ£¬ÔÚVMSÍŶÓÔËתµÄKafka¼¯ÈºÖÐËùÖ§³ÅµÄtopicÊýÒѽӽü2000£¬Ã¿ÌìµÄÇëÇóÁ¿Ò²ÒÑ´ïǧÒÚ¼¶¡£ÕâÀï¾ÍÒÔKafkaµÄ¸ß¿É¿¿ÐÔΪ»ù×¼µãÀ´Ì½¾¿¼¸ÖÖ²»Í¬³¡¾°ÏµÄÐÐΪ±íÏÖ£¬ÒÔ´ËÀ´¼ÓÉî¶ÔKafkaµÄÈÏÖª£¬Îª´ó¼ÒÔÚÒÔºó¸ßЧµÄʹÓÃKafkaʱÌṩһ·ÝÒÀ¾Ý¡£

5.1 ²âÊÔ»·¾³

Kafka brokerÓõ½ÁË4̨»úÆ÷£¬·Ö±ðΪbroker[0/1/2/3]ÅäÖÃÈçÏ£º

CPU: 24core/2.6GHZ

Memory: 62G

Network: 4000Mb

OS/kernel: CentOs release 6.6 (Final)

Disk: 1089G

Kafka°æ±¾£º0.10.1.0

broker¶ËJVM²ÎÊýÉèÖãº

-Xmx8G -Xms8G -serverX:
+UseParNewGC
-XX:+UseConcMarkSweepGC -XX:
+CMSClassUnloadingEnabled -XX:
+CMSScavengeBeforeRemark -XX:
+DisableExplicitGC -Djava.awt.
headless=true -Xloggc :/apps/service/kafka/bin/../
logs/kafkaServer-gc.log -verbose:gc -XX:+PrintGCDetails
-XX:+PrintGCDateStamps -XX:
+PrintGCTimeStamps - Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate =false
-Dcom.sun.management.jmxremote.ssl =false
-Dcom.sun.management.jmxremote.port =9999

¿Í»§¶Ë»úÆ÷ÅäÖãº

CPU: 24core/2.6GHZ

Memory: 3G

Network: 1000Mb

OS/kernel: CentOs release 6.3 (Final)

Disk: 240G

5.2 ²»Í¬³¡¾°²âÊÔ

³¡¾°1£º²âÊÔ²»Í¬µÄ¸±±¾Êý¡¢min.insync.replicas²ßÂÔÒÔ¼°request.required.acks²ßÂÔ£¨ÒÔϼò³Æacks²ßÂÔ£©¶ÔÓÚ·¢ËÍËÙ¶È£¨TPS£©µÄÓ°Ïì¡£

¾ßÌåÅäÖãºÒ»¸öproducer£»·¢ËÍ·½Ê½Îªsync£»ÏûÏ¢Ìå´óСΪ1kB£»partitionÊýΪ12¡£¸±±¾ÊýΪ£º1/2/4£»min.insync.replicas·Ö±ðΪ1/2/4£»acks·Ö±ðΪ-1£¨all£©/1/0¡£

¾ßÌå²âÊÔÊý¾ÝÈçÏÂ±í£¨min.insync.replicasÖ»ÔÚacks=-1ʱÓÐЧ£©£º

²âÊÔ½á¹û·ÖÎö£º

¿Í»§¶ËµÄacks²ßÂÔ¶Ô·¢Ë͵ÄTPSÓнϴóµÄÓ°Ï죬TPS£ºacks_0 > acks_1 > ack_-1;

¸±±¾ÊýÔ½¸ß£¬TPSÔ½µÍ£»¸±±¾ÊýÒ»ÖÂʱ£¬min.insync.replicas²»Ó°ÏìTPS£»

acks=0/1ʱ£¬TPSÓëmin.insync.replicas²ÎÊýÒÔ¼°¸±±¾ÊýÎ޹أ¬½öÊÜacks²ßÂÔµÄÓ°Ïì¡£

ÏÂÃæ½«partitionµÄ¸öÊýÉèÖÃΪ1£¬À´½øÒ»²½È·ÈÏϲ»Í¬µÄacks²ßÂÔ¡¢²»Í¬µÄmin.insync.replicas²ßÂÔÒÔ¼°²»Í¬µÄ¸±±¾Êý¶ÔÓÚ·¢ËÍËٶȵÄÓ°Ï죬ÏêϸÇë¿´Çé¾°2ºÍÇé¾°3¡£

³¡¾°2£ºÔÚpartition¸öÊý¹Ì¶¨Îª1£¬²âÊÔ²»Í¬µÄ¸±±¾ÊýºÍmin.insync.replicas²ßÂÔ¶Ô·¢ËÍËٶȵÄÓ°Ïì¡£

¾ßÌåÅäÖãºÒ»¸öproducer£»·¢ËÍ·½Ê½Îªsync£»ÏûÏ¢Ìå´óСΪ1kB£»producer¶Ëacks=-1(all)¡£±ä»»¸±±¾Êý£º2/3/4£» min.insync.replicasÉèÖÃΪ£º1/2/4¡£

²âÊÔ½á¹ûÈçÏ£º

²âÊÔ½á¹û·ÖÎö£º¸±±¾ÊýÔ½¸ß£¬TPSÔ½µÍ£¨ÕâµãÓ볡¾°1µÄ²âÊÔ½áÂÛÎǺϣ©£¬µ«Êǵ±partitionÊýΪ1ʱ²î¾àÉõ΢¡£min.insync.replicas²»Ó°ÏìTPS¡£

³¡¾°3£ºÔÚpartition¸öÊý¹Ì¶¨Îª1£¬²âÊÔ²»Í¬µÄacks²ßÂԺ͸±±¾Êý¶Ô·¢ËÍËٶȵÄÓ°Ïì¡£

¾ßÌåÅäÖãºÒ»¸öproducer£»·¢ËÍ·½Ê½Îªsync£»ÏûÏ¢Ìå´óСΪ1kB£»min.insync.replicas=1¡£topic¸±±¾ÊýΪ£º1/2/4£»acks£º 0/1/-1¡£

²âÊÔ½á¹ûÈçÏ£º

²âÊÔ½á¹û·ÖÎö£¨ÓëÇé¾°1Ò»Ö£©£º

¸±±¾ÊýÔ½¶à£¬TPSÔ½µÍ£»

¿Í»§¶ËµÄacks²ßÂÔ¶Ô·¢Ë͵ÄTPSÓнϴóµÄÓ°Ï죬TPS£ºacks_0 > acks_1 > ack_-1¡£

³¡¾°4£º²âÊÔ²»Í¬partitionÊý¶Ô·¢ËÍËÙÂʵÄÓ°Ïì

¾ßÌåÅäÖãºÒ»¸öproducer£»ÏûÏ¢Ìå´óСΪ1KB£»·¢ËÍ·½Ê½Îªsync£»topic¸±±¾ÊýΪ2£»min.insync.replicas=2£»acks=-1¡£partitionÊýÁ¿ÉèÖÃΪ1/2/4/8/12¡£

²âÊÔ½á¹û£º

²âÊÔ½á¹û·ÖÎö£ºpartitionµÄ²»Í¬»áÓ°ÏìTPS£¬Ëæ×ÅpartitionµÄ¸öÊýµÄÔö³¤TPS»áÓÐËùÔö³¤£¬µ«²¢²»ÊÇÒ»Ö±³ÉÕý±È¹ØÏµ£¬µ½´ïÒ»¶¨ÁÙ½çֵʱ£¬partitionÊýÁ¿µÄÔö¼Ó·´¶ø»áʹTPSÂÔ΢½µµÍ¡£

³¡¾°5£ºÍ¨¹ý½«¼¯ÈºÖв¿·ÖbrokerÉèÖóɲ»¿É·þÎñ״̬£¬²âÊÔ¶Ô¿Í»§¶ËÒÔ¼°ÏûÏ¢ÂäÅ̵ÄÓ°Ïì¡£

¾ßÌåÅäÖãºÒ»¸öproducer£»ÏûÏ¢Ìå´óС1KB;·¢ËÍ·½Ê½Îªsync£»topic¸±±¾ÊýΪ4£»min.insync.replicasÉèÖÃΪ2£»acks=-1£»retries=0/100000000£»partitionÊýΪ12¡£

¾ßÌå²âÊÔÊý¾ÝÈçÏÂ±í£º

³ö´íÐÅÏ¢£º

´íÎó1£º¿Í»§¶Ë·µ»ØÒì³££¬²¿·ÖÊý¾Ý¿ÉÂäÅÌ£¬²¿·Öʧ°Ü£ºorg.apache.kafka.common.errors.NetworkException: The server disconnected before a response was received.

´íÎó2 £º[WARN]internals.Sender - Got error produce response with correlation id 19369 on topic - partition default_channel_replicas_4_1-3, retrying (999999999 attempts left). Error: NETWORK_EXCEPTION

´íÎó3£º [WARN]internals.Sender - Got error produce response with correlation id 77890 on topic-partition default_channel_replicas_4_1-8, retrying (999999859 attempts left) . Error: NOT_ENOUGH_REPLICAS

´íÎó4£º [WARN]internals.Sender - Got error produce response with correlation id 77705 on topic - partition default_channel_replicas_4_1-3, retrying (999999999 attempts left). Error: NOT_ENOUGH_REPLICAS _AFTER_APPEND

²âÊÔ½á¹û·ÖÎö£º

killÁ½Ì¨brokerºó£¬¿Í»§¶Ë¿ÉÒÔ¼ÌÐø·¢ËÍ¡£broker¼õÉÙºó£¬partitionµÄleader·Ö²¼ÔÚÊ£ÓàµÄÁ½Ì¨brokerÉÏ£¬Ôì³ÉÁËTPSµÄ¼õС£»

killÈý̨brokerºó£¬¿Í»§¶ËÎÞ·¨¼ÌÐø·¢ËÍ¡£KafkaµÄ×Ô¶¯ÖØÊÔ¹¦ÄÜ¿ªÊ¼Æð×÷Ó㬵±´óÓÚµÈÓÚmin.insync.replicasÊýÁ¿µÄbroker»Ö¸´ºó£¬¿ÉÒÔ¼ÌÐø·¢ËÍ£»

µ±retries²»Îª0ʱ£¬ÏûÏ¢ÓÐÖØ¸´ÂäÅÌ£»¿Í»§¶Ë³É¹¦·µ»ØµÄÏûÏ¢¶¼³É¹¦ÂäÅÌ£¬Ò쳣ʱ²¿·ÖÏûÏ¢¿ÉÒÔÂäÅÌ¡£

³¡¾°6£º²âÊÔµ¥¸öproducerµÄ·¢ËÍÑÓ³Ù£¬ÒÔ¼°¶Ëµ½¶ËµÄÑÓ³Ù¡£

¾ßÌåÅäÖ㺣ºÒ»¸öproducer£»ÏûÏ¢Ìå´óС1KB£»·¢ËÍ·½Ê½Îªsync£»topic¸±±¾ÊýΪ4£»min.insync.replicasÉèÖÃΪ2£»acks=-1£»partitionÊýΪ12¡£

²âÊÔÊý¾Ý¼°½á¹û£¨µ¥Î»Îªms£©£º

¸÷³¡¾°²âÊÔ×ܽ᣺

µ±acks=-1ʱ£¬Kafka·¢ËͶ˵ÄTPSÊÜÏÞÓÚtopicµÄ¸±±¾ÊýÁ¿£¨ISRÖУ©£¬¸±±¾Ô½¶àTPSÔ½µÍ£»

acks=0ʱ£¬TPS×î¸ß£¬Æä´ÎΪ1£¬×î²îΪ-1£¬ ¼´ TPS£ºacks_0 > acks_1 > ack_-1£»

min.insync.replicas²ÎÊý²»Ó°Ïì TPS£»

partitionµÄ²»Í¬»áÓ°ÏìTPS£¬Ëæ×ÅpartitionµÄ¸öÊýµÄÔö³¤TPS»áÓÐËùÔö³¤£¬µ«²¢²»ÊÇÒ»Ö±³ÉÕý±È¹ØÏµ£¬µ½´ïÒ»¶¨ÁÙ½çֵʱ£¬partitionÊýÁ¿µÄÔö¼Ó·´¶ø»áʹTPSÂÔ΢½µµÍ£»

KafkaÔÚacks=-1, min.insync.replicas>=1ʱ£¬¾ßÓи߿ɿ¿ÐÔ£¬ËùÓгɹ¦·µ»ØµÄÏûÏ¢¶¼¿ÉÒÔÂäÅÌ¡£

   
2356 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

»ùÓÚEAµÄÊý¾Ý¿â½¨Ä£
Êý¾ÝÁ÷½¨Ä££¨EAÖ¸ÄÏ£©
¡°Êý¾Ýºþ¡±£º¸ÅÄî¡¢ÌØÕ÷¡¢¼Ü¹¹Óë°¸Àý
ÔÚÏßÉ̳ÇÊý¾Ý¿âϵͳÉè¼Æ ˼·+Ч¹û
 
Ïà¹ØÎĵµ

GreenplumÊý¾Ý¿â»ù´¡Åàѵ
MySQL5.1ÐÔÄÜÓÅ»¯·½°¸
ijµçÉÌÊý¾ÝÖÐ̨¼Ü¹¹Êµ¼ù
MySQL¸ßÀ©Õ¹¼Ü¹¹Éè¼Æ
Ïà¹Ø¿Î³Ì

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ