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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Kafka¸ßÐÔÄܼܹ¹Ö®µÀ
 
  2462  次浏览      27
 2018-5-30
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚcsdn£¬ÎÄ´Óºê¹Û¼Ü¹¹²ãÃæºÍ¾ßÌåʵÏÖ²ãÃæ·ÖÎöÁËKafkaÈçºÎʵÏÖ¸ßÐÔÄÜ¡£

ºê¹Û¼Ü¹¹²ãÃæ

ÀûÓÃPartitionʵÏÖ²¢Ðд¦Àí

PartitionÌṩ²¢Ðд¦ÀíµÄÄÜÁ¦

KafkaÊÇÒ»¸öPub-SubµÄÏûϢϵͳ£¬ÎÞÂÛÊÇ·¢²¼»¹ÊǶ©ÔÄ£¬¶¼ÐëÖ¸¶¨Topic¡£Èç¡¶KafkaÉè¼Æ½âÎö£¨Ò»£©- Kafka±³¾°¼°¼Ü¹¹½éÉÜ¡·Ò»ÎÄËùÊö£¬TopicÖ»ÊÇÒ»¸öÂß¼­µÄ¸ÅÄÿ¸öTopic¶¼°üº¬Ò»¸ö»ò¶à¸öPartition£¬²»Í¬Partition¿ÉλÓÚ²»Í¬½Úµã¡£Í¬Ê±PartitionÔÚÎïÀíÉ϶ÔÓ¦Ò»¸ö±¾µØÎļþ¼Ð£¬Ã¿¸öPartition°üº¬Ò»¸ö»ò¶à¸öSegment£¬Ã¿¸öSegment°üº¬Ò»¸öÊý¾ÝÎļþºÍÒ»¸öÓëÖ®¶ÔÓ¦µÄË÷ÒýÎļþ¡£ÔÚÂß¼­ÉÏ£¬¿ÉÒÔ°ÑÒ»¸öPartitionµ±×÷Ò»¸ö·Ç³£³¤µÄÊý×飬¿Éͨ¹ýÕâ¸ö¡°Êý×顱µÄË÷Òý£¨offset£©È¥·ÃÎÊÆäÊý¾Ý¡£

Ò»·½Ã棬ÓÉÓÚ²»Í¬Partition¿ÉλÓÚ²»Í¬»úÆ÷£¬Òò´Ë¿ÉÒÔ³ä·ÖÀûÓü¯ÈºÓÅÊÆ£¬ÊµÏÖ»úÆ÷¼äµÄ²¢Ðд¦Àí¡£ÁíÒ»·½Ã棬ÓÉÓÚPartitionÔÚÎïÀíÉ϶ÔÓ¦Ò»¸öÎļþ¼Ð£¬¼´Ê¹¶à¸öPartitionλÓÚͬһ¸ö½Úµã£¬Ò²¿Éͨ¹ýÅäÖÃÈÃͬһ½ÚµãÉϵIJ»Í¬PartitionÖÃÓÚ²»Í¬µÄdisk driveÉÏ£¬´Ó¶øÊµÏÖ´ÅÅ̼äµÄ²¢Ðд¦Àí£¬³ä·Ö·¢»Ó¶à´ÅÅ̵ÄÓÅÊÆ¡£

ÀûÓöà´ÅÅ̵ľßÌå·½·¨ÊÇ£¬½«²»Í¬´ÅÅÌmountµ½²»Í¬Ä¿Â¼£¬È»ºóÔÚserver.propertiesÖУ¬½«log.dirsÉèÖÃΪ¶àĿ¼£¨ÓöººÅ·Ö¸ô£©¡£Kafka»á×Ô¶¯½«ËùÓÐPartition¾¡¿ÉÄܾùÔÈ·ÖÅäµ½²»Í¬Ä¿Â¼Ò²¼´²»Í¬Ä¿Â¼£¨Ò²¼´²»Í¬disk£©ÉÏ¡£

×¢£ºËäÈ»ÎïÀíÉÏ×îСµ¥Î»ÊÇSegment£¬µ«Kafka²¢²»ÌṩͬһPartitionÄÚ²»Í¬Segment¼äµÄ²¢Ðд¦Àí¡£ÒòΪ¶ÔÓÚд¶øÑÔ£¬Ã¿´ÎÖ»»áдPartitionÄÚµÄÒ»¸öSegment£¬¶ø¶ÔÓÚ¶Á¶øÑÔ£¬Ò²Ö»»á˳Ðò¶ÁȡͬһPartitionÄڵIJ»Í¬Segment¡£

PartitionÊÇ×îС²¢·¢Á£¶È

Èçͬ¡¶KafkaÉè¼Æ½âÎö£¨ËÄ£©- Kafka ConsumerÉè¼Æ½âÎö¡·Ò»ÎÄËùÊö£¬¶àConsumerÏû·Ñͬһ¸öTopicʱ£¬Í¬Ò»ÌõÏûÏ¢Ö»»á±»Í¬Ò»Consumer GroupÄÚµÄÒ»¸öConsumerËùÏû·Ñ¡£¶øÊý¾Ý²¢·Ç°´ÏûϢΪµ¥Î»·ÖÅ䣬¶øÊÇÒÔPartitionΪµ¥Î»·ÖÅ䣬Ҳ¼´Í¬Ò»¸öPartitionµÄÊý¾ÝÖ»»á±»Ò»¸öConsumerËùÏû·Ñ£¨ÔÚ²»¿¼ÂÇRebalanceµÄǰÌáÏ£©¡£

Èç¹ûConsumerµÄ¸öÊý¶àÓÚPartitionµÄ¸öÊý£¬ÄÇô»áÓв¿·ÖConsumerÎÞ·¨Ïû·Ñ¸ÃTopicµÄÈκÎÊý¾Ý£¬Ò²¼´µ±Consumer¸öÊý³¬¹ýPartitionºó£¬Ôö¼ÓConsumer²¢²»ÄÜÔö¼Ó²¢Ðжȡ£

¼ò¶øÑÔÖ®£¬Partition¸öÊý¾ö¶¨ÁË¿ÉÄܵÄ×î´ó²¢Ðжȡ£ÈçÏÂͼËùʾ£¬ÓÉÓÚTopic 2Ö»°üº¬3¸öPartition£¬¹Êgroup2ÖеÄConsumer 3¡¢Consumer 4¡¢Consumer 5 ¿É·Ö±ðÏû·Ñ1¸öPartitionµÄÊý¾Ý£¬¶øConsumer 6Ïû·Ñ²»µ½Topic 2µÄÈκÎÊý¾Ý¡£

ÒÔSparkÏû·ÑKafkaÊý¾ÝΪÀý£¬Èç¹ûËùÏû·ÑµÄTopicµÄPartitionÊýΪN£¬ÔòÓÐЧµÄSpark×î´ó²¢ÐжÈҲΪN¡£¼´Ê¹½«SparkµÄExecutorÊýÉèÖÃΪN+M£¬×î¶àÒ²Ö»ÓÐN¸öExecutor¿Éͬʱ´¦Àí¸ÃTopicµÄÊý¾Ý¡£

ISRʵÏÖ¿ÉÓÃÐÔÓëÊý¾ÝÒ»ÖÂÐԵĶ¯Ì¬Æ½ºâ

CAPÀíÂÛ

CAPÀíÂÛÊÇÖ¸£¬·Ö²¼Ê½ÏµÍ³ÖУ¬Ò»ÖÂÐÔ¡¢¿ÉÓÃÐԺͷÖÇøÈÝÈÌÐÔ×î¶àÖ»ÄÜͬʱÂú×ãÁ½¸ö¡£

Ò»ÖÂÐÔ

1.ͨ¹ýij¸ö½ÚµãµÄд²Ù×÷½á¹û¶ÔºóÃæÍ¨¹ýÆäËü½ÚµãµÄ¶Á²Ù×÷¿É¼û

2.Èç¹û¸üÐÂÊý¾Ýºó£¬²¢·¢·ÃÎÊÇé¿öϺóÐø¶Á²Ù×÷¿ÉÁ¢¼´¸ÐÖª¸Ã¸üУ¬³ÆÎªÇ¿Ò»ÖÂÐÔ

3.Èç¹ûÔÊÐíÖ®ºó²¿·Ö»òÕßÈ«²¿¸ÐÖª²»µ½¸Ã¸üУ¬³ÆÎªÈõÒ»ÖÂÐÔ

4.ÈôÔÚÖ®ºóµÄÒ»¶Îʱ¼ä£¨Í¨³£¸Ãʱ¼ä²»¹Ì¶¨£©ºó£¬Ò»¶¨¿ÉÒÔ¸ÐÖªµ½¸Ã¸üУ¬³ÆÎª×îÖÕÒ»ÖÂÐÔ

¿ÉÓÃÐÔ

ÈκÎÒ»¸öûÓз¢Éú¹ÊÕÏµÄ½Úµã±ØÐëÔÚÓÐÏÞµÄʱ¼äÄÚ·µ»ØºÏÀíµÄ½á¹û

·ÖÇøÈÝÈÌÐÔ

²¿·Ö½Úµãå´»ú»òÕßÎÞ·¨ÓëÆäËü½ÚµãͨÐÅʱ£¬¸÷·ÖÇø¼ä»¹¿É±£³Ö·Ö²¼Ê½ÏµÍ³µÄ¹¦ÄÜ

Ò»°ã¶øÑÔ£¬¶¼ÒªÇó±£Ö¤·ÖÇøÈÝÈÌÐÔ¡£ËùÒÔÔÚCAPÀíÂÛÏ£¬¸ü¶àµÄÊÇÐèÒªÔÚ¿ÉÓÃÐÔºÍÒ»ÖÂÐÔÖ®¼ä×öȨºâ¡£

³£ÓÃÊý¾Ý¸´ÖƼ°Ò»ÖÂÐÔ·½°¸

Master-Slave

1.RDBMSµÄ¶Áд·ÖÀ뼴ΪµäÐ͵ÄMaster-Slave·½°¸

2.ͬ²½¸´Öƿɱ£Ö¤Ç¿Ò»ÖÂÐÔµ«»áÓ°Ïì¿ÉÓÃÐÔ

3.Òì²½¸´ÖÆ¿ÉÌṩ¸ß¿ÉÓÃÐÔµ«»á½µµÍÒ»ÖÂÐÔ

WNR

1.Ö÷ÒªÓÃÓÚÈ¥ÖÐÐÄ»¯µÄ·Ö²¼Ê½ÏµÍ³ÖС£DynamoDBÓëCassandra¼´²ÉÓô˷½°¸»òÆä±äÖÖ

2.N´ú±í×ܸ±±¾Êý£¬W´ú±íÿ´Îд²Ù×÷Òª±£Ö¤µÄ×îÉÙд³É¹¦µÄ¸±±¾Êý£¬R´ú±íÿ´Î¶ÁÖÁÉÙÒª¶ÁÈ¡µÄ¸±±¾Êý

3.µ±W+R>Nʱ£¬¿É±£Ö¤Ã¿´Î¶ÁÈ¡µÄÊý¾ÝÖÁÉÙÓÐÒ»¸ö¸±±¾ÓµÓÐ×îеÄÊý¾Ý

4.¶à¸öд²Ù×÷µÄ˳ÐòÄÑÒÔ±£Ö¤£¬¿ÉÄܵ¼Ö¶ั±¾¼äµÄд²Ù×÷˳Ðò²»Ò»Ö¡£Dynamoͨ¹ýÏòÁ¿Ê±ÖÓ±£Ö¤×îÖÕÒ»ÖÂÐÔ

Paxos¼°Æä±äÖÖ

GoogleµÄChubby£¬ZookeeperµÄÔ­×ӹ㲥ЭÒ飨Zab£©£¬RAFTµÈ

»ùÓÚISRµÄÊý¾Ý¸´ÖÆ·½°¸

Èç¡¶ Kafka High Availability£¨ÉÏ£©¡·Ò»ÎÄËùÊö£¬KafkaµÄÊý¾Ý¸´ÖÆÊÇÒÔPartitionΪµ¥Î»µÄ¡£¶ø¶à¸ö±¸·Ý¼äµÄÊý¾Ý¸´ÖÆ£¬Í¨¹ýFollowerÏòLeaderÀ­È¡Êý¾ÝÍê³É¡£´ÓÒ»ÕâµãÀ´½²£¬KafkaµÄÊý¾Ý¸´ÖÆ·½°¸½Ó½üÓÚÉÏÎÄËù½²µÄMaster-Slave·½°¸¡£²»Í¬µÄÊÇ£¬Kafka¼È²»ÊÇÍêÈ«µÄͬ²½¸´ÖÆ£¬Ò²²»ÊÇÍêÈ«µÄÒì²½¸´ÖÆ£¬¶øÊÇ»ùÓÚISRµÄ¶¯Ì¬¸´ÖÆ·½°¸¡£

ISR£¬Ò²¼´In-sync Replica¡£Ã¿¸öPartitionµÄLeader¶¼»áά»¤ÕâÑùÒ»¸öÁÐ±í£¬¸ÃÁбíÖУ¬°üº¬ÁËËùÓÐÓë֮ͬ²½µÄReplica£¨°üº¬Leader×Ô¼º£©¡£Ã¿´ÎÊý¾ÝдÈëʱ£¬Ö»ÓÐISRÖеÄËùÓÐReplica¶¼¸´ÖÆÍ꣬Leader²Å»á½«ÆäÖÃΪCommit£¬Ëü²ÅÄܱ»ConsumerËùÏû·Ñ¡£

ÕâÖÖ·½°¸£¬Óëͬ²½¸´ÖƷdz£½Ó½ü¡£µ«²»Í¬µÄÊÇ£¬Õâ¸öISRÊÇÓÉLeader¶¯Ì¬Î¬»¤µÄ¡£Èç¹ûFollower²»Äܽô¡°¸úÉÏ¡±Leader£¬Ëü½«±»Leader´ÓISRÖÐÒÆ³ý£¬´ýËüÓÖÖØÐ¡°¸úÉÏ¡±Leaderºó£¬»á±»LeaderÔٴμӼÓISRÖС£Ã¿´Î¸Ä±äISRºó£¬Leader¶¼»á½«×îеÄISR³Ö¾Ã»¯µ½ZookeeperÖС£

ÖÁÓÚÈçºÎÅжÏij¸öFollowerÊÇ·ñ¡°¸úÉÏ¡±Leader£¬²»Í¬°æ±¾µÄKafkaµÄ²ßÂÔÉÔ΢ÓÐÐ©Çø±ð¡£

1.¶ÔÓÚ0.8.*°æ±¾£¬Èç¹ûFollowerÔÚreplica.lag.time.max.msʱ¼äÄÚδÏòLeader·¢ËÍFetchÇëÇó£¨Ò²¼´Êý¾Ý¸´ÖÆÇëÇ󣩣¬ÔòLeader»á½«Æä´ÓISRÖÐÒÆ³ý¡£Èç¹ûijFollower³ÖÐøÏòLeader·¢ËÍFetchÇëÇ󣬵«ÊÇËüÓëLeaderµÄÊý¾Ý²î¾àÔÚreplica.lag.max.messagesÒÔÉÏ£¬Ò²»á±»Leader´ÓISRÖÐÒÆ³ý¡£

2.´Ó0.9.0.0°æ±¾¿ªÊ¼£¬replica.lag.max.messages±»ÒƳý£¬¹ÊLeader²»ÔÙ¿¼ÂÇFollowerÂäºóµÄÏûÏ¢ÌõÊý¡£ÁíÍ⣬Leader²»½ö»áÅжÏFollowerÊÇ·ñÔÚreplica.lag.time.max.msʱ¼äÄÚÏòÆä·¢ËÍFetchÇëÇó£¬Í¬Ê±»¹»á¿¼ÂÇFollowerÊÇ·ñÔÚ¸Ãʱ¼äÄÚÓëÖ®±£³Öͬ²½¡£

3.0.10.* °æ±¾µÄ²ßÂÔÓë0.9.*°æÒ»ÖÂ

¶ÔÓÚ0.8.*°æ±¾µÄreplica.lag.max.messages²ÎÊý£¬ºÜ¶à¶ÁÕßÔøÁôÑÔÌáÎÊ£¬¼ÈȻֻÓÐISRÖеÄËùÓÐReplica¸´ÖÆÍêºóµÄÏûÏ¢²Å±»ÈÏΪCommit£¬ÄÇΪºÎ»á³öÏÖFollowerÓëLeader²î¾à¹ý´óµÄÇé¿ö¡£Ô­ÒòÔÚÓÚ£¬Leader²¢²»ÐèÒªµÈµ½Ç°Ò»ÌõÏûÏ¢±»Commit²Å½ÓÊÕºóÒ»ÌõÏûÏ¢¡£ÊÂʵÉÏ£¬Leader¿ÉÒÔ°´Ë³Ðò½ÓÊÕ´óÁ¿ÏûÏ¢£¬×îеÄÒ»ÌõÏûÏ¢µÄOffset±»¼ÇΪHigh Wartermark¡£¶øÖ»Óб»ISRÖÐËùÓÐFollower¶¼¸´ÖƹýÈ¥µÄÏûÏ¢²Å»á±»Commit£¬ConsumerÖ»ÄÜÏû·Ñ±»CommitµÄÏûÏ¢¡£ÓÉÓÚFollowerµÄ¸´ÖÆÊÇÑϸñ°´Ë³ÐòµÄ£¬ËùÒÔ±»CommitµÄÏûϢ֮ǰµÄÏûÏ¢¿Ï¶¨Ò²ÒѾ­±»Commit¹ý¡£»»¾ä»°Ëµ£¬High Watermark±ê¼ÇµÄÊÇLeaderËù±£´æµÄ×îÐÂÏûÏ¢µÄoffset£¬¶øCommit Offset±ê¼ÇµÄÊÇ×îеĿɱ»Ïû·ÑµÄ£¨ÒÑͬ²½µ½ISRÖеÄFollower£©ÏûÏ¢¡£¶øLeader¶ÔÊý¾ÝµÄ½ÓÊÕÓëFollower¶ÔÊý¾ÝµÄ¸´ÖÆÊÇÒì²½½øÐеģ¬Òò´Ë»á³öÏÖCommit OffsetÓëHigh Watermark´æÔÚÒ»¶¨²î¾àµÄÇé¿ö¡£0.8.*°æ±¾ÖÐreplica.lag.max.messagesÏÞ¶¨ÁËLeaderÔÊÐíµÄ¸Ã²î¾àµÄ×î´óÖµ¡£

Kafka»ùÓÚISRµÄÊý¾Ý¸´ÖÆ·½°¸Ô­ÀíÈçÏÂͼËùʾ¡£

ÈçÉÏͼËùʾ£¬ÔÚµÚÒ»²½ÖУ¬Leader A×ܹ²ÊÕµ½3ÌõÏûÏ¢£¬¹ÊÆähigh watermarkΪ3£¬µ«ÓÉÓÚISRÖеÄFollowerֻͬ²½Á˵Ú1ÌõÏûÏ¢£¨m1£©£¬¹ÊÖ»ÓÐm1±»Commit£¬Ò²¼´Ö»ÓÐm1¿É±»ConsumerÏû·Ñ¡£´ËʱFollower BÓëLeader AµÄ²î¾àÊÇ1£¬¶øFollower CÓëLeader AµÄ²î¾àÊÇ2£¬¾ù䳬¹ýĬÈϵÄreplica.lag.max.messages£¬¹ÊµÃÒÔ±£ÁôÔÚISRÖС£ÔÚµÚ¶þ²½ÖУ¬ÓÉÓھɵÄLeader Aå´»ú£¬ÐµÄLeader BÔÚreplica.lag.time.max.msʱ¼äÄÚδÊÕµ½À´×ÔAµÄFetchÇëÇ󣬹ʽ«A´ÓISRÖÐÒÆ³ý£¬´ËʱISR={B£¬C}¡£Í¬Ê±£¬ÓÉÓÚ´ËʱеÄLeader BÖÐÖ»ÓÐ2ÌõÏûÏ¢£¬²¢Î´°üº¬m3£¨m3´Óδ±»ÈκÎLeaderËùCommit£©£¬ËùÒÔm3ÎÞ·¨±»ConsumerÏû·Ñ¡£µÚËIJ½ÖУ¬Follower A»Ö¸´Õý³££¬ËüÏȽ«å´»úǰδCommitµÄËùÓÐÏûϢȫ²¿É¾³ý£¬È»ºó´Ó×îºóCommit¹ýµÄÏûÏ¢µÄÏÂÒ»ÌõÏûÏ¢¿ªÊ¼×·¸ÏеÄLeader B£¬Ö±µ½Ëü¡°¸ÏÉÏ¡±ÐµÄLeader£¬²Å±»ÖØÐ¼ÓÈëеÄISRÖС£

ʹÓÃISR·½°¸µÄÔ­Òò

1.ÓÉÓÚLeader¿ÉÒÆ³ý²»Äܼ°Ê±Óë֮ͬ²½µÄFollower£¬¹ÊÓëͬ²½¸´ÖÆÏà±È¿É±ÜÃâ×îÂýµÄFollowerÍÏÂýÕûÌåËÙ¶È£¬Ò²¼´ISRÌá¸ßÁËϵͳ¿ÉÓÃÐÔ¡£

2.ISRÖеÄËùÓÐFollower¶¼°üº¬ÁËËùÓÐCommit¹ýµÄÏûÏ¢£¬¶øÖ»ÓÐCommit¹ýµÄÏûÏ¢²Å»á±»ConsumerÏû·Ñ£¬¹Ê´ÓConsumerµÄ½Ç¶È¶øÑÔ£¬ISRÖеÄËùÓÐReplica¶¼Ê¼ÖÕ´¦ÓÚͬ²½×´Ì¬£¬´Ó¶øÓëÒì²½¸´ÖÆ·½°¸Ïà±ÈÌá¸ßÁËÊý¾ÝÒ»ÖÂÐÔ¡£

3.ISR¿É¶¯Ì¬µ÷Õû£¬¼«ÏÞÇé¿öÏ£¬¿ÉÒÔÖ»°üº¬Leader£¬¼«´óÌá¸ßÁË¿ÉÈÝÈ̵Äå´»úµÄFollowerµÄÊýÁ¿¡£ÓëMajority Quorum·½°¸Ïà±È£¬ÈÝÈÌÏàͬ¸öÊýµÄ½Úµãʧ°Ü£¬ËùÒªÇóµÄ×ܽڵãÊýÉÙÁ˽üÒ»°ë¡£

ISRÏà¹ØÅäÖÃ˵Ã÷

1.BrokerµÄmin.insync.replicas²ÎÊýÖ¸¶¨ÁËBrokerËùÒªÇóµÄISR×îС³¤¶È£¬Ä¬ÈÏֵΪ1¡£Ò²¼´¼«ÏÞÇé¿öÏÂISR¿ÉÒÔÖ»°üº¬Leader¡£µ«´ËʱÈç¹ûLeaderå´»ú£¬Ôò¸ÃPartition²»¿ÉÓ㬿ÉÓÃÐԵò»µ½±£Ö¤¡£

2.Ö»Óб»ISRÖÐËùÓÐReplicaͬ²½µÄÏûÏ¢²Å±»Commit£¬µ«Producer·¢²¼Êý¾Ýʱ£¬Leader²¢²»ÐèÒªISRÖеÄËùÓÐReplicaͬ²½¸ÃÊý¾Ý²ÅÈ·ÈÏÊÕµ½Êý¾Ý¡£Producer¿ÉÒÔͨ¹ýacks²ÎÊýÖ¸¶¨×îÉÙÐèÒª¶àÉÙ¸öReplicaÈ·ÈÏÊÕµ½¸ÃÏûÏ¢²ÅÊÓΪ¸ÃÏûÏ¢·¢Ëͳɹ¦¡£acksµÄĬÈÏÖµÊÇ1£¬¼´LeaderÊÕµ½¸ÃÏûÏ¢ºóÁ¢¼´¸æËßProducerÊÕµ½¸ÃÏûÏ¢£¬´ËʱÈç¹ûÔÚISRÖеÄÏûÏ¢¸´ÖÆÍê¸ÃÏûϢǰLeaderå´»ú£¬ÄǸÃÌõÏûÏ¢»á¶ªÊ§¡£¶øÈç¹û½«¸ÃÖµÉèÖÃΪ0£¬ÔòProducer·¢ËÍÍêÊý¾Ýºó£¬Á¢¼´ÈÏΪ¸ÃÊý¾Ý·¢Ëͳɹ¦£¬²»×÷Èκεȴý£¬¶øÊµ¼ÊÉϸÃÊý¾Ý¿ÉÄÜ·¢ËÍʧ°Ü£¬²¢ÇÒProducerµÄRetry»úÖÆ½«²»ÉúЧ¡£¸üÍÆ¼öµÄ×ö·¨ÊÇ£¬½«acksÉèÖÃΪall»òÕß-1£¬´ËʱֻÓÐISRÖеÄËùÓÐReplica¶¼ÊÕµ½¸ÃÊý¾Ý£¨Ò²¼´¸ÃÏûÏ¢±»Commit£©£¬Leader²Å»á¸æËßProducer¸ÃÏûÏ¢·¢Ëͳɹ¦£¬´Ó¶ø±£Ö¤²»»áÓÐδ֪µÄÊý¾Ý¶ªÊ§¡£

¾ßÌåʵÏÖ²ãÃæ

¸ßЧʹÓôÅÅÌ

˳Ðòд´ÅÅÌ

¸ù¾Ý¡¶Ò»Ð©³¡¾°ÏÂ˳Ðòд´ÅÅÌ¿ìÓÚËæ»úдÄÚ´æ¡·ËùÊö£¬½«Ð´´ÅÅ̵Ĺý³Ì±äΪ˳Ðòд£¬¿É¼«´óÌá¸ß¶Ô´ÅÅ̵ÄÀûÓÃÂÊ¡£

KafkaµÄÕû¸öÉè¼ÆÖУ¬PartitionÏ൱ÓÚÒ»¸ö·Ç³£³¤µÄÊý×飬¶øBroker½ÓÊÕµ½µÄËùÓÐÏûϢ˳ÐòдÈëÕâ¸ö´óÊý×éÖС£Í¬Ê±Consumerͨ¹ýOffset˳ÐòÏû·ÑÕâЩÊý¾Ý£¬²¢ÇÒ²»É¾³ýÒѾ­Ïû·ÑµÄÊý¾Ý£¬´Ó¶ø±ÜÃâÁËËæ»úд´ÅÅ̵Ĺý³Ì¡£

ÓÉÓÚ´ÅÅÌÓÐÏÞ£¬²»¿ÉÄܱ£´æËùÓÐÊý¾Ý£¬Êµ¼ÊÉÏ×÷ΪÏûϢϵͳKafkaҲû±ØÒª±£´æËùÓÐÊý¾Ý£¬ÐèҪɾ³ý¾ÉµÄÊý¾Ý¡£¶øÕâ¸öɾ³ý¹ý³Ì£¬²¢·Çͨ¹ýʹÓá°¶Á-д¡±Ä£Ê½È¥ÐÞ¸ÄÎļþ£¬¶øÊǽ«Partition·ÖΪ¶à¸öSegment£¬Ã¿¸öSegment¶ÔÓ¦Ò»¸öÎïÀíÎļþ£¬Í¨¹ýɾ³ýÕû¸öÎļþµÄ·½Ê½È¥É¾³ýPartitionÄÚµÄÊý¾Ý¡£ÕâÖÖ·½Ê½Çå³ý¾ÉÊý¾ÝµÄ·½Ê½£¬Ò²±ÜÃâÁ˶ÔÎļþµÄËæ»úд²Ù×÷¡£

ͨ¹ýÈçÏ´úÂë¿ÉÖª£¬Kafkaɾ³ýSegmentµÄ·½Ê½£¬ÊÇÖ±½Óɾ³ýSegment¶ÔÓ¦µÄÕû¸ölogÎļþºÍÕû¸öindexÎļþ¶ø·Çɾ³ýÎļþÖеIJ¿·ÖÄÚÈÝ¡£

/**
* Delete this log segment from the filesystem.
*
* @throws KafkaStorageException if the delete fails.
*/
def delete() {
val deletedLog = log.delete()
val deletedIndex = index.delete()
val deletedTimeIndex = timeIndex.delete()
if(!deletedLog && log.file.exists)
throw new KafkaStorageException("Delete of log " + log.file.getName + " failed.")
if(!deletedIndex && index.file.exists)
throw new KafkaStorageException("Delete of index " + index.file.getName + " failed.")
if(!deletedTimeIndex && timeIndex.file.exists)
throw new KafkaStorageException("Delete of time index " + timeIndex.file.getName + " failed.")
}

³ä·ÖÀûÓÃPage Cache

ʹÓÃPage CacheµÄºÃ´¦ÈçÏÂ

1.I/O Scheduler»á½«Á¬ÐøµÄС¿éд×é×°³É´ó¿éµÄÎïÀíд´Ó¶øÌá¸ßÐÔÄÜ

2.I/O Scheduler»á³¢ÊÔ½«Ò»Ð©Ð´²Ù×÷ÖØÐ°´Ë³ÐòÅźã¬´Ó¶ø¼õÉÙ´ÅÅÌÍ·µÄÒÆ¶¯Ê±¼ä

3.³ä·ÖÀûÓÃËùÓпÕÏÐÄڴ棨·ÇJVMÄڴ棩¡£Èç¹ûʹÓÃÓ¦ÓòãCache£¨¼´JVM¶ÑÄڴ棩£¬»áÔö¼ÓGC¸ºµ£

4.¶Á²Ù×÷¿ÉÖ±½ÓÔÚPage CacheÄÚ½øÐС£Èç¹ûÏû·ÑºÍÉú²úËÙ¶ÈÏ൱£¬ÉõÖÁ²»ÐèҪͨ¹ýÎïÀí´ÅÅÌ£¨Ö±½Óͨ¹ýPage Cache£©½»»»Êý¾Ý

Èç¹û½ø³ÌÖØÆô£¬JVMÄÚµÄCache»áʧЧ£¬µ«Page CacheÈÔÈ»¿ÉÓÃ

BrokerÊÕµ½Êý¾Ýºó£¬Ð´´ÅÅÌʱֻÊǽ«Êý¾ÝдÈëPage Cache£¬²¢²»±£Ö¤Êý¾ÝÒ»¶¨ÍêȫдÈë´ÅÅÌ¡£´ÓÕâÒ»µã¿´£¬¿ÉÄÜ»áÔì³É»úÆ÷å´»úʱ£¬Page CacheÄÚµÄÊý¾ÝδдÈë´ÅÅÌ´Ó¶øÔì³ÉÊý¾Ý¶ªÊ§¡£µ«ÊÇÕâÖÖ¶ªÊ§Ö»·¢ÉúÔÚ»úÆ÷¶ÏµçµÈÔì³É²Ù×÷ϵͳ²»¹¤×÷µÄ³¡¾°£¬¶øÕâÖÖ³¡¾°ÍêÈ«¿ÉÒÔÓÉKafka²ãÃæµÄReplication»úÖÆÈ¥½â¾ö¡£Èç¹ûΪÁ˱£Ö¤ÕâÖÖÇé¿öÏÂÊý¾Ý²»¶ªÊ§¶øÇ¿Öƽ«Page CacheÖеÄÊý¾ÝFlushµ½´ÅÅÌ£¬·´¶ø»á½µµÍÐÔÄÜ¡£Ò²ÕýÒòÈç´Ë£¬KafkaËäÈ»ÌṩÁËflush.messagesºÍflush.msÁ½¸ö²ÎÊý½«Page CacheÖеÄÊý¾ÝÇ¿ÖÆFlushµ½´ÅÅÌ£¬µ«ÊÇKafka²¢²»½¨ÒéʹÓá£

Èç¹ûÊý¾ÝÏû·ÑËÙ¶ÈÓëÉú²úËÙ¶ÈÏ൱£¬ÉõÖÁ²»ÐèҪͨ¹ýÎïÀí´ÅÅ̽»»»Êý¾Ý£¬¶øÊÇÖ±½Óͨ¹ýPage Cache½»»»Êý¾Ý¡£Í¬Ê±£¬Follower´ÓLeader FetchÊý¾Ýʱ£¬Ò²¿Éͨ¹ýPage CacheÍê³É¡£ÏÂͼΪijPartitionµÄLeader½ÚµãµÄÍøÂç/´ÅÅ̶ÁдÐÅÏ¢¡£

´ÓÉÏͼ¿ÉÒÔ¿´µ½£¬¸ÃBrokerÿÃëͨ¹ýÍøÂç´ÓProducer½ÓÊÕÔ¼35MBÊý¾Ý£¬ËäÈ»ÓÐFollower´Ó¸ÃBroker FetchÊý¾Ý£¬µ«ÊǸÃBroker»ù±¾ÎÞ¶Á´ÅÅÌ¡£ÕâÊÇÒòΪ¸ÃBrokerÖ±½Ó´ÓPage CacheÖн«Êý¾ÝÈ¡³ö·µ»Ø¸øÁËFollower¡£

Ö§³Ö¶àDisk Drive

BrokerµÄlog.dirsÅäÖÃÏÔÊÐíÅäÖöà¸öÎļþ¼Ð¡£Èç¹û»úÆ÷ÉÏÓжà¸öDisk Drive£¬¿É½«²»Í¬µÄDisk¹ÒÔØµ½²»Í¬µÄĿ¼£¬È»ºó½«ÕâЩĿ¼¶¼ÅäÖõ½log.dirsÀï¡£Kafka»á¾¡¿ÉÄܽ«²»Í¬µÄPartition·ÖÅäµ½²»Í¬µÄĿ¼£¬Ò²¼´²»Í¬µÄDiskÉÏ£¬´Ó¶ø³ä·ÖÀûÓÃÁ˶àDiskµÄÓÅÊÆ¡£

Á㿽±´

KafkaÖдæÔÚ´óÁ¿µÄÍøÂçÊý¾Ý³Ö¾Ã»¯µ½´ÅÅÌ£¨Producerµ½Broker£©ºÍ´ÅÅÌÎļþͨ¹ýÍøÂç·¢ËÍ£¨Brokerµ½Consumer£©µÄ¹ý³Ì¡£ÕâÒ»¹ý³ÌµÄÐÔÄÜÖ±½ÓÓ°ÏìKafkaµÄÕûÌåÍÌÍÂÁ¿¡£

´«Í³Ä£Ê½ÏµÄËĴο½±´ÓëËÄ´ÎÉÏÏÂÎÄÇл»

ÒÔ½«´ÅÅÌÎļþͨ¹ýÍøÂç·¢ËÍΪÀý¡£´«Í³Ä£Ê½Ï£¬Ò»°ãʹÓÃÈçÏÂα´úÂëËùʾµÄ·½·¨ÏȽ«ÎļþÊý¾Ý¶ÁÈëÄڴ棬Ȼºóͨ¹ýSocket½«ÄÚ´æÖеÄÊý¾Ý·¢ËͳöÈ¥¡£

buffer = File.read
Socket.send(buffer)

ÕâÒ»¹ý³Ìʵ¼ÊÉÏ·¢ÉúÁËËÄ´ÎÊý¾Ý¿½±´¡£Ê×ÏÈͨ¹ýϵͳµ÷Óý«ÎļþÊý¾Ý¶ÁÈëµ½ÄÚºË̬Buffer£¨DMA¿½±´£©£¬È»ºóÓ¦ÓóÌÐò½«ÄÚ´æÌ¬BufferÊý¾Ý¶ÁÈëµ½Óû§Ì¬Buffer£¨CPU¿½±´£©£¬½Ó×ÅÓû§³ÌÐòͨ¹ýSocket·¢ËÍÊý¾Ýʱ½«Óû§Ì¬BufferÊý¾Ý¿½±´µ½ÄÚºË̬Buffer£¨CPU¿½±´£©£¬×îºóͨ¹ýDMA¿½±´½«Êý¾Ý¿½±´µ½NIC Buffer¡£Í¬Ê±£¬»¹°éËæ×ÅËÄ´ÎÉÏÏÂÎÄÇл»£¬ÈçÏÂͼËùʾ¡£

sendfileºÍtransferToʵÏÖÁ㿽±´

Linux 2.4+ÄÚºËͨ¹ýsendfileϵͳµ÷Óã¬ÌṩÁËÁ㿽±´¡£Êý¾Ýͨ¹ýDMA¿½±´µ½ÄÚºË̬Bufferºó£¬Ö±½Óͨ¹ýDMA¿½±´µ½NIC Buffer£¬ÎÞÐèCPU¿½±´¡£ÕâÒ²ÊÇÁ㿽±´Õâһ˵·¨µÄÀ´Ô´¡£³ýÁ˼õÉÙÊý¾Ý¿½±´Í⣬ÒòΪÕû¸ö¶ÁÎļþ-ÍøÂç·¢ËÍÓÉÒ»¸ösendfileµ÷ÓÃÍê³É£¬Õû¸ö¹ý³ÌÖ»ÓÐÁ½´ÎÉÏÏÂÎÄÇл»£¬Òò´Ë´ó´óÌá¸ßÁËÐÔÄÜ¡£Á㿽±´¹ý³ÌÈçÏÂͼËùʾ¡£

´Ó¾ßÌåʵÏÖÀ´¿´£¬KafkaµÄÊý¾Ý´«Êäͨ¹ýTransportLayerÀ´Íê³É£¬Æä×ÓÀàPlaintextTransportLayerͨ¹ýJava NIOµÄFileChannelµÄtransferToºÍtransferFrom·½·¨ÊµÏÖÁ㿽±´£¬ÈçÏÂËùʾ¡£

@Override
public long transferFrom(FileChannel fileChannel, long position, long count) throws IOException {
return fileChannel.transferTo(position, count, socketChannel);
}

¼õÉÙÍøÂ翪Ïú×¢£º transferToºÍtransferFrom²¢²»±£Ö¤Ò»¶¨ÄÜʹÓÃÁ㿽±´¡£Êµ¼ÊÉÏÊÇ·ñÄÜʹÓÃÁ㿽±´Óë²Ù×÷ϵͳÏà¹Ø£¬Èç¹û²Ù×÷ϵͳÌṩsendfileÕâÑùµÄÁ㿽±´ÏµÍ³µ÷Óã¬ÔòÕâÁ½¸ö·½·¨»áͨ¹ýÕâÑùµÄϵͳµ÷Óóä·ÖÀûÓÃÁ㿽±´µÄÓÅÊÆ£¬·ñÔò²¢²»ÄÜͨ¹ýÕâÁ½¸ö·½·¨±¾ÉíʵÏÖÁ㿽±´¡£

Åú´¦Àí

Åú´¦ÀíÊÇÒ»ÖÖ³£ÓõÄÓÃÓÚÌá¸ßI/OÐÔÄܵķ½Ê½¡£¶ÔKafka¶øÑÔ£¬Åú´¦Àí¼È¼õÉÙÁËÍøÂç´«ÊäµÄOverhead£¬ÓÖÌá¸ßÁËд´ÅÅ̵ÄЧÂÊ¡£

Kafka 0.8.1¼°ÒÔǰµÄProducerÇø·Öͬ²½ProducerºÍÒì²½Producer¡£Í¬²½ProducerµÄsend·½·¨Ö÷Òª·ÖÁ½ÖÖÐÎʽ¡£Ò»ÖÖÊǽÓÊÜÒ»¸öKeyedMessage×÷Ϊ²ÎÊý£¬Ò»´Î·¢ËÍÒ»ÌõÏûÏ¢¡£ÁíÒ»ÖÖÊǽÓÊÜÒ»ÅúKeyedMessage×÷Ϊ²ÎÊý£¬Ò»´ÎÐÔ·¢ËͶàÌõÏûÏ¢¡£¶ø¶ÔÓÚÒì²½·¢ËͶøÑÔ£¬ÎÞÂÛÊÇʹÓÃÄĸösend·½·¨£¬ÊµÏÖÉ϶¼²»»áÁ¢¼´½«ÏûÏ¢·¢Ë͸øBroker£¬¶øÊÇÏÈ´æµ½ÄÚ²¿µÄ¶ÓÁÐÖУ¬Ö±µ½ÏûÏ¢ÌõÊý´ïµ½ãÐÖµ»òÕß´ïµ½Ö¸¶¨µÄTimeout²ÅÕæÕýµÄ½«ÏûÏ¢·¢ËͳöÈ¥£¬´Ó¶øÊµÏÖÁËÏûÏ¢µÄÅúÁ¿·¢ËÍ¡£

Kafka 0.8.2¿ªÊ¼Ö§³ÖеÄProducer API£¬½«Í¬²½ProducerºÍÒì²½Producer½áºÏ¡£ËäÈ»´Ósend½Ó¿ÚÀ´¿´£¬Ò»´ÎÖ»ÄÜ·¢ËÍÒ»¸öProducerRecord£¬¶ø²»ÄÜÏñ֮ǰ°æ±¾µÄsend·½·¨Ò»Ñù½ÓÊÜÏûÏ¢ÁÐ±í£¬µ«ÊÇsend·½·¨²¢·ÇÁ¢¼´½«ÏûÏ¢·¢ËͳöÈ¥£¬¶øÊÇͨ¹ýbatch.sizeºÍlinger.ms¿ØÖÆÊµ¼Ê·¢ËÍÆµÂÊ£¬´Ó¶øÊµÏÖÅúÁ¿·¢ËÍ¡£

ÓÉÓÚÿ´ÎÍøÂç´«Ê䣬³ýÁË´«ÊäÏûÏ¢±¾ÉíÒÔÍ⣬»¹Òª´«Êä·Ç³£¶àµÄÍøÂçЭÒé±¾ÉíµÄһЩÄÚÈÝ£¨³ÆÎªOverhead£©£¬ËùÒÔ½«¶àÌõÏûÏ¢ºÏ²¢µ½Ò»Æð´«Ê䣬¿ÉÓÐЧ¼õÉÙÍøÂç´«ÊäµÄOverhead£¬½ø¶øÌá¸ßÁË´«ÊäЧÂÊ¡£

´ÓÁ㿽±´Õ½ڵÄͼÖпÉÒÔ¿´µ½£¬ËäÈ»Broker³ÖÐø´ÓÍøÂç½ÓÊÕÊý¾Ý£¬µ«ÊÇд´ÅÅ̲¢·ÇÿÃë¶¼ÔÚ·¢Éú£¬¶øÊǼä¸ôÒ»¶Îʱ¼äдһ´Î´ÅÅÌ£¬²¢ÇÒÿ´Îд´ÅÅ̵ÄÊý¾ÝÁ¿¶¼·Ç³£´ó£¨×î¸ß´ïµ½718MB/S£©¡£

Êý¾ÝѹËõ½µµÍÍøÂç¸ºÔØ

Kafka´Ó0.7¿ªÊ¼£¬¼´Ö§³Ö½«Êý¾ÝѹËõºóÔÙ´«Ê䏸Broker¡£³ýÁË¿ÉÒÔ½«Ã¿ÌõÏûÏ¢µ¥¶ÀѹËõÈ»ºó´«ÊäÍ⣬Kafka»¹Ö§³ÖÔÚÅúÁ¿·¢ËÍʱ£¬½«Õû¸öBatchµÄÏûÏ¢Ò»ÆðѹËõºó´«Êä¡£Êý¾ÝѹËõµÄÒ»¸ö»ù±¾Ô­ÀíÊÇ£¬Öظ´Êý¾ÝÔ½¶àѹËõЧ¹ûÔ½ºÃ¡£Òò´Ë½«Õû¸öBatchµÄÊý¾ÝÒ»ÆðѹËõÄܸü´ó·ù¶È¼õСÊý¾ÝÁ¿£¬´Ó¶ø¸ü´ó³Ì¶ÈÌá¸ßÍøÂç´«ÊäЧÂÊ¡£

Broker½ÓÊÕÏûÏ¢ºó£¬²¢²»Ö±½Ó½âѹËõ£¬¶øÊÇÖ±½Ó½«ÏûÏ¢ÒÔѹËõºóµÄÐÎʽ³Ö¾Ã»¯µ½´ÅÅÌ¡£Consumer Fetchµ½Êý¾ÝºóÔÙ½âѹËõ¡£Òò´ËKafkaµÄѹËõ²»½ö¼õÉÙÁËProducerµ½BrokerµÄÍøÂç´«Êä¸ºÔØ£¬Í¬Ê±Ò²½µµÍÁËBroker´ÅÅ̲Ù×÷µÄ¸ºÔØ£¬Ò²½µµÍÁËConsumerÓëBroker¼äµÄÍøÂç´«ÊäÁ¿£¬´Ó¶ø¼«´óµÃÌá¸ßÁË´«ÊäЧÂÊ£¬Ìá¸ßÁËÍÌÍÂÁ¿¡£

¸ßЧµÄÐòÁл¯·½Ê½

KafkaÏûÏ¢µÄKeyºÍPayload£¨»òÕß˵Value£©µÄÀàÐÍ¿É×Ô¶¨Ò壬ֻÐèͬʱÌṩÏàÓ¦µÄÐòÁл¯Æ÷ºÍ·´ÐòÁл¯Æ÷¼´¿É¡£Òò´ËÓû§¿ÉÒÔͨ¹ýʹÓÿìËÙÇÒ½ô´ÕµÄÐòÁл¯-·´ÐòÁл¯·½Ê½£¨ÈçAvro£¬Protocal Buffer£©À´¼õÉÙʵ¼ÊÍøÂç´«ÊäºÍ´ÅÅÌ´æ´¢µÄÊý¾Ý¹æÄ££¬´Ó¶øÌá¸ßÍÌÍÂÂÊ¡£ÕâÀïҪעÒ⣬Èç¹ûʹÓõÄÐòÁл¯·½·¨Ì«Âý£¬¼´Ê¹Ñ¹Ëõ±È·Ç³£¸ß£¬×îÖÕµÄЧÂÊÒ²²»Ò»¶¨¸ß¡£

 

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

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

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

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