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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
KafkaÉî¶È½âÎö
 
À´Ô´£º¼òÊé ·¢²¼ÓÚ£º2017-8-4
  2993  次浏览      27
 

Kafka¼ò½é

KafkaÊÇÒ»ÖÖ·Ö²¼Ê½µÄ£¬»ùÓÚ·¢²¼/¶©ÔĵÄÏûϢϵͳ¡£Ö÷ÒªÉè¼ÆÄ¿±êÈçÏ£º

ÒÔʱ¼ä¸´ÔÓ¶ÈΪO(1)µÄ·½Ê½ÌṩÏûÏ¢³Ö¾Ã»¯ÄÜÁ¦£¬²¢±£Ö¤¼´Ê¹¶ÔTB¼¶ÒÔÉÏÊý¾ÝÒ²Äܱ£Ö¤³£Êýʱ¼äµÄ·ÃÎÊÐÔÄÜ

¸ßÍÌÍÂÂÊ¡£¼´Ê¹Ôڷdz£Á®¼ÛµÄÉÌÓûúÆ÷ÉÏÒ²ÄÜ×öµ½µ¥»úÖ§³ÖÿÃë100KÌõÏûÏ¢µÄ´«Êä

Ö§³ÖKafka Server¼äµÄÏûÏ¢·ÖÇø£¬¼°·Ö²¼Ê½ÏûÏ¢Ïû·Ñ£¬Í¬Ê±±£Ö¤Ã¿¸öpartitionÄÚµÄÏûϢ˳Ðò´«Êä

ͬʱ֧³ÖÀëÏßÊý¾Ý´¦ÀíºÍʵʱÊý¾Ý´¦Àí

ΪʲôҪÓÃMessage Queue

½âñî ÔÚÏîÄ¿Æô¶¯Ö®³õÀ´Ô¤²â½«À´ÏîÄ¿»áÅöµ½Ê²Ã´ÐèÇó£¬ÊǼ«ÆäÀ§Äѵġ£ÏûÏ¢¶ÓÁÐÔÚ´¦Àí¹ý³ÌÖмä²åÈëÁËÒ»¸öÒþº¬µÄ¡¢»ùÓÚÊý¾ÝµÄ½Ó¿Ú²ã£¬Á½±ßµÄ´¦Àí¹ý³Ì¶¼ÒªÊµÏÖÕâÒ»½Ó¿Ú¡£ÕâÔÊÐíÄã¶ÀÁ¢µÄÀ©Õ¹»òÐÞ¸ÄÁ½±ßµÄ´¦Àí¹ý³Ì£¬Ö»ÒªÈ·±£ËüÃÇ×ñÊØÍ¬ÑùµÄ½Ó¿ÚÔ¼Êø

ÈßÓà ÓÐʱÔÚ´¦ÀíÊý¾ÝµÄʱºò´¦Àí¹ý³Ì»áʧ°Ü¡£³ý·ÇÊý¾Ý±»³Ö¾Ã»¯£¬·ñÔò½«ÓÀÔ¶¶ªÊ§¡£ÏûÏ¢¶ÓÁаÑÊý¾Ý½øÐг־û¯Ö±µ½ËüÃÇÒѾ­±»ÍêÈ«´¦Àí£¬Í¨¹ýÕâÒ»·½Ê½¹æ±ÜÁËÊý¾Ý¶ªÊ§·çÏÕ¡£ÔÚ±»Ðí¶àÏûÏ¢¶ÓÁÐËù²ÉÓõġ±²åÈë-»ñÈ¡-ɾ³ý¡±·¶Ê½ÖУ¬ÔÚ°ÑÒ»¸öÏûÏ¢´Ó¶ÓÁÐÖÐɾ³ý֮ǰ£¬ÐèÒªÄãµÄ´¦Àí¹ý³ÌÃ÷È·µÄÖ¸³ö¸ÃÏûÏ¢ÒѾ­±»´¦ÀíÍê±Ï£¬È·±£ÄãµÄÊý¾Ý±»°²È«µÄ±£´æÖ±µ½ÄãʹÓÃÍê±Ï¡£

À©Õ¹ÐÔ ÒòΪÏûÏ¢¶ÓÁнâñîÁËÄãµÄ´¦Àí¹ý³Ì£¬ËùÒÔÔö´óÏûÏ¢Èë¶ÓºÍ´¦ÀíµÄƵÂÊÊǺÜÈÝÒ׵ģ»Ö»ÒªÁíÍâÔö¼Ó´¦Àí¹ý³Ì¼´¿É¡£²»ÐèÒª¸Ä±ä´úÂë¡¢²»ÐèÒªµ÷½Ú²ÎÊý¡£À©Õ¹¾ÍÏñµ÷´óµçÁ¦°´Å¥Ò»Ñù¼òµ¥¡£

Áé»îÐÔ & ·åÖµ´¦ÀíÄÜÁ¦ ÔÚ·ÃÎÊÁ¿¾çÔöµÄÇé¿öÏ£¬Ó¦ÓÃÈÔÈ»ÐèÒª¼ÌÐø·¢»Ó×÷Ó㬵«ÊÇÕâÑùµÄÍ»·¢Á÷Á¿²¢²»³£¼û£»Èç¹ûΪÒÔÄÜ´¦ÀíÕâÀà·åÖµ·ÃÎÊΪ±ê×¼À´Í¶Èë×ÊÔ´ËæÊ±´ýÃüÎÞÒÉÊǾ޴óµÄÀË·Ñ¡£Ê¹ÓÃÏûÏ¢¶ÓÁÐÄܹ»Ê¹¹Ø¼ü×é¼þ¶¥×¡Ôö³¤µÄ·ÃÎÊѹÁ¦£¬¶ø²»ÊÇÒòΪ³¬³ö¸ººÉµÄÇëÇó¶øÍêÈ«±ÀÀ£¡£

¿É»Ö¸´ÐÔ µ±ÌåϵµÄÒ»²¿·Ö×é¼þʧЧ£¬²»»áÓ°Ïìµ½Õû¸öϵͳ¡£ÏûÏ¢¶ÓÁнµµÍÁ˽ø³Ì¼äµÄñîºÏ¶È£¬ËùÒÔ¼´Ê¹Ò»¸ö´¦ÀíÏûÏ¢µÄ½ø³Ì¹Òµô£¬¼ÓÈë¶ÓÁÐÖеÄÏûÏ¢ÈÔÈ»¿ÉÒÔÔÚϵͳ»Ö¸´ºó±»´¦Àí¡£¶øÕâÖÖÔÊÐíÖØÊÔ»òÕßÑÓºó´¦ÀíÇëÇóµÄÄÜÁ¦Í¨³£ÊÇÔì¾ÍÒ»¸öÂԸв»±ãµÄÓû§ºÍÒ»¸ö¾Úɥ͸¶¥µÄÓû§Ö®¼äµÄÇø±ð¡£

ËÍ´ï±£Ö¤ ÏûÏ¢¶ÓÁÐÌṩµÄÈßÓà»úÖÆ±£Ö¤ÁËÏûÏ¢Äܱ»Êµ¼ÊµÄ´¦Àí£¬Ö»ÒªÒ»¸ö½ø³Ì¶ÁÈ¡Á˸öÓÁм´¿É¡£ÔÚ´Ë»ù´¡ÉÏ£¬IronMQÌṩÁËÒ»¸ö¡±Ö»ËÍ´ïÒ»´Î¡±±£Ö¤¡£ÎÞÂÛÓжàÉÙ½ø³ÌÔÚ´Ó¶ÓÁÐÖÐÁìÈ¡Êý¾Ý£¬Ã¿Ò»¸öÏûÏ¢Ö»Äܱ»´¦ÀíÒ»´Î¡£ÕâÖ®ËùÒÔ³ÉΪ¿ÉÄÜ£¬ÊÇÒòΪ»ñȡһ¸öÏûÏ¢Ö»ÊÇ¡±Ô¤¶¨¡±ÁËÕâ¸öÏûÏ¢£¬ÔÝʱ°ÑËüÒÆ³öÁ˶ÓÁС£³ý·Ç¿Í»§¶ËÃ÷È·µÄ±íʾÒѾ­´¦ÀíÍêÁËÕâ¸öÏûÏ¢£¬·ñÔòÕâ¸öÏûÏ¢»á±»·Å»Ø¶ÓÁÐÖÐÈ¥£¬ÔÚÒ»¶Î¿ÉÅäÖõÄʱ¼äÖ®ºó¿ÉÔٴα»´¦Àí¡£

˳Ðò±£Ö¤ ÔÚÐí¶àÇé¿öÏ£¬Êý¾Ý´¦ÀíµÄ˳Ðò¶¼ºÜÖØÒª¡£ÏûÏ¢¶ÓÁб¾À´¾ÍÊÇÅÅÐòµÄ£¬²¢ÇÒÄܱ£Ö¤Êý¾Ý»á°´ÕÕÌØ¶¨µÄ˳ÐòÀ´´¦Àí¡£IronMO±£Ö¤ÏûÏ¢½¬ºýͨ¹ýFIFO£¨ÏȽøÏȳö£©µÄ˳ÐòÀ´´¦Àí£¬Òò´ËÏûÏ¢ÔÚ¶ÓÁÐÖеÄλÖþÍÊÇ´Ó¶ÓÁÐÖмìË÷ËûÃǵÄλÖá£

»º³å ÔÚÈκÎÖØÒªµÄϵͳÖУ¬¶¼»áÓÐÐèÒª²»Í¬µÄ´¦Àíʱ¼äµÄÔªËØ¡£ÀýÈç,¼ÓÔØÒ»ÕÅͼƬ±ÈÓ¦ÓùýÂËÆ÷»¨·Ñ¸üÉÙµÄʱ¼ä¡£ÏûÏ¢¶ÓÁÐͨ¹ýÒ»¸ö»º³å²ãÀ´°ïÖúÈÎÎñ×î¸ßЧÂʵÄÖ´ÐСªÐ´Èë¶ÓÁеĴ¦Àí»á¾¡¿ÉÄܵĿìËÙ£¬¶ø²»ÊÜ´Ó¶ÓÁжÁµÄÔ¤±¸´¦ÀíµÄÔ¼Êø¡£¸Ã»º³åÓÐÖúÓÚ¿ØÖƺÍÓÅ»¯Êý¾ÝÁ÷¾­¹ýϵͳµÄËÙ¶È¡£

Àí½âÊý¾ÝÁ÷ ÔÚÒ»¸ö·Ö²¼Ê½ÏµÍ³ÀҪµÃµ½Ò»¸ö¹ØÓÚÓû§²Ù×÷»áÓö೤ʱ¼ä¼°ÆäÔ­ÒòµÄ×ÜÌåÓ¡Ïó£¬ÊǸö¾Þ´óµÄÌôÕ½¡£ÏûϢϵÁÐͨ¹ýÏûÏ¢±»´¦ÀíµÄƵÂÊ£¬À´·½±ãµÄ¸¨ÖúÈ·¶¨ÄÇЩ±íÏÖ²»¼ÑµÄ´¦Àí¹ý³Ì»òÁìÓò£¬ÕâЩµØ·½µÄÊý¾ÝÁ÷¶¼²»¹»ÓÅ»¯¡£

Ò첽ͨÐÅ ºÜ¶àʱºò£¬Äã²»ÏëÒ²²»ÐèÒªÁ¢¼´´¦ÀíÏûÏ¢¡£ÏûÏ¢¶ÓÁÐÌṩÁËÒì²½´¦Àí»úÖÆ£¬ÔÊÐíÄã°ÑÒ»¸öÏûÏ¢·ÅÈë¶ÓÁУ¬µ«²¢²»Á¢¼´´¦ÀíËü¡£ÄãÏëÏò¶ÓÁÐÖзÅÈë¶àÉÙÏûÏ¢¾Í·Å¶àÉÙ£¬È»ºóÔÚÄãÀÖÒâµÄʱºòÔÙÈ¥´¦ÀíËüÃÇ¡£

³£ÓÃMessage Queue¶Ô±È

RabbitMQ RabbitMQÊÇʹÓÃErlang±àдµÄÒ»¸ö¿ªÔ´µÄÏûÏ¢¶ÓÁУ¬±¾ÉíÖ§³ÖºÜ¶àµÄЭÒ飺AMQP£¬XMPP, SMTP, STOMP£¬Ò²ÕýÒòÈç´Ë£¬Ëü·Ç³£ÖØÁ¿¼¶£¬¸üÊʺÏÓÚÆóÒµ¼¶µÄ¿ª·¢¡£Í¬Ê±ÊµÏÖÁËBroker¹¹¼Ü£¬ÕâÒâζ×ÅÏûÏ¢ÔÚ·¢Ë͸ø¿Í»§¶ËʱÏÈÔÚÖÐÐĶÓÁÐÅŶӡ£¶Ô·ÓÉ£¬¸ºÔؾùºâ»òÕßÊý¾Ý³Ö¾Ã»¯¶¼ÓкܺõÄÖ§³Ö¡£

Redis RedisÊÇÒ»¸ö»ùÓÚKey-Value¶ÔµÄNoSQLÊý¾Ý¿â£¬¿ª·¢Î¬»¤ºÜ»îÔ¾¡£ËäÈ»ËüÊÇÒ»¸öKey-ValueÊý¾Ý¿â´æ´¢ÏµÍ³£¬µ«Ëü±¾ÉíÖ§³ÖMQ¹¦ÄÜ£¬ËùÒÔÍêÈ«¿ÉÒÔµ±×öÒ»¸öÇáÁ¿¼¶µÄ¶ÓÁзþÎñÀ´Ê¹Ó᣶ÔÓÚRabbitMQºÍRedisµÄÈë¶ÓºÍ³ö¶Ó²Ù×÷£¬¸÷Ö´ÐÐ100Íò´Î£¬Ã¿10Íò´Î¼Ç¼һ´ÎÖ´ÐÐʱ¼ä¡£²âÊÔÊý¾Ý·ÖΪ128Bytes¡¢512Bytes¡¢1KºÍ10KËĸö²»Í¬´óСµÄÊý¾Ý¡£ÊµÑé±íÃ÷£ºÈë¶Óʱ£¬µ±Êý¾Ý±È½ÏСʱRedisµÄÐÔÄÜÒª¸ßÓÚRabbitMQ£¬¶øÈç¹ûÊý¾Ý´óС³¬¹ýÁË10K£¬RedisÔòÂýµÄÎÞ·¨ÈÌÊÜ£»³ö¶Óʱ£¬ÎÞÂÛÊý¾Ý´óС£¬Redis¶¼±íÏÖ³ö·Ç³£ºÃµÄÐÔÄÜ£¬¶øRabbitMQµÄ³ö¶ÓÐÔÄÜÔòÔ¶µÍÓÚRedis¡£

ZeroMQ ZeroMQºÅ³Æ×î¿ìµÄÏûÏ¢¶ÓÁÐϵͳ£¬ÓÈÆäÕë¶Ô´óÍÌÍÂÁ¿µÄÐèÇ󳡾°¡£ZMQÄܹ»ÊµÏÖRabbitMQ²»Éó¤µÄ¸ß¼¶/¸´ÔӵĶÓÁУ¬µ«ÊÇ¿ª·¢ÈËÔ±ÐèÒª×Ô¼º×éºÏ¶àÖÖ¼¼Êõ¿ò¼Ü£¬¼¼ÊõÉϵĸ´ÔÓ¶ÈÊǶÔÕâMQÄܹ»Ó¦Óóɹ¦µÄÌôÕ½¡£ZeroMQ¾ßÓÐÒ»¸ö¶ÀÌØµÄ·ÇÖмä¼þµÄģʽ£¬Äã²»ÐèÒª°²×°ºÍÔËÐÐÒ»¸öÏûÏ¢·þÎñÆ÷»òÖмä¼þ£¬ÒòΪÄãµÄÓ¦ÓóÌÐò½«°çÑÝÁËÕâ¸ö·þÎñ½ÇÉ«¡£ÄãÖ»ÐèÒª¼òµ¥µÄÒýÓÃZeroMQ³ÌÐò¿â£¬¿ÉÒÔʹÓÃNuGet°²×°£¬È»ºóÄã¾Í¿ÉÒÔÓä¿ìµÄÔÚÓ¦ÓóÌÐòÖ®¼ä·¢ËÍÏûÏ¢ÁË¡£µ«ÊÇZeroMQ½öÌṩ·Ç³Ö¾ÃÐԵĶÓÁУ¬Ò²¾ÍÊÇ˵Èç¹ûdown»ú£¬Êý¾Ý½«»á¶ªÊ§¡£ÆäÖУ¬TwitterµÄStormÖÐĬÈÏʹÓÃZeroMQ×÷ΪÊý¾ÝÁ÷µÄ´«Êä¡£

ActiveMQ ActiveMQÊÇApacheϵÄÒ»¸ö×ÓÏîÄ¿¡£ ÀàËÆÓÚZeroMQ£¬ËüÄܹ»ÒÔ´úÀíÈ˺͵ã¶ÔµãµÄ¼¼ÊõʵÏÖ¶ÓÁС£Í¬Ê±ÀàËÆÓÚRabbitMQ£¬ËüÉÙÁ¿´úÂë¾Í¿ÉÒÔ¸ßЧµØÊµÏָ߼¶Ó¦Óó¡¾°¡£

Kafka/Jafka KafkaÊÇApacheϵÄÒ»¸ö×ÓÏîÄ¿£¬ÊÇÒ»¸ö¸ßÐÔÄÜ¿çÓïÑÔ·Ö²¼Ê½Publish/SubscribeÏûÏ¢¶ÓÁÐϵͳ£¬¶øJafkaÊÇÔÚKafkaÖ®ÉÏ·õ»¯¶øÀ´µÄ£¬¼´KafkaµÄÒ»¸öÉý¼¶°æ¡£¾ßÓÐÒÔÏÂÌØÐÔ£º¿ìËٳ־û¯£¬¿ÉÒÔÔÚO(1)µÄϵͳ¿ªÏúϽøÐÐÏûÏ¢³Ö¾Ã»¯£»¸ßÍÌÍ£¬ÔÚһ̨ÆÕͨµÄ·þÎñÆ÷ÉϼȿÉÒÔ´ïµ½10W/sµÄÍÌÍÂËÙÂÊ£»ÍêÈ«µÄ·Ö²¼Ê½ÏµÍ³£¬Broker¡¢Producer¡¢Consumer¶¼Ô­Éú×Ô¶¯Ö§³Ö·Ö²¼Ê½£¬×Ô¶¯ÊµÏÖ¸´ÔÓ¾ùºâ£»Ö§³ÖHadoopÊý¾Ý²¢ÐмÓÔØ£¬¶ÔÓÚÏñHadoopµÄÒ»ÑùµÄÈÕÖ¾Êý¾ÝºÍÀëÏß·ÖÎöϵͳ£¬µ«ÓÖÒªÇóʵʱ´¦ÀíµÄÏÞÖÆ£¬ÕâÊÇÒ»¸ö¿ÉÐеĽâ¾ö·½°¸¡£Kafkaͨ¹ýHadoopµÄ²¢ÐмÓÔØ»úÖÆÀ´Í³Ò»ÁËÔÚÏߺÍÀëÏßµÄÏûÏ¢´¦Àí£¬ÕâÒ»µãÒ²ÊDZ¾¿ÎÌâËùÑо¿ÏµÍ³Ëù¿´Öصġ£Apache KafkaÏà¶ÔÓÚActiveMQÊÇÒ»¸ö·Ç³£ÇáÁ¿¼¶µÄÏûϢϵͳ£¬³ýÁËÐÔÄܷdz£ºÃÖ®Í⣬»¹ÊÇÒ»¸ö¹¤×÷Á¼ºÃµÄ·Ö²¼Ê½ÏµÍ³¡£

Kafka½âÎö

Terminology

Broker Kafka¼¯Èº°üº¬Ò»¸ö»ò¶à¸ö·þÎñÆ÷£¬ÕâÖÖ·þÎñÆ÷±»³ÆÎªbroker

Topic ÿÌõ·¢²¼µ½Kafka¼¯ÈºµÄÏûÏ¢¶¼ÓÐÒ»¸öÀà±ð£¬Õâ¸öÀà±ð±»³ÆÎªtopic¡££¨ÎïÀíÉϲ»Í¬topicµÄÏûÏ¢·Ö¿ª´æ´¢£¬Âß¼­ÉÏÒ»¸ötopicµÄÏûÏ¢ËäÈ»±£´æÓÚÒ»¸ö»ò¶à¸öbrokerÉϵ«Óû§Ö»ÐèÖ¸¶¨ÏûÏ¢µÄtopic¼´¿ÉÉú²ú»òÏû·ÑÊý¾Ý¶ø²»±Ø¹ØÐÄÊý¾Ý´æÓں䦣©

Partition paritionÊÇÎïÀíÉϵĸÅÄÿ¸ötopic°üº¬Ò»¸ö»ò¶à¸öpartition£¬´´½¨topicʱ¿ÉÖ¸¶¨paritionÊýÁ¿¡£Ã¿¸öpartition¶ÔÓ¦ÓÚÒ»¸öÎļþ¼Ð£¬¸ÃÎļþ¼ÐÏ´洢¸ÃpartitionµÄÊý¾ÝºÍË÷ÒýÎļþ

Producer ¸ºÔð·¢²¼ÏûÏ¢µ½Kafka broker

Consumer Ïû·ÑÏûÏ¢¡£Ã¿¸öconsumerÊôÓÚÒ»¸öÌØ¶¨µÄconsuer group£¨¿ÉΪÿ¸öconsumerÖ¸¶¨group name£¬Èô²»Ö¸¶¨group nameÔòÊôÓÚĬÈϵÄgroup£©¡£Ê¹ÓÃconsumer high level APIʱ£¬Í¬Ò»topicµÄÒ»ÌõÏûÏ¢Ö»Äܱ»Í¬Ò»¸öconsumer groupÄÚµÄÒ»¸öconsumerÏû·Ñ£¬µ«¶à¸öconsumer group¿ÉͬʱÏû·ÑÕâÒ»ÏûÏ¢¡£

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

Push vs. Pull

×÷Ϊһ¸ömessaging system£¬Kafka×ñÑ­ÁË´«Í³µÄ·½Ê½£¬Ñ¡ÔñÓÉproducerÏòbroker pushÏûÏ¢²¢ÓÉconsumer´Óbroker pullÏûÏ¢¡£Ò»Ð©logging-centric system£¬±ÈÈçFacebookµÄ Scribe ºÍClouderaµÄFlume ,²ÉÓ÷dz£²»Í¬µÄpushģʽ¡£ÊÂʵÉÏ£¬pushģʽºÍpullģʽ¸÷ÓÐÓÅÁÓ¡£

pushģʽºÜÄÑÊÊÓ¦Ïû·ÑËÙÂʲ»Í¬µÄÏû·ÑÕߣ¬ÒòΪÏûÏ¢·¢ËÍËÙÂÊÊÇÓÉbroker¾ö¶¨µÄ¡£pushģʽµÄÄ¿±êÊǾ¡¿ÉÄÜÒÔ×î¿ìËÙ¶È´«µÝÏûÏ¢£¬µ«ÊÇÕâÑùºÜÈÝÒ×Ôì³ÉconsumerÀ´²»¼°´¦ÀíÏûÏ¢£¬µäÐ͵ıíÏÖ¾ÍÊǾܾø·þÎñÒÔ¼°ÍøÂçÓµÈû¡£¶øpullģʽÔò¿ÉÒÔ¸ù¾ÝconsumerµÄÏû·ÑÄÜÁ¦ÒÔÊʵ±µÄËÙÂÊÏû·ÑÏûÏ¢¡£

Topic & Partition

TopicÔÚÂß¼­ÉÏ¿ÉÒÔ±»ÈÏΪÊÇÒ»¸öÔÚµÄqueue£¬Ã¿ÌõÏû·Ñ¶¼±ØÐëÖ¸¶¨ËüµÄtopic£¬¿ÉÒÔ¼òµ¥Àí½âΪ±ØÐëÖ¸Ã÷°ÑÕâÌõÏûÏ¢·Å½øÄĸöqueueÀΪÁËʹµÃKafkaµÄÍÌÍÂÂÊ¿ÉÒÔˮƽÀ©Õ¹£¬ÎïÀíÉϰÑtopic·Ö³ÉÒ»¸ö»ò¶à¸öpartition£¬Ã¿¸öpartitionÔÚÎïÀíÉ϶ÔÓ¦Ò»¸öÎļþ¼Ð£¬¸ÃÎļþ¼ÐÏ´洢Õâ¸öpartitionµÄËùÓÐÏûÏ¢ºÍË÷ÒýÎļþ¡£

ÿ¸öÈÕÖ¾Îļþ¶¼ÊÇ¡°log entries¡±ÐòÁУ¬Ã¿Ò»¸ö log entry

°üº¬Ò»¸ö4×Ö½ÚÕûÐÍÊý£¨ÖµÎªN£©£¬Æäºó¸úN¸ö×Ö½ÚµÄÏûÏ¢Ì塣ÿÌõÏûÏ¢¶¼ÓÐÒ»¸öµ±Ç°partitionÏÂΨһµÄ64×Ö½ÚµÄoffset£¬ËüÖ¸Ã÷ÁËÕâÌõÏûÏ¢µÄÆðʼλÖᣴÅÅÌÉÏ´æ´¢µÄÏû·Ñ¸ñʽÈçÏ£º

message length £º 4 bytes (value: 1+4+n)

¡°magic¡± value £º 1 byte

crc £º 4 bytes

payload £º n bytes

Õâ¸ö¡°log entries¡±²¢·ÇÓÉÒ»¸öÎļþ¹¹³É£¬¶øÊǷֳɶà¸ösegment£¬Ã¿¸ösegmentÃûΪ¸ÃsegmentµÚÒ»ÌõÏûÏ¢µÄoffsetºÍ¡°.kafka¡±×é³É¡£ÁíÍâ»áÓÐÒ»¸öË÷ÒýÎļþ£¬Ëü±êÃ÷ÁËÿ¸ösegmentϰüº¬µÄ log entry µÄoffset·¶Î§£¬ÈçÏÂͼËùʾ¡£

ÒòΪÿÌõÏûÏ¢¶¼±»appendµ½¸ÃpartitionÖУ¬ÊÇ˳Ðòд´ÅÅÌ£¬Òò´ËЧÂʷdz£¸ß£¨¾­ÑéÖ¤£¬Ë³Ðòд´ÅÅÌЧÂʱÈËæ»úдÄڴ滹Ҫ¸ß£¬ÕâÊÇKafka¸ßÍÌÍÂÂʵÄÒ»¸öºÜÖØÒªµÄ±£Ö¤£©¡£

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

ÔÚ·¢ËÍÒ»ÌõÏûϢʱ£¬¿ÉÒÔÖ¸¶¨ÕâÌõÏûÏ¢µÄkey£¬producer¸ù¾ÝÕâ¸ökeyºÍpartition»úÖÆÀ´ÅжϽ«ÕâÌõÏûÏ¢·¢Ë͵½Äĸöparition¡£paritition»úÖÆ¿ÉÒÔͨ¹ýÖ¸¶¨ producer µÄ paritition . class ÕâÒ»²ÎÊýÀ´Ö¸¶¨£¬¸Ãclass±ØÐëʵÏÖ kafka . producer . Partitioner ½Ó¿Ú¡£±¾ÀýÖÐÈç¹ûkey¿ÉÒÔ±»½âÎöΪÕûÊýÔò½«¶ÔÓ¦µÄÕûÊýÓëpartition×ÜÊýÈ¡Ó࣬¸ÃÏûÏ¢»á±»·¢Ë͵½¸ÃÊý¶ÔÓ¦µÄpartition¡££¨Ã¿¸öparition¶¼»áÓиöÐòºÅ£©

import kafka.producer.Partitioner;import kafka.utils.

VerifiableProperties;public class JasonPartitioner<T>

implements Partitioner { public JasonPartitioner(Ver

ifiableProperties verifiableProperties) {} @Override

public int partition(Object key, int numPartitions)

{ try { int partitionNum = Integer.parseInt((String)

key); return Math.abs(Integer.parseInt((String) key)

% numPartitions); } catch (Exception e) { return Math.

abs(key.hashCode() % numPartitions); } }}

Èç¹û½«ÉÏÀýÖеÄclass×÷Ϊpartition.class£¬²¢Í¨¹ýÈçÏ´úÂë·¢ËÍ20ÌõÏûÏ¢£¨key·Ö±ðΪ0£¬1£¬2£¬3£©ÖÁtopic2£¨°üº¬4¸öpartition£©¡£

public void sendMessage() throws InterruptedException{¡¡

¡¡for(int i = 1; i <= 5; i++){¡¡¡¡ List messageList = new

ArrayList<KeyedMessage<String, String>>();¡¡¡¡ for(int j = 0; j < 4; j++£©{¡¡¡¡ messageList.add(new KeyedMessage<String, String>("topic2",

j+"", "The " + i + " message for key " + j));¡¡¡¡ }¡¡¡¡ producer.send(messageList); }¡¡¡¡producer.close();}


ÔòkeyÏàͬµÄÏûÏ¢»á±»·¢ËͲ¢´æ´¢µ½Í¬Ò»¸öpartitionÀ¶øÇÒkeyµÄÐòºÅÕýºÃºÍpartitionÐòºÅÏàͬ¡££¨partitionÐòºÅ´Ó0¿ªÊ¼£¬±¾ÀýÖеÄkeyÒ²ÕýºÃ´Ó0¿ªÊ¼£©¡£ÈçÏÂͼËùʾ¡£

¶ÔÓÚ´«Í³µÄmessage queue¶øÑÔ£¬Ò»°ã»áɾ³ýÒѾ­±»Ïû·ÑµÄÏûÏ¢£¬¶øKafka¼¯Èº»á±£ÁôËùÓеÄÏûÏ¢£¬ÎÞÂÛÆä±»Ïû·ÑÓë·ñ¡£µ±È»£¬ÒòΪ´ÅÅÌÏÞÖÆ£¬²»¿ÉÄÜÓÀ¾Ã±£ÁôËùÓÐÊý¾Ý£¨Êµ¼ÊÉÏҲû±ØÒª£©£¬Òò´ËKafkaÌṩÁ½ÖÖ²ßÂÔȥɾ³ý¾ÉÊý¾Ý¡£Ò»ÊÇ»ùÓÚʱ¼ä£¬¶þÊÇ»ùÓÚpartitionÎļþ´óС¡£ÀýÈç¿ÉÒÔͨ¹ýÅäÖà $KAFKA_HOME / config / server . properties £¬Èà Kafka ɾ³ýÒ»ÖÜǰµÄÊý¾Ý£¬Ò²¿Éͨ¹ýÅäÖÃÈà Kafka ÔÚ partition Îļþ³¬¹ý1GBʱɾ³ý¾ÉÊý¾Ý£¬ÈçÏÂËùʾ¡£

ÕâÀïҪעÒ⣬ÒòΪKafka¶ÁÈ¡ÌØ¶¨ÏûÏ¢µÄʱ¼ä¸´ÔÓ¶ÈΪO(1)£¬¼´ÓëÎļþ´óСÎ޹أ¬ËùÒÔÕâÀïɾ³ýÎļþÓëKafkaÐÔÄÜÎ޹أ¬Ñ¡ÔñÔõÑùµÄɾ³ý²ßÂÔÖ»Óë´ÅÅÌÒÔ¼°¾ßÌåµÄÐèÇóÓйء£ÁíÍ⣬Kafka»áΪÿһ¸öconsumer group±£ÁôһЩmetadataÐÅÏ¢¡ªµ±Ç°Ïû·ÑµÄÏûÏ¢µÄposition£¬Ò²¼´offset¡£Õâ¸öoffsetÓÉconsumer¿ØÖÆ¡£Õý³£Çé¿öÏÂconsumer»áÔÚÏû·ÑÍêÒ»ÌõÏûÏ¢ºóÏßÐÔÔö¼ÓÕâ¸öoffset¡£µ±È»£¬consumerÒ²¿É½«offsetÉè³ÉÒ»¸ö½ÏСµÄÖµ£¬ÖØÐÂÏû·ÑһЩÏûÏ¢¡£ÒòΪoffetÓÉconsumer¿ØÖÆ£¬ËùÒÔKafka brokerÊÇÎÞ״̬µÄ£¬Ëü²»ÐèÒª±ê¼ÇÄÄЩÏûÏ¢±»ÄÄЩconsumer¹ý£¬²»ÐèҪͨ¹ýbrokerÈ¥±£Ö¤Í¬Ò»¸öconsumer groupÖ»ÓÐÒ»¸öconsumerÄÜÏû·ÑijһÌõÏûÏ¢£¬Òò´ËÒ²¾Í²»ÐèÒªËø»úÖÆ£¬ÕâҲΪKafkaµÄ¸ßÍÌÍÂÂÊÌṩÁËÓÐÁ¦±£ÕÏ¡£

Replication & Leader election

Kafka´Ó0.8¿ªÊ¼Ìṩpartition¼¶±ðµÄ replication£¬replic$KAFKA_HOME / config / server . properties ÖÐÅäÖá£

default.replication.factor = 1

¸Ã ReplicationÓëleader electionÅäºÏÌṩÁË×Ô¶¯µÄfailover»úÖÆ¡£replication¶ÔKafkaµÄÍÌÍÂÂÊÊÇÓÐÒ»¶¨Ó°ÏìµÄ£¬µ«¼«´óµÄÔöÇ¿ÁË¿ÉÓÃÐÔ¡£Ä¬ÈÏÇé¿öÏ£¬KafkaµÄreplicationÊýÁ¿Îª1¡£ ÿ¸öpartition¶¼ÓÐÒ»¸öΨһµÄleader£¬ËùÓеĶÁд²Ù×÷¶¼ÔÚleaderÉÏÍê³É£¬leaderÅúÁ¿´ÓleaderÉÏpullÊý¾Ý¡£Ò»°ãÇé¿öÏÂpartitionµÄÊýÁ¿´óÓÚµÈÓÚbrokerµÄÊýÁ¿£¬²¢ÇÒËùÓÐpartitionµÄleader¾ùÔÈ·Ö²¼ÔÚbrokerÉÏ¡£followerÉϵÄÈÕÖ¾ºÍÆäleaderÉϵÄÍêȫһÑù¡£

ºÍ´ó²¿·Ö·Ö²¼Ê½ÏµÍ³Ò»Ñù£¬Kakfa´¦Àíʧ°ÜÐèÒªÃ÷È·¶¨ÒåÒ»¸öbrokerÊÇ·ñalive¡£¶ÔÓÚKafka¶øÑÔ£¬Kafka´æ»î°üº¬Á½¸öÌõ¼þ£¬Ò»ÊÇËü±ØÐëά»¤ÓëZookeeperµÄsession(Õâ¸öͨ¹ýZookeeperµÄheartbeat»úÖÆÀ´ÊµÏÖ)¡£¶þÊÇfollower±ØÐëÄܹ»¼°Ê±½«leaderµÄwriting¸´ÖƹýÀ´£¬²»ÄÜ¡°ÂäºóÌ«¶à¡±¡£

leader»átrack¡°in sync¡±µÄnode list¡£Èç¹ûÒ»¸öfollowerå´»ú£¬»òÕßÂäºóÌ«¶à£¬leader½«°ÑËü´Ó¡±in sync¡± listÖÐÒÆ³ý¡£ÕâÀïËùÃèÊöµÄ¡°ÂäºóÌ«¶à¡±Ö¸follower¸´ÖƵÄÏûÏ¢ÂäºóÓÚleaderºóµÄÌõÊý³¬¹ýÔ¤¶¨Öµ£¬¸ÃÖµ¿ÉÔÚ $KAFKA_HOME/config/server.propertiesÖÐÅäÖÃ

ÐèҪ˵Ã÷µÄÊÇ£¬KafkaÖ»½â¾ö¡±fail/recover¡±£¬²»´¦Àí¡°Byzantine¡±£¨¡°°Ýռͥ¡±£©ÎÊÌâ¡£

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

À´ÉèÖá£ÕâÖÖ»úÖÆÈ·±£ÁËÖ»Òª¡°in sync¡± listÓÐÒ»¸ö»òÒÔÉϵÄflollower£¬Ò»Ìõ±»commitµÄÏûÏ¢¾Í²»»á¶ªÊ§¡£

ÕâÀïµÄ¸´ÖÆ»úÖÆ¼´²»ÊÇͬ²½¸´ÖÆ£¬Ò²²»Êǵ¥´¿µÄÒì²½¸´ÖÆ¡£ÊÂʵÉÏ£¬Í¬²½¸´ÖÆÒªÇó¡°»î×ŵġ±follower¶¼¸´ÖÆÍ꣬ÕâÌõÏûÏ¢²Å»á±»ÈÏΪcommit£¬ÕâÖÖ¸´ÖÆ·½Ê½¼«´óµÄÓ°ÏìÁËÍÌÍÂÂÊ£¨¸ßÍÌÍÂÂÊÊÇKafka·Ç³£ÖØÒªµÄÒ»¸öÌØÐÔ£©¡£¶øÒì²½¸´ÖÆ·½Ê½Ï£¬followerÒì²½µÄ´Óleader¸´ÖÆÊý¾Ý£¬Êý¾ÝÖ»Òª±»leaderдÈëlog¾Í±»ÈÏΪÒѾ­commit£¬ÕâÖÖÇé¿öÏÂÈç¹ûfollwer¶¼ÂäºóÓÚleader£¬¶øleaderͻȻ崻ú£¬Ôò»á¶ªÊ§Êý¾Ý¡£¶øKafkaµÄÕâÖÖʹÓá°in sync¡± listµÄ·½Ê½ÔòºÜºÃµÄ¾ùºâÁËÈ·±£Êý¾Ý²»¶ªÊ§ÒÔ¼°ÍÌÍÂÂÊ¡£follower¿ÉÒÔÅúÁ¿µÄ´Óleader¸´ÖÆÊý¾Ý£¬ÕâÑù¼«´óµÄÌá¸ß¸´ÖÆÐÔÄÜ£¨ÅúÁ¿Ð´´ÅÅÌ£©£¬¼«´ó¼õÉÙÁËfollowerÓëleaderµÄ²î¾à£¨Ç°ÎÄÓÐ˵µ½£¬Ö»ÒªfollowerÂäºóleader²»Ì«Ô¶£¬Ôò±»ÈÏΪÔÚ¡°in sync¡± listÀ¡£

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

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

ʵ¼ÊÉÏ£¬leader electionËã·¨·Ç³£¶à£¬±ÈÈçZookeperµÄ Zab , Raft ºÍ Viewstamped Replication¡£¶øKafkaËùʹÓõÄleader electionËã·¨¸üÏñ΢ÈíµÄ PacificA Ëã·¨¡£

KafkaÔÚZookeeperÖж¯Ì¬Î¬»¤ÁËÒ»¸öISR£¨in-sync replicas£© set£¬Õâ¸ösetÀïµÄËùÓÐreplica¶¼¸úÉÏÁËleader£¬Ö»ÓÐISRÀïµÄ³ÉÔ±²ÅÓб»Ñ¡ÎªleaderµÄ¿ÉÄÜ¡£ÔÚÕâÖÖģʽÏ£¬¶ÔÓÚf+1¸öreplica£¬Ò»¸öKafka topicÄÜÔÚ±£Ö¤²»¶ªÊ§ÒѾ­ommitµÄÏûÏ¢µÄǰÌáÏÂÈÝÈÌf¸öreplicaµÄʧ°Ü¡£ÔÚ´ó¶àÊýʹÓó¡¾°ÖУ¬ÕâÖÖģʽÊǷdz£ÓÐÀûµÄ¡£ÊÂʵÉÏ£¬ÎªÁËÈÝÈÌf¸öreplicaµÄʧ°Ü£¬majority voteºÍISRÔÚcommitǰÐèÒªµÈ´ýµÄreplicaÊýÁ¿ÊÇÒ»ÑùµÄ£¬µ«ÊÇISRÐèÒªµÄ×ܵÄreplicaµÄ¸öÊý¼¸ºõÊÇmajority voteµÄÒ»°ë¡£

ËäÈ»majority voteÓëISRÏà±ÈÓв»ÐèµÈ´ý×îÂýµÄserverÕâÒ»ÓÅÊÆ£¬µ«ÊÇKafka×÷ÕßÈÏΪKafka¿ÉÒÔͨ¹ýproducerÑ¡ÔñÊÇ·ñ±»commit×èÈûÀ´¸ÄÉÆÕâÒ»ÎÊÌ⣬²¢ÇÒ½ÚÊ¡ÏÂÀ´µÄreplicaºÍ´ÅÅÌʹµÃ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µÄÊý¾ÝÔ´£¨Ç°ÎÄÓÐ˵Ã÷£¬ËùÓжÁд¶¼ÓÉleaderÍê³É£©¡£Kafka0.8.ʹÓÃÁ˵ڶþÖÖ·½Ê½¡£¸ù¾ÝKafkaµÄÎĵµ£¬ÔÚÒÔºóµÄ°æ±¾ÖУ¬KafkaÖ§³ÖÓû§Í¨¹ýÅäÖÃÑ¡ÔñÕâÁ½ÖÖ·½Ê½ÖеÄÒ»ÖÖ£¬´Ó¶ø¸ù¾Ý²»Í¬µÄʹÓó¡¾°Ñ¡Ôñ¸ß¿ÉÓÃÐÔ»¹ÊÇǿһÖÂÐÔ¡£

ÉÏÎÄ˵Ã÷ÁËÒ»¸öparitionµÄreplication¹ý³Ì£¬È»¶ûKafka¼¯ÈºÐèÒª¹ÜÀí³É°ÙÉÏǧ¸öpartition£¬Kafkaͨ¹ýround-robinµÄ·½Ê½À´Æ½ºâpartition´Ó¶ø±ÜÃâ´óÁ¿partition¼¯ÖÐÔÚÁËÉÙÊý¼¸¸ö½ÚµãÉÏ¡£Í¬Ê±KafkaÒ²ÐèҪƽºâleaderµÄ·Ö²¼£¬¾¡¿ÉÄܵÄÈÃËùÓÐpartitionµÄleader¾ùÔÈ·Ö²¼ÔÚ²»Í¬brokerÉÏ¡£ÁíÒ»·½Ã棬ÓÅ»¯leadership electionµÄ¹ý³ÌÒ²ÊǺÜÖØÒªµÄ£¬±Ï¾¹Õâ¶Îʱ¼äÏàÓ¦µÄpartition´¦ÓÚ²»¿ÉÓÃ״̬¡£Ò»ÖÖ¼òµ¥µÄʵÏÖÊÇÔÝͣ崻úµÄbrokerÉϵÄËùÓÐpartition£¬²¢ÎªÖ®Ñ¡¾Ùleader¡£Êµ¼ÊÉÏ£¬KafkaÑ¡¾ÙÒ»¸öbroker×÷Ϊcontroller£¬Õâ¸öcontrollerͨ¹ýwatch Zookeeper¼ì²âËùÓеÄbroker failure£¬²¢¸ºÔðΪËùÓÐÊÜÓ°ÏìµÄparitionÑ¡¾Ùleader£¬ÔÙ½«ÏàÓ¦µÄleaderµ÷ÕûÃüÁî·¢ËÍÖÁÊÜÓ°ÏìµÄbroker£¬¹ý³ÌÈçÏÂͼËùʾ¡£

ÕâÑù×öµÄºÃ´¦ÊÇ£¬¿ÉÒÔÅúÁ¿µÄ֪ͨleadershipµÄ±ä»¯£¬´Ó¶øÊ¹µÃÑ¡¾Ù¹ý³Ì³É±¾¸üµÍ£¬ÓÈÆä¶Ô´óÁ¿µÄpartition¶øÑÔ¡£Èç¹ûcontrollerʧ°ÜÁË£¬ÐÒ´æµÄËùÓÐbroker¶¼»á³¢ÊÔÔÚZookeeperÖд´½¨/controller->{this broker id}£¬Èç¹û´´½¨³É¹¦£¨Ö»¿ÉÄÜÓÐÒ»¸ö´´½¨³É¹¦£©£¬Ôò¸Ãbroker»á³ÉΪcontroller£¬Èô´´½¨²»³É¹¦£¬Ôò¸Ãbroker»áµÈ´ýÐÂcontrollerµÄÃüÁî¡£

£¨±¾½ÚËùÓÐÃèÊö¶¼ÊÇ»ùÓÚconsumer hight level API¶ø·Çlow level API£©¡£

ÿһ¸öconsumerʵÀý¶¼ÊôÓÚÒ»¸öconsumer group£¬Ã¿Ò»ÌõÏûÏ¢Ö»»á±»Í¬Ò»¸öconsumer groupÀïµÄÒ»¸öconsumerʵÀýÏû·Ñ¡££¨²»Í¬consumer group¿ÉÒÔͬʱÏû·ÑͬһÌõÏûÏ¢£©

ºÜ¶à´«Í³µÄmessage queue¶¼»áÔÚÏûÏ¢±»Ïû·ÑÍêºó½«ÏûϢɾ³ý£¬Ò»·½Ãæ±ÜÃâÖØ¸´Ïû·Ñ£¬ÁíÒ»·½Ãæ¿ÉÒÔ±£Ö¤queueµÄ³¤¶È±È½ÏÉÙ£¬Ìá¸ßЧÂÊ¡£¶øÈçÉÏÎÄËù½«£¬Kafka²¢²»É¾³ýÒÑÏû·ÑµÄÏûÏ¢£¬ÎªÁËʵÏÖ´«Í³message queueÏûÏ¢Ö»±»Ïû·ÑÒ»´ÎµÄÓïÒ壬Kafka±£Ö¤±£Ö¤Í¬Ò»¸öconsumer groupÀïÖ»ÓÐÒ»¸öconsumer»áÏû·ÑÒ»ÌõÏûÏ¢¡£Ó봫ͳmessage queue²»Í¬µÄÊÇ£¬Kafka»¹ÔÊÐí²»Í¬consumer groupͬʱÏû·ÑͬһÌõÏûÏ¢£¬ÕâÒ»ÌØÐÔ¿ÉÒÔΪÏûÏ¢µÄ¶àÔª»¯´¦ÀíÌṩÁËÖ§³Ö¡£Êµ¼ÊÉÏ£¬KafkaµÄÉè¼ÆÀíÄîÖ®Ò»¾ÍÊÇͬʱÌṩÀëÏß´¦ÀíºÍʵʱ´¦Àí¡£¸ù¾ÝÕâÒ»ÌØÐÔ£¬¿ÉÒÔʹÓÃStormÕâÖÖʵʱÁ÷´¦Àíϵͳ¶ÔÏûÏ¢½øÐÐʵʱÔÚÏß´¦Àí£¬Í¬Ê±Ê¹ÓÃHadoopÕâÖÖÅú´¦Àíϵͳ½øÐÐÀëÏß´¦Àí£¬»¹¿ÉÒÔͬʱ½«Êý¾Ýʵʱ±¸·Ýµ½ÁíÒ»¸öÊý¾ÝÖÐÐÄ£¬Ö»ÐèÒª±£Ö¤ÕâÈý¸ö²Ù×÷ËùʹÓõÄconsumerÔÚ²»Í¬µÄconsumer group¼´¿É¡£ÏÂͼչʾÁËKafkaÔÚLinkedinµÄÒ»ÖÖ¼ò»¯²¿Êð¡£

ΪÁ˸üÇåÎúչʾKafka consumer groupµÄÌØÐÔ£¬±ÊÕß×÷ÁËÒ»Ïî²âÊÔ¡£´´½¨Ò»¸ötopic (ÃûΪtopic1)£¬´´½¨Ò»¸öÊôÓÚgroup1µÄconsumerʵÀý£¬²¢´´½¨Èý¸öÊôÓÚgroup2µÄconsumerʵÀý£¬È»ºóͨ¹ýproducerÏòtopic1·¢ËÍkey·Ö±ðΪ1£¬2£¬3rµÄÏûÏ¢¡£½á¹û·¢ÏÖÊôÓÚgroup1µÄconsumerÊÕµ½ÁËËùÓеÄÕâÈýÌõÏûÏ¢£¬Í¬Ê±group2ÖеÄ3¸öconsumer·Ö±ðÊÕµ½ÁËkeyΪ1£¬2£¬3µÄÏûÏ¢¡£ÈçÏÂͼËùʾ¡£

Consumer Rebalance

£¨±¾½ÚËù½²ÊöÄÚÈݾù»ùÓÚKafka consumer high level API£©

Kafka±£Ö¤Í¬Ò»consumer groupÖÐÖ»ÓÐÒ»¸öconsumer»áÏûϢijÌõÏûÏ¢£¬Êµ¼ÊÉÏ£¬Kafka±£Ö¤µÄÊÇÎȶ¨×´Ì¬ÏÂÿһ¸öconsumerʵÀýÖ»»áÏû·Ñijһ¸ö»ò¶à¸öÌØ¶¨partitionµÄÊý¾Ý£¬¶øÄ³¸öpartitionµÄÊý¾ÝÖ»»á±»Ä³Ò»¸öÌØ¶¨µÄconsumerʵÀýËùÏû·Ñ¡£ÕâÑùÉè¼ÆµÄÁÓÊÆÊÇÎÞ·¨ÈÃͬһ¸öconsumer groupÀïµÄconsumer¾ùÔÈÏû·ÑÊý¾Ý£¬ÓÅÊÆÊÇÿ¸öconsumer²»Óö¼¸ú´óÁ¿µÄbrokerͨÐÅ£¬¼õÉÙͨÐÅ¿ªÏú£¬Í¬Ê±Ò²½µµÍÁË·ÖÅäÄѶȣ¬ÊµÏÖÒ²¸ü¼òµ¥¡£ÁíÍ⣬ÒòΪͬһ¸öpartitionÀïµÄÊý¾ÝÊÇÓÐÐòµÄ£¬ÕâÖÖÉè¼Æ¿ÉÒÔ±£Ö¤Ã¿¸öpartitionÀïµÄÊý¾ÝÒ²ÊÇÓÐÐò±»Ïû·Ñ¡£

Èç¹ûijconsumer groupÖÐconsumerÊýÁ¿ÉÙÓÚpartitionÊýÁ¿£¬ÔòÖÁÉÙÓÐÒ»¸öconsumer»áÏû·Ñ¶à¸öpartitionµÄÊý¾Ý£¬Èç¹ûconsumerµÄÊýÁ¿ÓëpartitionÊýÁ¿Ïàͬ£¬ÔòÕýºÃÒ»¸öconsumerÏû·ÑÒ»¸öpartitionµÄÊý¾Ý£¬¶øÈç¹ûconsumerµÄÊýÁ¿¶àÓÚpartitionµÄÊýÁ¿Ê±£¬»áÓв¿·ÖconsumerÎÞ·¨Ïû·Ñ¸ÃtopicÏÂÈκÎÒ»ÌõÏûÏ¢¡£

ÈçÏÂÀýËùʾ£¬Èç¹ûtopic1ÓÐ0£¬1£¬2¹²Èý¸öpartition£¬µ±group1Ö»ÓÐÒ»¸öconsumer(ÃûΪconsumer1)ʱ£¬¸Ã consumer¿ÉÏû·ÑÕâ3¸öpartitionµÄËùÓÐÊý¾Ý¡£

Ôö¼ÓÒ»¸öconsumer(consumer2)ºó£¬ÆäÖÐÒ»¸öconsumer£¨consumer1£©¿ÉÏû·Ñ2¸öpartitionµÄÊý¾Ý£¬ÁíÍâÒ»¸öconsumer(consumer2)¿ÉÏû·ÑÁíÍâÒ»¸öpartitionµÄÊý¾Ý¡£

ÔÙÔö¼ÓÒ»¸öconsumer(consumer3)ºó£¬Ã¿¸öconsumer¿ÉÏû·ÑÒ»¸öpartitionµÄÊý¾Ý¡£consumer1Ïû·Ñpartition0£¬consumer2Ïû·Ñpartition1£¬consumer3Ïû·Ñpartition2

ÔÙÔö¼ÓÒ»¸öconsumer£¨consumer4£©ºó£¬ÆäÖÐ3¸öconsumer¿É·Ö±ðÏû·ÑÒ»¸öpartitionµÄÊý¾Ý£¬ÁíÍâÒ»¸öconsumer£¨consumer4£©²»ÄÜÏû·Ñtopic1ÈκÎÊý¾Ý¡£

´Ëʱ¹Ø±Õconsumer1£¬Ê£ÏµÄconsumer¿É·Ö±ðÏû·ÑÒ»¸öpartitionµÄÊý¾Ý¡£

[ͼƬÉÏ´«ÖС£¡£¡££¨15£©]½Ó׏رÕconsumer2£¬Ê£ÏµÄconsumer3¿ÉÏû·Ñ2¸öpartition£¬consumer4¿ÉÏû·Ñ1¸öpartition¡£

ÔٹرÕconsumer3£¬Ê£ÏµÄconsumer4¿ÉͬʱÏû·Ñtopic1µÄ3¸öpartition¡£

[ͼƬÉÏ´«ÖС£¡£¡££¨17£©]

consumer rebalanceËã·¨ÈçÏ£º

Sort PT (all partitions in topic T)
Sort CG(all consumers in consumer group G)
Let i be the index position of Ci in CG and let N=size(PT)/size(CG)
Remove current entries owned by Ci from the partition owner registry
Assign partitions from i N to (i+1)* N-1 to consumer Ci
Add newly assigned partitions to the partition owner registry

Ŀǰconsumer rebalanceµÄ¿ØÖƲßÂÔÊÇÓÉÿһ¸öconsumerͨ¹ýZookeeperÍê³ÉµÄ¡£¾ßÌåµÄ¿ØÖÆ·½Ê½ÈçÏ£º

Register itself in the consumer id registry under its group.
Register a watch on changes under the consumer id registry.
Register a watch on changes under the broker id registry.
If the consumer creates a message stream using a topic filter, it also registers a watch on changes under the broker topic registry.
Force itself to rebalance within in its consumer group.

ÔÚÕâÖÖ²ßÂÔÏ£¬Ã¿Ò»¸öconsumer»òÕßbrokerµÄÔö¼Ó»òÕß¼õÉÙ¶¼»á´¥·¢consumer rebalance¡£ÒòΪÿ¸öconsumerÖ»¸ºÔðµ÷Õû×Ô¼ºËùÏû·ÑµÄpartition£¬ÎªÁ˱£Ö¤Õû¸öconsumer groupµÄÒ»ÖÂÐÔ£¬ËùÒÔµ±Ò»¸öconsumer´¥·¢ÁËrebalanceʱ£¬¸Ãconsumer groupÄ򵀮äËüËùÓÐconsumerÒ²Ó¦¸Ãͬʱ´¥·¢rebalance¡£

Ŀǰ£¨2015-01-19£©×îа棨0.8.2£©Kafka²ÉÓõÄÊÇÉÏÊö·½Ê½¡£µ«¸Ã·½Ê½Óв»ÀûµÄ·½Ã棺

Herd effect ÈκÎbroker»òÕßconsumerµÄÔö¼õ¶¼»á´¥·¢ËùÓеÄconsumerµÄrebalance

Split Brain ÿ¸öconsumer·Ö±ðµ¥¶Àͨ¹ýZookeeperÅжÏÄÄЩ partition downÁË£¬ÄÇô²»Í¬consumer´ÓZookeeper¡°¿´¡±µ½µÄview¾Í¿ÉÄܲ»Ò»Ñù£¬Õâ¾Í»áÔì³É´íÎóµÄreblance³¢ÊÔ¡£¶øÇÒÓпÉÄÜËùÓеÄconsumer¶¼ÈÏΪrebalanceÒѾ­Íê³ÉÁË£¬µ«Êµ¼ÊÉÏ¿ÉÄܲ¢·ÇÈç´Ë¡£

¸ù¾ÝKafka¹Ù·½Îĵµ£¬Kafka×÷ÕßÕýÔÚ¿¼ÂÇÔÚ»¹Î´·¢²¼µÄ 0.9.x°æ±¾ÖÐʹÓÃÖÐÐÄЭµ÷Æ÷(coordinator) ¡£´óÌå˼ÏëÊÇÑ¡¾Ù³öÒ»¸öbroker×÷Ϊcoordinator£¬ÓÉËüwatch Zookeeper£¬´Ó¶øÅжÏÊÇ·ñÓÐpartition»òÕßconsumerµÄÔö¼õ£¬È»ºóÉú³ÉrebalanceÃüÁ²¢¼ì²éÊÇ·ñÕâЩrebalanceÔÚËùÓÐÏà¹ØµÄconsumerÖб»Ö´Ðгɹ¦£¬Èç¹û²»³É¹¦ÔòÖØÊÔ£¬Èô³É¹¦ÔòÈÏΪ´Ë´Îrebalance³É¹¦£¨Õâ¸ö¹ý³Ì¸úreplication controller·Ç³£ÀàËÆ£¬ËùÒÔÎ񼆮æ¹ÖΪʲôµ±³õÉè¼Æreplication controllerʱûÓÐʹÓÃÀàËÆ·½Ê½À´½â¾öconsumer rebalanceµÄÎÊÌ⣩¡£Á÷³ÌÈçÏ£º

[ͼƬÉÏ´«ÖС£¡£¡££¨18£©]

ÏûÏ¢Deliver guarantee

ͨ¹ýÉÏÎĽéÉÜ£¬Ïë±Ø¶ÁÕßÒѾ­Ã÷ÌìÁËproducerºÍconsumerÊÇÈçºÎ¹¤×÷µÄ£¬ÒÔ¼°KafkaÊÇÈçºÎ×öreplicationµÄ£¬½ÓÏÂÀ´ÒªÌÖÂÛµÄÊÇKafkaÈçºÎÈ·±£ÏûÏ¢ÔÚproducerºÍconsumerÖ®¼ä´«Êä¡£ÓÐÕâô¼¸ÖÖ¿ÉÄܵÄdelivery guarantee£º

At most once

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

At least one

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

Exactly once

ÿÌõÏûÏ¢¿Ï¶¨»á±»´«ÊäÒ»´ÎÇÒ½ö´«ÊäÒ»´Î£¬ºÜ¶àʱºòÕâÊÇÓû§ËùÏëÒªµÄ¡£KafkaµÄdelivery guarantee semantic·Ç³£Ö±½Ó¡£µ±producerÏòbroker·¢ËÍÏûϢʱ£¬Ò»µ©ÕâÌõÏûÏ¢±»commit£¬ÒòÊýreplicationµÄ´æÔÚ£¬Ëü¾Í²»»á¶ª¡£µ«ÊÇÈç¹ûproducer·¢ËÍÊý¾Ý¸øbrokerºó£¬Óöµ½µÄÍøÂçÎÊÌâ¶øÔì³ÉͨÐÅÖжϣ¬ÄÇproducer¾ÍÎÞ·¨ÅжϸÃÌõÏûÏ¢ÊÇ·ñÒѾ­commit¡£ÕâÒ»µãÓеãÏñÏòÒ»¸ö×Ô¶¯Éú³Éprimary keyµÄÊý¾Ý¿â±íÖвåÈëÊý¾Ý¡£ËäÈ»KafkaÎÞ·¨È·¶¨ÍøÂç¹ÊÕÏÆÚ¼ä·¢ÉúÁËʲô£¬µ«ÊÇproducer¿ÉÒÔÉú³ÉÒ»ÖÖÀàËÆÓÚprimary keyµÄ¶«Î÷£¬·¢Éú¹ÊÕÏʱÃݵÈÐÔµÄretry¶à´Î£¬ÕâÑù¾Í×öµ½ÁË Exactly one

¡£½ØÖ¹µ½Ä¿Ç°(Kafka 0.8.2°æ±¾£¬2015-01-25)£¬ÕâÒ»feature»¹²¢Î´ÊµÏÖ£¬ÓÐÏ£ÍûÔÚKafkaδÀ´µÄ°æ±¾ÖÐʵÏÖ¡££¨ËùÒÔĿǰĬÈÏÇé¿öÏÂÒ»ÌõÏûÏ¢´ÓproducerºÍbrokerÊÇÈ·±£ÁË At least once

£¬µ«¿Éͨ¹ýÉèÖÃproducerÒì²½·¢ËÍʵÏÖ At most once

£©¡£

½ÓÏÂÀ´ÌÖÂÛµÄÊÇÏûÏ¢´Óbrokerµ½consumerµÄdelivery guarantee semantic¡££¨½öÕë¶ÔKafka consumer high level API£©¡£consumerÔÚ´Óbroker¶ÁÈ¡ÏûÏ¢ºó£¬¿ÉÒÔÑ¡Ôñcommit£¬¸Ã²Ù×÷»áÔÚZookeeperÖдæÏ¸ÃconsumerÔÚ¸Ãpartition϶ÁÈ¡µÄÏûÏ¢µÄoffset¡£¸ÃconsumerÏÂÒ»´ÎÔÙ¶Á¸Ãpartitionʱ»á´ÓÏÂÒ»Ìõ¿ªÊ¼¶ÁÈ¡¡£Èçδcommit£¬ÏÂÒ»´Î¶ÁÈ¡µÄ¿ªÊ¼Î»Öûá¸úÉÏÒ»´ÎcommitÖ®ºóµÄ¿ªÊ¼Î»ÖÃÏàͬ¡£µ±È»¿ÉÒÔ½«consumerÉèÖÃΪautocommit£¬¼´consumerÒ»µ©¶Áµ½Êý¾ÝÁ¢¼´×Ô¶¯commit¡£Èç¹ûÖ»ÌÖÂÛÕâÒ»¶ÁÈ¡ÏûÏ¢µÄ¹ý³Ì£¬ÄÇKafkaÊÇÈ·±£ÁË Exactly once

¡£µ«Êµ¼ÊÉÏʵ¼ÊʹÓÃÖÐconsumer²¢·Ç¶ÁÈ¡ÍêÊý¾Ý¾Í½áÊøÁË£¬¶øÊÇÒª½øÐнøÒ»²½´¦Àí£¬¶øÊý¾Ý´¦ÀíÓëcommitµÄ˳ÐòÔںܴó³Ì¶ÈÉϾö¶¨ÁËÏûÏ¢´ÓbrokerºÍconsumerµÄdelivery guarantee semantic¡£

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

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

¡£ÔںܶàÇé¿öʹÓó¡¾°Ï£¬ÏûÏ¢¶¼ÓÐÒ»¸öprimary key£¬ËùÒÔÏûÏ¢µÄ´¦ÀíÍùÍù¾ßÓÐÃݵÈÐÔ£¬¼´¶à´Î´¦ÀíÕâÒ»ÌõÏûÏ¢¸úÖ»´¦ÀíÒ»´ÎÊǵÈЧµÄ£¬ÄǾͿÉÒÔÈÏΪÊÇ Exactly once

¡££¨È˸ö¸Ð¾õÕâÖÖ˵·¨ÓÐЩǣǿ£¬±Ï¾¹Ëü²»ÊÇKafka±¾ÉíÌṩµÄ»úÖÆ£¬¶øÇÒprimary key±¾Éí²»±£Ö¤²Ù×÷µÄÃݵÈÐÔ¡£¶øÇÒʵ¼ÊÉÏÎÒÃÇ˵delivery guarantee semanticÊÇÌÖÂÛ±»´¦Àí¶àÉٴΣ¬¶ø·Ç´¦Àí½á¹ûÔõÑù£¬ÒòΪ´¦Àí·½Ê½¶àÖÖ¶àÑù£¬ÎÒÃǵÄϵͳ²»Ó¦¸Ã°Ñ´¦Àí¹ý³ÌµÄÌØÐÔ¡ªÈçÊÇ·ñÃݵÈÐÔ£¬µ±³ÉKafka±¾ÉíµÄfeature£©

Èç¹ûÒ»¶¨Òª×öµ½ Exactly once

£¬¾ÍÐèҪЭµ÷offsetºÍʵ¼Ê²Ù×÷µÄÊä³ö¡£¾«µäµÄ×ö·¨ÊÇÒýÈëÁ½½×¶ÎÌá½»¡£Èç¹ûÄÜÈÃoffsetºÍ²Ù×÷ÊäÈë´æÔÚͬһ¸öµØ·½£¬»á¸ü¼ò½àºÍͨÓá£ÕâÖÖ·½Ê½¿ÉÄܸüºÃ£¬ÒòΪÐí¶àÊä³öϵͳ¿ÉÄܲ»Ö§³ÖÁ½½×¶ÎÌá½»¡£±ÈÈ磬consumerÄõ½Êý¾Ýºó¿ÉÄܰÑÊý¾Ý·Åµ½HDFS£¬Èç¹û°Ñ×îеÄoffsetºÍÊý¾Ý±¾ÉíÒ»Æðдµ½HDFS£¬ÄǾͿÉÒÔ±£Ö¤Êý¾ÝµÄÊä³öºÍoffsetµÄ¸üÐÂҪô¶¼Íê³É£¬ÒªÃ´¶¼²»Íê³É£¬¼ä½ÓʵÏÖ Exactly once

¡££¨Ä¿Ç°¾Íhigh level API¶øÑÔ£¬offsetÊÇ´æÓÚZookeeperÖеģ¬ÎÞ·¨´æÓÚHDFS£¬¶ølow level APIµÄoffsetÊÇÓÉ×Ô¼ºÈ¥Î¬»¤µÄ£¬¿ÉÒÔ½«Ö®´æÓÚHDFSÖУ© ×ÜÖ®£¬KafkaĬÈϱ£Ö¤ At least once

£¬²¢ÇÒÔÊÐíͨ¹ýÉèÖÃproducerÒì²½Ìá½»À´ÊµÏÖ At most once

¡£¶ø Exactly once

ÒªÇóÓëÄ¿±ê´æ´¢ÏµÍ³Ð­×÷£¬ÐÒÔ˵ÄÊÇKafkaÌṩµÄoffset¿ÉÒÔʹÓÃÕâÖÖ·½Ê½·Ç³£Ö±½Ó·Ç³£ÈÝÒס£

Benchmark

Ö½ÉϵÃÀ´ÖÕ¾õdz£¬¾øÖªÐ©ÊÂÒª¹ªÐС£±ÊÕßÏ£ÍûÄÜÇ××Ô²âÒ»ÏÂKafkaµÄÐÔÄÜ£¬¶ø·Ç´ÓÍøÉÏÕÒһЩ²âÊÔÊý¾Ý¡£ËùÒÔ±ÊÕßÔøÔÚ0.8·¢²¼Ç°Á½¸öÔÂ×ö¹ýÏêϸµÄKafka0.8ÐÔÄܲâÊÔ£¬²»¹ýºÜ¿Éϧ²âÊÔ±¨¸æ²»É÷¶ªÊ§¡£ËùÐÒÔÚÍøÉÏÕÒµ½ÁËKafkaµÄ´´Ê¼ÈËÖ®Ò»µÄ Jay KrepsµÄbechmark ¡£ÒÔÏÂÃèÊö½Ô»ùÓÚ¸Ãbenchmark¡££¨¸Ãbenchmark»ùÓÚKafka0.8.1£©

²âÊÔ»·¾³

¸ÃbenchmarkÓõ½ÁËÁų̀»úÆ÷£¬»úÆ÷ÅäÖÃÈçÏÂ

Intel Xeon 2.5 GHz processor with six cores

Six 7200 RPM SATA drives

32GB of RAM

1Gb Ethernet

Õâ6̨»úÆ÷ÆäÖÐ3̨ÓÃÀ´´î½¨Kafka broker¼¯Èº£¬ÁíÍâ3̨ÓÃÀ´°²×°Zookeeper¼°Éú³É²âÊÔÊý¾Ý¡£6¸ödrive¶¼Ö±½ÓÒÔ·ÇRAID·½Ê½¹ÒÔØ¡£Êµ¼ÊÉÏkafka¶Ô»úÆ÷µÄÐèÇóÓëHadoopµÄÀàËÆ¡£

producerÍÌÍÂÂÊ

¸ÃÏî²âÊÔÖ»²âproducerµÄÍÌÍÂÂÊ£¬Ò²¾ÍÊÇÊý¾ÝÖ»±»³Ö¾Ã»¯£¬Ã»ÓÐconsumer¶ÁÊý¾Ý¡£

1¸öproducerỊ̈߳¬ÎÞreplication

ÔÚÕâÒ»²âÊÔÖУ¬´´½¨ÁËÒ»¸ö°üº¬6¸öpartitionÇÒûÓÐreplicationµÄtopic¡£È»ºóͨ¹ýÒ»¸öÏ߳̾¡¿ÉÄÜ¿ìµÄÉú³É50 millionÌõ±È½Ï¶Ì£¨payload100×Ö½Ú³¤£©µÄÏûÏ¢¡£²âÊÔ½á¹ûÊÇ 821,557 records/second£¨ 78.3MB/second £©¡£

Ö®ËùÒÔʹÓöÌÏûÏ¢£¬ÊÇÒòΪ¶ÔÓÚÏûϢϵͳÀ´ËµÕâÖÖʹÓó¡¾°¸üÄÑ¡£ÒòΪÈç¹ûʹÓÃMB/secondÀ´±íÕ÷ÍÌÍÂÂÊ£¬ÄÇ·¢Ëͳ¤ÏûÏ¢ÎÞÒÉÄÜʹµÃ²âÊÔ½á¹û¸üºÃ¡£

Õû¸ö²âÊÔÖУ¬¶¼ÊÇÓÃÿÃëÖÓdeliveryµÄÏûÏ¢µÄÊýÁ¿³ËÒÔpayloadµÄ³¤¶ÈÀ´¼ÆËãMB/secondµÄ£¬Ã»ÓаÑÏûÏ¢µÄÔªÐÅÏ¢ËãÔÚÄÚ£¬ËùÒÔʵ¼ÊµÄÍøÂçʹÓÃÁ¿»á±ÈÕâ¸ö´ó¡£¶ÔÓÚ±¾²âÊÔÀ´Ëµ£¬Ã¿´Î»¹Ðè´«Êä¶îÍâµÄ22¸ö×Ö½Ú£¬°üÀ¨Ò»¸ö¿ÉÑ¡µÄkey£¬ÏûÏ¢³¤¶ÈÃèÊö£¬CRCµÈ¡£ÁíÍ⣬»¹°üº¬Ò»Ð©ÇëÇóÏà¹ØµÄoverhead£¬±ÈÈç topic £¬ partition£¬acknowledgementµÈ¡£Õâ¾Íµ¼ÖÂÎÒÃDZȽÏÄÑÅжÏÊÇ·ñÒѾ­´ïµ½Íø¿¨¼«ÏÞ£¬µ«ÊǰÑÕâЩoverhead¶¼ËãÔÚÍÌÍÂÂÊÀïÃæÓ¦¸Ã¸üºÏÀíһЩ¡£Òò´Ë£¬ÎÒÃÇÒѾ­»ù±¾´ïµ½ÁËÍø¿¨µÄ¼«ÏÞ¡£

³õ²½¹Û²ì´Ë½á¹û»áÈÏΪËü±ÈÈËÃÇËùÔ¤ÆÚµÄÒª¸ßºÜ¶à£¬ÓÈÆäµ±¿¼Âǵ½KafkaÒª°ÑÊý¾Ý³Ö¾Ã»¯µ½´ÅÅ̵±ÖС£Êµ¼ÊÉÏ£¬Èç¹ûʹÓÃËæ»ú·ÃÎÊÊý¾Ýϵͳ£¬±ÈÈçRDBMS£¬»òÕßkey-velue store£¬¿ÉÔ¤ÆÚµÄ×î¸ß·ÃÎÊÆµÂÊ´ó¸ÅÊÇ5000µ½50000¸öÇëÇóÿÃ룬ÕâºÍÒ»¸öºÃµÄRPC²ãËùÄܽÓÊܵÄÔ¶³ÌÇëÇóÁ¿²î²»¶à¡£¶ø¸Ã²âÊÔÖÐÔ¶³¬Óڴ˵ÄÔ­ÒòÓÐÁ½¸ö¡£

KafkaÈ·±£Ð´´ÅÅ̵Ĺý³ÌÊÇÏßÐÔ´ÅÅÌI/O£¬²âÊÔÖÐʹÓõÄ6¿éÁ®¼Û´ÅÅÌÏßÐÔI/OµÄ×î´óÍÌÍÂÁ¿ÊÇ822MB/second£¬ÕâÒѾ­Ô¶´óÓÚ1GbÍø¿¨ËùÄÜ´øÀ´µÄÍÌÍÂÁ¿ÁË¡£Ðí¶àÏûϢϵͳ°ÑÊý¾Ý³Ö¾Ã»¯µ½´ÅÅ̵±³ÉÊÇÒ»¸ö¿ªÏúºÜ´óµÄÊÂÇ飬ÕâÊÇÒòΪËûÃǶԴÅÅ̵IJÙ×÷¶¼²»ÊÇÏßÐÔI/O¡£

ÔÚÿһ¸ö½×¶Î£¬Kafka¶¼¾¡Á¿Ê¹ÓÃÅúÁ¿´¦Àí¡£Èç¹ûÏëÁ˽âÅú´¦ÀíÔÚI/O²Ù×÷ÖеÄÖØÒªÐÔ£¬¿ÉÒԲο¼David PattersonµÄ¡± Latency Lags Bandwidth ¡°

1¸öproducerỊ̈߳¬3¸öÒì²½replication

¸ÃÏî²âÊÔÓëÉÏÒ»²âÊÔ»ù±¾Ò»Ñù£¬Î¨Ò»µÄÇø±ðÊÇÿ¸öpartitionÓÐ3¸öreplica£¨ËùÒÔÍøÂç´«ÊäµÄºÍдÈë´ÅÅ̵Ä×ܵÄÊý¾ÝÁ¿Ôö¼ÓÁË3±¶£©¡£Ã¿Ò»¸öbroker¼´ÒªÐ´×÷ΪleaderµÄ partition £¬Ò²Òª¶Á£¨´Óleader¶ÁÊý¾Ý£©Ð´£¨½«Êý¾Ýдµ½´ÅÅÌ£©×÷ΪfollowerµÄ partition ¡£²âÊÔ½á¹ûΪ 786,980 records/second £¨75.1MB/second £©¡£

¸ÃÏî²âÊÔÖÐreplicationÊÇÒì²½µÄ£¬Ò²¾ÍÊÇ˵brokerÊÕµ½Êý¾Ý²¢Ð´Èë±¾µØ´ÅÅ̺ó¾Íacknowledge producer£¬¶ø²»±ØµÈËùÓÐreplica¶¼Íê³Éreplication¡£Ò²¾ÍÊÇ˵£¬Èç¹ûleader crashÁË£¬¿ÉÄܻᶪµôһЩ×îÐµĻ¹Î´±¸·ÝµÄÊý¾Ý¡£µ«ÕâÒ²»áÈÃmessage acknowledgementÑÓ³Ù¸üÉÙ£¬ÊµÊ±ÐÔ¸üºÃ¡£

ÕâÏî²âÊÔ˵Ã÷£¬replication¿ÉÒԺܿ졣Õû¸ö¼¯ÈºµÄдÄÜÁ¦¿ÉÄÜ»áÓÉÓÚ3±¶µÄreplication¶øÖ»ÓÐÔ­À´µÄÈý·ÖÖ®Ò»£¬µ«ÊǶÔÓÚÿһ¸öproducerÀ´ËµÍÌÍÂÂÊÒÀÈ»×ã¹»ºÃ¡£

1¸öproducerỊ̈߳¬3¸öͬ²½replication

¸ÃÏî²âÊÔÓëÉÏÒ»²âÊÔµÄÎ¨Ò»Çø±ðÊÇreplicationÊÇͬ²½µÄ£¬Ã¿ÌõÏûÏ¢Ö»ÓÐÔÚ±» in sync

¼¯ºÏÀïµÄËùÓÐreplica¶¼¸´ÖƹýÈ¥ºó²Å»á±»ÖÃΪcommitted£¨´Ëʱbroker»áÏòproducer·¢ËÍacknowledgement£©¡£ÔÚÕâÖÖģʽÏ£¬Kafka¿ÉÒÔ±£Ö¤¼´Ê¹leader crashÁË£¬Ò²²»»áÓÐÊý¾Ý¶ªÊ§¡£²âÊÔ½á¹ûΪ 421,823 records/second £¨ 40.2MB/second £©¡£

Kafkaͬ²½¸´ÖÆÓëÒì²½¸´ÖƲ¢Ã»Óб¾ÖʵIJ»Í¬¡£leader»áʼÖÕtrack follower replica´Ó¶ø¼à¿ØËüÃÇÊÇ·ñ»¹alive£¬Ö»ÓÐËùÓÐ in sync

¼¯ºÏÀïµÄreplica¶¼acknowledgeµÄÏûÏ¢²Å¿ÉÄܱ»consumerËùÏû·Ñ¡£¶ø¶ÔfollowerµÄµÈ´ýÓ°ÏìÁËÍÌÍÂÂÊ¡£¿ÉÒÔͨ¹ýÔö´óbatch sizeÀ´¸ÄÉÆÕâÖÖÇé¿ö£¬µ«ÎªÁ˱ÜÃâÌØ¶¨µÄÓÅ»¯¶øÓ°Ïì²âÊÔ½á¹ûµÄ¿É±ÈÐÔ£¬±¾´Î²âÊÔ²¢Ã»ÓÐ×öÕâÖÖµ÷Õû¡£

3¸öproducer,3¸öÒì²½replication

¸Ã²âÊÔÏ൱ÓÚ°ÑÉÏÎÄÖеÄ1¸öproducer,¸´ÖƵ½ÁË3̨²»Í¬µÄ»úÆ÷ÉÏ£¨ÔÚ1̨»úÆ÷ÉÏÅܶà¸öʵÀý¶ÔÍÌÍÂÂʵÄÔö¼Ó²»»áÓÐÌ«´ó°ï棬ÒòÎªÍø¿¨ÒѾ­»ù±¾±¥ºÍÁË£©£¬Õâ3¸öproducerͬʱ·¢ËÍÊý¾Ý¡£Õû¸ö¼¯ÈºµÄÍÌÍÂÂÊΪ 2,024,032 records/second £¨ 193,0MB/second £©¡£

Producer Throughput Vs. Stored Data

ÏûϢϵͳµÄÒ»¸öDZÔÚµÄΣÏÕÊǵ±Êý¾ÝÄܶ¼´æÓÚÄÚ´æÊ±ÐÔÄܺܺ㬵«µ±Êý¾ÝÁ¿Ì«´óÎÞ·¨ÍêÈ«´æÓÚÄÚ´æÖÐʱ£¨È»ºóºÜ¶àÏûϢϵͳ¶¼»áɾ³ýÒѾ­±»Ïû·ÑµÄÊý¾Ý£¬µ«µ±Ïû·ÑËٶȱÈÉú²úËÙ¶ÈÂýʱ£¬ÈÔ»áÔì³ÉÊý¾ÝµÄ¶Ñ»ý£©£¬Êý¾Ý»á±»×ªÒƵ½´ÅÅÌ£¬´Ó¶øÊ¹µÃÍÌÍÂÂÊϽµ£¬ÕâÓÖ·´¹ýÀ´Ôì³ÉϵͳÎÞ·¨¼°Ê±½ÓÊÕÊý¾Ý¡£ÕâÑù¾Í·Ç³£Ôã¸â£¬¶øÊµ¼ÊÉϺܶàÇé¾°ÏÂʹÓÃqueueµÄÄ¿µÄ¾ÍÊǽâ¾öÊý¾ÝÏû·ÑËٶȺÍÉú²úËٶȲ»Ò»ÖµÄÎÊÌâ¡£

µ«Kafka²»´æÔÚÕâÒ»ÎÊÌ⣬ÒòΪKafkaʼÖÕÒÔO£¨1£©µÄʱ¼ä¸´ÔӶȽ«Êý¾Ý³Ö¾Ã»¯µ½´ÅÅÌ£¬ËùÒÔÆäÍÌÍÂÂʲ»ÊÜ´ÅÅÌÉÏËù´æ´¢µÄÊý¾ÝÁ¿µÄÓ°Ï졣ΪÁËÑéÖ¤ÕâÒ»ÌØÐÔ£¬×öÁËÒ»¸ö³¤Ê±¼äµÄ´óÊý¾ÝÁ¿µÄ²âÊÔ£¬ÏÂͼÊÇÍÌÍÂÂÊÓëÊý¾ÝÁ¿´óСµÄ¹ØÏµÍ¼¡£

[ͼƬÉÏ´«ÖС£¡£¡££¨19£©]ÉÏͼÖÐÓÐһЩvarianceµÄ´æÔÚ£¬²¢¿ÉÒÔÃ÷ÏÔ¿´µ½£¬ÍÌÍÂÂʲ¢²»ÊÜ´ÅÅÌÉÏËù´æÊý¾ÝÁ¿´óСµÄÓ°Ï졣ʵ¼ÊÉÏ´ÓÉÏͼ¿ÉÒÔ¿´µ½£¬µ±´ÅÅÌÊý¾ÝÁ¿´ïµ½1TBʱ£¬ÍÌÍÂÂʺʹÅÅÌÊý¾ÝÖ»Óм¸°ÙMBʱûÓÐÃ÷ÏÔÇø±ð¡£

Õâ¸övarianceÊÇÓÉLinux I/O¹ÜÀíÔì³ÉµÄ£¬Ëü»á°ÑÊý¾Ý»º´æÆðÀ´ÔÙÅúÁ¿flush¡£ÉÏͼµÄ²âÊÔ½á¹ûÊÇÔÚÉú²ú»·¾³ÖжÔKafka¼¯Èº×öÁËЩtuningºóµÃµ½µÄ£¬ÕâЩtuning·½·¨¿É²Î¿¼ ÕâÀï ¡£

consumerÍÌÍÂÂÊ

ÐèҪעÒâµÄÊÇ£¬replication factor²¢²»»áÓ°ÏìconsumerµÄÍÌÍÂÂʲâÊÔ£¬ÒòΪconsumerÖ»»á´Óÿ¸öpartition µÄleader¶ÁÊý¾Ý£¬¶øÓëreplicaiton factorÎ޹ء£Í¬Ñù£¬consumerÍÌÍÂÂÊÒ²Óëͬ²½¸´ÖÆ»¹ÊÇÒì²½¸´ÖÆÎ޹ء£

1¸öconsumer

¸Ã²âÊÔ´ÓÓÐ6¸öpartition£¬3¸öreplicationµÄtopicÏû·Ñ50 millionµÄÏûÏ¢¡£²âÊÔ½á¹ûΪ 940,521 records/second £¨ 89.7MB/second £©¡£

¿ÉÒÔ¿´µ½£¬KafkarµÄconsumerÊǷdz£¸ßЧµÄ¡£ËüÖ±½Ó´ÓbrokerµÄÎļþϵͳÀï¶ÁÈ¡Îļþ¿é¡£KafkaʹÓà sendfile API À´Ö±½Óͨ¹ý²Ù×÷ϵͳֱ½Ó´«Ê䣬¶ø²»ÓðÑÊý¾Ý¿½±´µ½Óû§¿Õ¼ä¡£¸ÃÏî²âÊÔʵ¼ÊÉÏ´ÓlogµÄÆðʼ´¦¿ªÊ¼¶ÁÊý¾Ý£¬ËùÒÔËü×öÁËÕæÊµµÄI/O¡£ÔÚÉú²ú»·¾³Ï£¬consumer¿ÉÒÔÖ±½Ó¶ÁÈ¡producer¸Õ¸ÕдϵÄÊý¾Ý£¨Ëü¿ÉÄÜ»¹ÔÚ»º´æÖУ©¡£Êµ¼ÊÉÏ£¬Èç¹ûÔÚÉú²ú»·¾³ÏÂÅÜ I/O stat £¬Äã¿ÉÒÔ¿´µ½»ù±¾ÉÏûÓÐÎïÀí¡°¶Á¡±¡£Ò²¾ÍÊÇ˵Éú²ú»·¾³ÏÂconsumerµÄÍÌÍÂÂÊ»á±È¸ÃÏî²âÊÔÖеÄÒª¸ß¡£

3¸öconsumer

½«ÉÏÃæµÄconsumer¸´ÖƵ½3̨²»Í¬µÄ»úÆ÷ÉÏ£¬²¢ÇÒ²¢ÐÐÔËÐÐËüÃÇ£¨´Óͬһ¸ötopicÉÏÏû·ÑÊý¾Ý£©¡£²âÊÔ½á¹ûΪ 2,615,968 records/second £¨ 249.5MB/second £©¡£

ÕýÈçËùÔ¤ÆÚµÄÄÇÑù£¬consumerµÄÍÌÍÂÂʼ¸ºõÏßÐÔÔöÕÇ¡£

Producer and Consumer

ÉÏÃæµÄ²âÊÔÖ»ÊǰÑproducerºÍconsumer·Ö¿ª²âÊÔ£¬¶ø¸ÃÏî²âÊÔͬʱÔËÐÐproducerºÍconsumer£¬Õâ¸ü½Ó½üʹÓó¡¾°¡£Êµ¼ÊÉÏĿǰµÄreplicationϵͳÖÐfollower¾ÍÏ൱ÓÚconsumerÔÚ¹¤×÷¡£

¸ÃÏî²âÊÔ£¬ÔÚ¾ßÓÐ6¸ö partition ºÍ3¸öreplicaµÄtopicÉÏͬʱʹÓÃ1¸öproducerºÍ1¸öconsumer£¬²¢ÇÒʹÓÃÒì²½¸´ÖÆ¡£²âÊÔ½á¹ûΪ 795,064 records/second £¨ 75.8MB/second £©¡£

¿ÉÒÔ¿´µ½£¬¸ÃÏî²âÊÔ½á¹ûÓëµ¥¶À²âÊÔ1¸öproducerʱµÄ½á¹û¼¸ºõÒ»Ö¡£ËùÒÔ˵consumer·Ç³£ÇáÁ¿¼¶¡£

ÏûÏ¢³¤¶È¶ÔÍÌÍÂÂʵÄÓ°Ïì

ÉÏÃæµÄËùÓвâÊÔ¶¼»ùÓÚ¶ÌÏûÏ¢£¨payload 100×Ö½Ú£©£¬¶øÕýÈçÉÏÎÄËù˵£¬¶ÌÏûÏ¢¶ÔKafkaÀ´ËµÊǸüÄÑ´¦ÀíµÄʹÓ÷½Ê½£¬¿ÉÒÔÔ¤ÆÚ£¬Ëæ×ÅÏûÏ¢³¤¶ÈµÄÔö´ó£¬records/second»á¼õС£¬µ«MB/second»áÓÐËùÌá¸ß¡£ÏÂͼÊÇrecords/secondÓëÏûÏ¢³¤¶ÈµÄ¹ØÏµÍ¼¡£

[ͼƬÉÏ´«ÖС£¡£¡££¨20£©]ÕýÈçÎÒÃÇËùÔ¤ÆÚµÄÄÇÑù£¬Ëæ×ÅÏûÏ¢³¤¶ÈµÄÔö¼Ó£¬Ã¿ÃëÖÓËùÄÜ·¢Ë͵ÄÏûÏ¢µÄÊýÁ¿Öð½¥¼õС¡£µ«ÊÇÈç¹û¿´Ã¿ÃëÖÓ·¢Ë͵ÄÏûÏ¢µÄ×Ü´óС£¬Ëü»áËæ×ÅÏûÏ¢³¤¶ÈµÄÔö¼Ó¶øÔö¼Ó£¬ÈçÏÂͼËùʾ¡£

[ͼƬÉÏ´«ÖС£¡£¡££¨21£©]´ÓÉÏͼ¿ÉÒÔ¿´³ö£¬µ±ÏûÏ¢³¤¶ÈΪ10×Ö½Úʱ£¬ÒòΪҪƵ·±Èë¶Ó£¬»¨ÁËÌ«¶àʱ¼ä»ñÈ¡Ëø£¬CPU³ÉÁËÆ¿¾±£¬²¢²»Äܳä·ÖÀûÓôø¿í¡£µ«´Ó100×Ö½Ú¿ªÊ¼£¬ÎÒÃÇ¿ÉÒÔ¿´µ½´ø¿íµÄʹÓÃÖð½¥Ç÷ÓÚ±¥ºÍ£¨ËäÈ»MB/second»¹ÊÇ»áËæ×ÅÏûÏ¢³¤¶ÈµÄÔö¼Ó¶øÔö¼Ó£¬µ«Ôö¼ÓµÄ·ù¶ÈÒ²Ô½À´Ô½Ð¡£©¡£

¶Ëµ½¶ËµÄLatency

ÉÏÎÄÖÐÌÖÂÛÁËÍÌÍÂÂÊ£¬ÄÇÏûÏ¢´«ÊäµÄlatencyÈçºÎÄØ£¿Ò²¾ÍÊÇ˵ÏûÏ¢´Óproducerµ½consumerÐèÒª¶àÉÙʱ¼äÄØ£¿¸ÃÏî²âÊÔ´´½¨1¸öproducerºÍ1¸öconsumer²¢·´¸´¼ÆÊ±¡£½á¹ûÊÇ£¬ 2 ms (median), 3ms (99th percentile, 14ms (99.9th percentile) ¡£

£¨ÕâÀﲢûÓÐ˵Ã÷topicÓжàÉÙ¸öpartition£¬Ò²Ã»ÓÐ˵Ã÷ÓжàÉÙ¸öreplica£¬replicationÊÇͬ²½»¹ÊÇÒì²½¡£Êµ¼ÊÉÏÕâ»á¼«´óÓ°Ïìproducer·¢Ë͵ÄÏûÏ¢±»commitµÄlatency£¬¶øÖ»ÓÐcommittedµÄÏûÏ¢²ÅÄܱ»consumerËùÏû·Ñ£¬ËùÒÔËü»á×îÖÕÓ°Ïì¶Ëµ½¶ËµÄlatency£©

ÖØÏÖ¸Ãbenchmark

Èç¹û¶ÁÕßÏëÒªÔÚ×Ô¼ºµÄ»úÆ÷ÉÏÖØÏÖ±¾´Îbenchmark²âÊÔ£¬¿ÉÒԲο¼ ±¾´Î²âÊÔµÄÅäÖúÍËùʹÓõÄÃüÁî ¡£

ʵ¼ÊÉÏKafka DistributionÌṩÁËproducerÐÔÄܲâÊÔ¹¤¾ß£¬¿Éͨ¹ý bin/kafka-producer-perf-test.sh

½Å±¾À´Æô¶¯¡£ËùʹÓõÄÃüÁîÈçÏÂ

ProducerSetupbin/kafka-topics.sh --zookeeper esv4-hcl197

.grid.linkedin.com:2181 --create --topic test-rep-one --

partitions 6 --replication-factor 1bin/kafka-topics.sh

--zookeeper esv4-hcl197.grid.linkedin.com:2181 --create

--topic test --partitions 6 --replication-factor 3Single

thread, no replicationbin/kafka-run-class.sh org.apache.kafka.clients.tools.ProducerPerformance test7

50000000 100 -1 acks=1 bootstrap.servers=esv4-hcl198.grid.

linkedin.com:9092 buffer.memory=67108864 batch.size=8196S

ingle-thread, async 3x replicationbin/kafktopics.sh -

-zookeeper esv4-hcl197.grid.linkedin.com:2181 --create

--topic test --partitions 6 --replication-factor 3bin

/kafka-run-class.sh org.apache.kafka.clients.tools.

ProducerPerformance test6 50000000 100 -1 acks=1

bootstrap.servers=esv4-hcl198.grid.linkedin.com:9092

buffer.memory=67108864 batch.size=8196Single-thread,

sync 3x replicationbin/kafka-run-class.sh org.apache.kafka.clients.tools.ProducerPerformance

test 50000000 100 -1 acks=-1 bootstrap.servers=esv4-hcl198

.grid.linkedin.com:9092 buffer.memory=67108864 batch.s

ize=64000Three Producers, 3x async replicationbin/kafka

-run-class.sh org.apache.kafka.clients.tools.Producer

Performance test 50000000 100 -1 acks=1 bootstrap.servers

=esv4-hcl198.grid.linkedin.com:9092 buffer.memory=67108864

batch.size=8196Throughput Versus Stored Databin/kafka-

run-class.sh org.apache.kafka.clients.tools.ProducerPer

formance test 50000000000 100 -1 acks=1 bootstrap.servers

=esv4-hcl198.grid.linkedin.com:9092 buffer.memory=67108864

batch.size=8196Effect of message sizefor i in 10 100 1000

10000 100000;doecho ""echo $ibin/kafka-run-class.sh org.apache.kafka.clients.tools.ProducerPerformance test $(

(100010241024/$i)) $i -1 acks=1 bootstrap.servers=esv4-hcl198

.grid.linkedin.com:9092 buffer.memory=67108864 batch.

size=128000done;ConsumerConsumer throughputbin/kafka-consume

r-perf-test.sh --zookeeper esv4-hcl197.grid.linkedin.com:2181

--messages 50000000 --topic test --threads 13 ConsumersOn three

servers, run:bin/kafka-consumer-perf-test.sh --zookeeper esv4-hcl197.grid.linkedin.com:2181 --messages 50000000 --topic test

--threads 1End-to-end Latencybin/kafka-run-class.sh kafka.tools.

TestEndToEndLatency esv4-hcl198.grid.linkedin.com:9092 esv4-hcl197.

grid.linkedin.com:2181 test 5000Producer and consumerbin/kafka-run

-class.sh org.apache.kafka.clients.tools.ProducerPerformance

test 50000000 100 -1 acks=1 bootstrap.servers=esv4-hcl198.grid

.linkedin.com:9092 buffer.memory=67108864 batch.size=8196bin

/kafka-consumer-perf-test.sh --zookeeper esv4-hcl197.grid.

linkedin.com:2181 --messages 50000000 --topic test --threads 1

brokerÅäÖÃÈçÏÂ

####################### Server Basics ##############################

The id of the broker. This must be set to a unique integer for each

broker.broker.id=0############################# Socket Server Settings

############################## The port the socket server listens

onport=9092# Hostname the broker will bind to and advertise to producers

and consumers.# If not set, the server will bind to all

interfaces and advertise the value returned from# from java.net.InetAddress.getCanoni

calHostName().#host.name=localhost# The number of

threads handling network

requestsnum.network.threads=4# The number of threads

doing disk I/Onum.io

.threads=8# The send buffer (SO_SNDBUF) used by the

socket serversocket.

send.buffer.bytes=1048576# The receive buffer (SO_RCVBUF)

used by the socket

serversocket.receive.buffer.bytes=1048576# The maximum

size of a request that

the socket server will accept (protection against OOM)

socket.request.max.

bytes=104857600############################# Log Basics ##############################

The directory under which to store log fileslog.dirs=

/grid/a/dfs-data/kafka-logs

,/grid/b/dfs-data/kafka-logs,/grid/c/dfs-data/kafka-logs

,/grid/d/dfs-data/kafka-logs,

/grid/e/dfs-data/kafka-logs,/grid/f/dfs-data/kafka-logs#

The number of logical

partitions per topic per server. More partitions allow

greater parallelism#

for consumption, but also mean more files.num

.partitions=8

############################# Log Flush Policy ##############################

The following configurations control the flush

of data to disk. This is

the most# important performance knob in kafka.#

There are a few important

trade-offs here:# 1. Durability: Unflushed data

is at greater risk of

loss in the event of a crash.# 2. Latency: Data is

not made available

to consumers until it is flushed (which adds latency).#

3. Throughput:

The flush is generally the most expensive operation. #

The settings below

allow one to configure the flush policy to flush data

after a period of

time or# every N messages (or both). This can be done

globally and overridden

on a per-topic basis.# Per-topic overrides for log.flush

.interval.ms#log.

flush.intervals.ms.per.topic=topic1:1000, topic2:3000##

##############

############# Log Retention Policy #######################

####### The

following configurations control the disposal of log segments.

The policy can# be set to delete segments after a period

of time, or after a given size has accumulated.# A segment

will be deleted whenever either of these criteria are met

. Deletion always happens# from the end of the log.#

The minimum age of a log file to be eligiblefor deletionlog.retention.hours=168# A size-based retention

policy for logs. Segments are pruned from the log as long as the remaining# segments

ntion policieslog.cleanup.interval.mins=1###############

############## Zookeeper ##############################

Zookeeper connection string (see zookeeper docs for details)

.# This is a comma separated host:port pairs,

each corresponding to a zk# server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127

.0.0.1:3002".# You can also append an optional chroot

string to the urls to

specify the# root directory for all kafka znodes.zookeeper.

connect=esv4-hcl197

.grid.linkedin.com:2181# Timeout in ms for connecting to zookeeperzookeeper.

connection.timeout.ms=1000000# metrics reporter propertieskafka.metrics.polling

.interval.secs=5kafka.metrics.reporters=kafka

.metrics.KafkaCSVMetricsReporterkafka.csv.metrics.dir=

/tmp/kafka_metrics#

Disable csv reporting by default.kafka.csv.metrics.reporter.enabled=falsere

plica.lag.max.messages=10000000

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

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

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

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