±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcsdn£¬KafkaÒ»¸ö¿ªÔ´Á÷´¦ÀíÆ½Ì¨£¬±¾ÎÄÖ÷ÒªÀ´½²ÊöKafkaµÄÈý¸ö°æ±¾µÄÏûÏ¢¸ñʽµÄÑݱ䣬ϣÍû¶Ô´ó¼ÒµÄѧϰÄÜÓаïÖú¡£
|
|
ÕªÒª
¶ÔÓÚÒ»¸ö³ÉÊìµÄÏûÏ¢Öмä¼þ¶øÑÔ£¬ÏûÏ¢¸ñʽ²»½ö¹ØÏµµ½¹¦ÄÜά¶ÈµÄÀ©Õ¹£¬»¹Ç£Éæµ½ÐÔÄÜά¶ÈµÄÓÅ»¯¡£Ëæ×ÅKafkaµÄѸÃÍ·¢Õ¹£¬ÆäÏûÏ¢¸ñʽҲÔÚ²»¶ÏµÄÉý¼¶¸Ä½ø£¬´Ó0.8.x°æ±¾¿ªÊ¼µ½ÏÖÔÚµÄ1.1.x°æ±¾£¬KafkaµÄÏûÏ¢¸ñʽҲ¾ÀúÁË3¸ö°æ±¾¡£±¾ÎÄÕâÀïÖ÷ÒªÀ´½²ÊöKafkaµÄÈý¸ö°æ±¾µÄÏûÏ¢¸ñʽµÄÑݱ䣬ÎÄÕÂÆ«³¤£¬½¨ÒéÏȹØ×¢ºó¼ø¶¨¡£

ÿһÌõÏûÏ¢±»·¢Ë͵½KafkaÖУ¬Æä»á¸ù¾ÝÒ»¶¨µÄ¹æÔòÑ¡Ôñ±»´æ´¢µ½ÄÄÒ»¸öpartitionÖС£Èç¹û¹æÔòÉèÖõĺÏÀí£¬ËùÓеÄÏûÏ¢¿ÉÒÔ¾ùÔÈ·Ö²¼µ½²»Í¬µÄpartitionÀÕâÑù¾ÍʵÏÖÁËˮƽÀ©Õ¹¡£ÈçÉÏͼ£¬Ã¿¸öpartitionÓÉÆäÉϸ½×ŵÄÿһÌõÏûÏ¢×é³É£¬Èç¹ûÏûÏ¢¸ñʽÉè¼ÆµÄ²»¹»¾«Á¶£¬ÄÇôÆä¹¦ÄܺÍÐÔÄܶ¼»á´ó´òÕÛ¿Û¡£±ÈÈçÓÐÈßÓà×ֶΣ¬ÊƱػáʹµÃpartition²»±ØÒªµÄÔö´ó£¬½ø¶ø²»½öʹµÃ´æ´¢µÄ¿ªÏú±ä´ó¡¢ÍøÂç´«ÊäµÄ¿ªÏú±ä´ó£¬Ò²»áʹµÃKafkaµÄÐÔÄÜϽµ£»ÓÖ±ÈÈçȱÉÙ×ֶΣ¬ÔÚ×î³õµÄKafkaÏûÏ¢°æ±¾ÖÐûÓÐtimestamp×ֶΣ¬¶ÔÄÚ²¿¶øÑÔ£¬ÆäÓ°ÏìÁËÈÕÖ¾±£´æ¡¢ÇзֲßÂÔ£¬¶ÔÍⲿ¶øÑÔ£¬ÆäÓ°ÏìÁËÏûÏ¢É󼯡¢¶Ëµ½¶ËÑӳٵȹ¦ÄܵÄÀ©Õ¹£¬ËäÈ»¿ÉÒÔÔÚÏûÏ¢ÌåÄÚ²¿Ìí¼ÓÒ»¸öʱ¼ä´Á£¬µ«ÊǽâÎö±ä³¤µÄÏûÏ¢Ìå»á´øÀ´¶îÍâµÄ¿ªÏú£¬¶ø´æ´¢ÔÚÏûÏ¢Ì壨²Î¿¼ÏÂͼÖеÄvalue×ֶΣ©Ç°Ãæ¿ÉÒÔͨ¹ýÖ¸ÕëÆ«Á¿»ñÈ¡ÆäÖµ¶øÈÝÒ×½âÎö£¬½ø¶ø¼õÉÙÁË¿ªÏú£¨¿ÉÒԲ鿴v1°æ±¾£©£¬ËäÈ»Ïà±ÈÓÚûÓÐtimestamp×ֶεĿªÏú»á²îÒ»µã¡£Èç´Ë·ÖÎö£¬½öÔÚÒ»¸ö×ֶεÄÒ»ÔöÒ»¼õÖ®¼ä¾ÍÓÐÕâô¶àÃŵÀ£¬ÄÇôKafka¾ßÌåÊÇÔõô×öµÄÄØ£¿±¾ÎÄÖ»Õë¶ÔKafka 0.8.x°æ±¾¿ªÊ¼×öÏàӦ˵Ã÷£¬¶ÔÓÚ֮ǰµÄ°æ±¾²»×ö³ÂÊö¡£
v0°æ±¾
¶ÔÓÚKafkaÏûÏ¢¸ñʽµÄµÚÒ»¸ö°æ±¾£¬ÎÒÃǰÑËü³ÆÖ®Îªv0£¬ÔÚKafka 0.10.0°æ±¾Ö®Ç°¶¼ÊDzÉÓõÄÕâ¸öÏûÏ¢¸ñʽ¡£×¢ÒâÈçÎÞÌØÊâ˵Ã÷£¬ÎÒÃÇÖ»ÌÖÂÛÏûϢδѹËõµÄÇéÐΡ£

ÉÏ×óͼÖеġ°RECORD¡±²¿·Ö¾ÍÊÇv0°æ±¾µÄÏûÏ¢¸ñʽ£¬´ó¶àÊýÈË»á°Ñ×óͼÖеÄÕûÌ壬¼´°üÀ¨offsetºÍmessage size×ֶζ¼¶¼¿´³ÉÊÇÏûÏ¢£¬ÒòΪÿ¸öRecord£¨v0ºÍv1°æ£©±Ø¶¨¶ÔÓ¦Ò»¸öoffsetºÍmessage size¡£Ã¿ÌõÏûÏ¢¶¼Ò»¸öoffsetÓÃÀ´±êÖ¾ËüÔÚpartitionÖÐµÄÆ«ÒÆÁ¿£¬Õâ¸öoffsetÊÇÂß¼Öµ£¬¶ø·Çʵ¼ÊÎïÀíÆ«ÒÆÖµ£¬message size±íʾÏûÏ¢µÄ´óС£¬ÕâÁ½ÕßµÄÒ»Æð±»³ÆÖ®ÎªÈÕ־ͷ²¿£¨LOG_OVERHEAD£©£¬¹Ì¶¨Îª12B¡£LOG_OVERHEADºÍRECORDÒ»ÆðÓÃÀ´ÃèÊöÒ»ÌõÏûÏ¢¡£ÓëÏûÏ¢¶ÔÓ¦µÄ»¹ÓÐÏûÏ¢¼¯µÄ¸ÅÄÏûÏ¢¼¯Öаüº¬Ò»Ìõ»òÕß¶àÌõÏûÏ¢£¬ÏûÏ¢¼¯²»½öÊÇ´æ´¢ÓÚ´ÅÅÌÒÔ¼°ÔÚÍøÂçÉÏ´«Ê䣨Produce & Fetch£©µÄ»ù±¾ÐÎʽ£¬¶øÇÒÊÇkafkaÖÐѹËõµÄ»ù±¾µ¥Ôª£¬Ïêϸ½á¹¹²Î¿¼ÉÏÓÒͼ¡£
ÏÂÃæÀ´¾ßÌå³ÂÊöÒ»ÏÂÏûÏ¢£¨Record£©¸ñʽÖеĸ÷¸ö×ֶΣ¬´Ócrc32¿ªÊ¼ËãÆð£¬¸÷¸ö×ֶεĽâÊÍÈçÏ£º
1.crc32£¨4B£©£ºcrc32УÑéÖµ¡£Ð£Ñ鷶ΧΪmagicÖÁvalueÖ®¼ä¡£
2.magic£¨1B£©£ºÏûÏ¢¸ñʽ°æ±¾ºÅ£¬´Ë°æ±¾µÄmagicֵΪ0¡£
3.attributes£¨1B£©£ºÏûÏ¢µÄÊôÐÔ¡£×ܹ²Õ¼1¸ö×Ö½Ú£¬µÍ3λ±íʾѹËõÀàÐÍ£º0±íʾNONE¡¢1±íʾGZIP¡¢2±íʾSNAPPY¡¢3±íʾLZ4£¨LZ4×ÔKafka 0.9.xÒýÈ룩£¬ÆäÓàλ±£Áô¡£
4.key length£¨4B£©£º±íʾÏûÏ¢µÄkeyµÄ³¤¶È¡£Èç¹ûΪ-1£¬Ôò±íʾûÓÐÉèÖÃkey£¬¼´key=null¡£
5.key£º¿ÉÑ¡£¬Èç¹ûûÓÐkeyÔòÎÞ´Ë×ֶΡ£
6.value length£¨4B£©£ºÊµ¼ÊÏûÏ¢ÌåµÄ³¤¶È¡£Èç¹ûΪ-1£¬Ôò±íʾÏûϢΪ¿Õ¡£
7.value£ºÏûÏ¢Ìå¡£¿ÉÒÔΪ¿Õ£¬±ÈÈçtomnstoneÏûÏ¢¡£
v0°æ±¾ÖÐÒ»¸öÏûÏ¢µÄ×îС³¤¶È£¨RECORD_OVERHEAD_V0£©Îªcrc32 + magic + attributes + key length + value length = 4B + 1B + 1B + 4B + 4B =14B£¬Ò²¾ÍÊÇ˵v0°æ±¾ÖÐÒ»ÌõÏûÏ¢µÄ×îС³¤¶ÈΪ14B£¬Èç¹ûСÓÚÕâ¸öÖµ£¬ÄÇôÕâ¾ÍÊÇÒ»ÌõÆÆËðµÄÏûÏ¢¶ø²»±»½ÓÊÜ¡£
ÕâÀïÎÒÃÇÀ´×öÒ»¸ö²âÊÔ£¬Ê×ÏÈ´´½¨Ò»¸öpartitionÊýºÍ¸±±¾Êý¶¼Îª1µÄtopic£¬Ãû³ÆÎª¡°msg_format_v0¡±£¬È»ºóÍùmsg_format_v0Öз¢ËÍÒ»Ìõkey=¡±key¡±£¬value=¡±value¡±µÄÏûÏ¢£¬Ö®ºó²é¿´¶ÔÓ¦µÄÈÕÖ¾£º
[root@node1
kafka_2.10-0.8.2.1]# bin/kafka-run-class.sh kafka.tools.DumpLogSegments
--files /tmp/kafka-logs/msg_format_v0-0/00000000000000000000.log
Dumping /tmp/kafka-logs-08/msg_format_v0-0/00000000000000000000.log
Starting offset: 0
offset: 0 position: 0 isvalid:
true payloadsize: 5 magic: 0 compresscodec: NoCompressionCodec
crc: 592888119 keysize: 3 |
²é¿´ÏûÏ¢µÄ´óС£¬¼´00000000000000000000.logÎļþµÄ´óСΪ34B£¬ÆäÖµÕýºÃµÈÓÚLOG_OVERHEAD+RECORD_OVERHEAD_V0 + 3BµÄkey + 5BµÄvalue = 12B + 14B + 3B + 5B = 34B¡£
[root@node1 msg_format_v0-0]# ll *.log
-rw-r--r-- 1 root root 34 Apr 26 02:52 00000000000000000000.log |
ÎÒÃÇÔÙ·¢ËÍÒ»Ìõkey=null, value=¡±value¡±µÄÏûÏ¢£¬Ö®ºó²é¿´ÈÕÖ¾µÄ´óС£º
[root@node3 msg_format_v0-0]# ll *.log
-rw-r--r-- 1 root root 65 Apr 26 02:56 00000000000000000000.log |
ÈÕÖ¾´óСΪ65B£¬¼õÈ¥ÉÏÒ»Ìõ34BµÄÏûÏ¢£¬¿ÉÒÔµÃÖª±¾ÌõÏûÏ¢µÄ´óСΪ31B£¬ÕýºÃµÈÓÚLOG_OVERHEAD+RECORD_OVERHEAD_V0 + 5BµÄvalue = 12B + 14B+ 5B = 31B¡£
v1°æ±¾
kafka´Ó0.10.0°æ±¾¿ªÊ¼µ½0.11.0°æ±¾Ö®Ç°ËùʹÓõÄÏûÏ¢¸ñʽ°æ±¾Îªv1£¬Æä±Èv0°æ±¾¾Í¶àÁËÒ»¸ötimestamp×ֶΣ¬±íʾÏûÏ¢µÄʱ¼ä´Á¡£v1°æ±¾µÄÏûÏ¢½á¹¹Í¼ÈçÏÂËùʾ£º

v1°æ±¾µÄmagic×Ö¶ÎֵΪ1¡£v1°æ±¾µÄattributes×Ö¶ÎÖеĵÍ3λºÍv0°æ±¾µÄÒ»Ñù£¬»¹ÊDZíʾѹËõÀàÐÍ£¬¶øµÚ4¸öbitÒ²±»ÀûÓÃÁËÆðÀ´£º0±íʾtimestampÀàÐÍΪCreateTime£¬¶ø1±íʾtImestampÀàÐÍΪLogAppendTime£¬ÆäËûλ±£Áô¡£v1°æ±¾µÄ×îСÏûÏ¢£¨RECORD_OVERHEAD_V1£©´óСҪ±Èv0°æ±¾µÄÒª´ó8¸ö×Ö½Ú£¬¼´22B¡£Èç¹ûÏñv0°æ±¾½éÉܵÄÒ»Ñù·¢ËÍÒ»Ìõkey=¡±key¡±£¬value=¡±value¡±µÄÏûÏ¢£¬ÄÇô´ËÌõÏûÏ¢ÔÚv1°æ±¾ÖлáÕ¼ÓÃ42B£¬¾ßÌå²âÊÔ²½Öè²Î¿¼v0°æµÄÏà¹Ø½éÉÜ¡£
ÏûϢѹËõ
³£¼ûµÄѹËõËã·¨ÊÇÊý¾ÝÁ¿Ô½´óѹËõЧ¹ûÔ½ºÃ£¬Ò»ÌõÏûϢͨ³£²»»áÌ«´ó£¬Õâ¾Íµ¼ÖÂѹËõЧ¹û²¢²»Ì«ºÃ¡£¶økafkaʵÏÖµÄѹËõ·½Ê½Êǽ«¶àÌõÏûÏ¢Ò»Æð½øÐÐѹËõ£¬ÕâÑù¿ÉÒÔ±£Ö¤½ÏºÃµÄѹËõЧ¹û¡£¶øÇÒÔÚÒ»°ãÇé¿öÏ£¬Éú²úÕß·¢Ë͵ÄѹËõÊý¾ÝÔÚkafka brokerÖÐÒ²ÊDZ£³ÖѹËõ״̬½øÐд洢£¬Ïû·ÑÕß´Ó·þÎñ¶Ë»ñȡҲÊÇѹËõµÄÏûÏ¢£¬Ïû·ÑÕßÔÚ´¦ÀíÏûϢ֮ǰ²Å»á½âѹÏûÏ¢£¬ÕâÑù±£³ÖÁ˶˵½¶ËµÄѹËõ¡£
ѹËõÂÊÊÇѹËõºóµÄ´óСÓëѹËõǰµÄ¶Ô±È¡£ÀýÈ磺°Ñ100MBµÄÎļþѹËõºóÊÇ90MB£¬Ñ¹ËõÂÊΪ90/100*100%=90%£¬Ñ¹ËõÂÊÒ»°ãÊÇԽСѹËõЧ¹ûÔ½ºÃ¡£Ò»°ã¿ÚÓﻯ³ÂÊöʱ»áÎóÃèÊöΪѹËõÂÊÔ½¸ßÔ½ºÃ£¬ÎªÁ˱ÜÃâ»ìÏý£¬±¾ÎIJ»ÒýÈëѧÊõÉϵÄѹËõÂʶøÒýÈëѹËõЧ¹û£¬ÕâÑùÈÝÒ×´ï³É¹²Ê¶¡£
½²½âµ½ÕâÀï¶¼ÊÇÕë¶ÔÏûϢδѹËõµÄÇé¿ö£¬¶øµ±ÏûϢѹËõʱÊǽ«Õû¸öÏûÏ¢¼¯½øÐÐѹËõ¶ø×÷ΪÄÚ²ãÏûÏ¢£¨inner message£©£¬ÄÚ²ãÏûÏ¢ÕûÌå×÷ΪÍâ²ã£¨wrapper message£©µÄvalue£¬Æä½á¹¹Í¼ÈçÏÂËùʾ£º

ѹËõºóµÄÍâ²ãÏûÏ¢£¨wrapper message£©ÖеÄkeyΪnull£¬ËùÒÔͼÓÒ²¿·ÖûÓл³ökeyÕâÒ»²¿·Ö¡£µ±Éú²úÕß´´½¨Ñ¹ËõÏûÏ¢µÄʱºò£¬¶ÔÄÚ²¿Ñ¹ËõÏûÏ¢ÉèÖõÄoffsetÊÇ´Ó0¿ªÊ¼ÎªÃ¿¸öÄÚ²¿ÏûÏ¢·ÖÅäoffset£¬Ïêϸ¿ÉÒԲο¼ÏÂͼÓÒ²¿£º

Æäʵÿ¸ö´ÓÉú²úÕß·¢³öµÄÏûÏ¢¼¯ÖеÄÏûÏ¢offset¶¼ÊÇ´Ó0¿ªÊ¼µÄ£¬µ±È»Õâ¸öoffset²»ÄÜÖ±½Ó´æ´¢ÔÚÈÕÖ¾ÎļþÖУ¬¶Ôoffset½øÐÐת»»Ê±ÔÚ·þÎñ¶Ë½øÐеģ¬¿Í»§¶Ë²»ÐèÒª×öÕâ¸ö¹¤×÷¡£Íâ²ãÏûÏ¢±£´æÁËÄÚ²ãÏûÏ¢ÖÐ×îºóÒ»ÌõÏûÏ¢µÄ¾ø¶ÔÎ»ÒÆ£¨absolute offset£©£¬¾ø¶ÔÎ»ÒÆÊÇÖ¸Ïà¶ÔÓÚÕû¸öpartition¶øÑԵġ£²Î¿¼ÉÏͼ£¬¶ÔÓÚδѹËõµÄÇéÐΣ¬Í¼ÓÒÄÚ²ãÏûÏ¢×îºóÒ»ÌõµÄoffsetÀíÓ¦ÊÇ1030£¬µ«ÊDZ»Ñ¹ËõÖ®ºó¾Í±ä³ÉÁË5£¬¶øÕâ¸ö1030±»¸³Óè¸øÁËÍâ²ãµÄoffset¡£µ±Ïû·ÑÕßÏû·ÑÕâ¸öÏûÏ¢¼¯µÄʱºò£¬Ê×ÏȽâѹËõÕû¸öÏûÏ¢¼¯£¬È»ºóÕÒµ½ÄÚ²ãÏûÏ¢ÖÐ×îºóÒ»ÌõÏûÏ¢µÄinner offset£¬È»ºó¸ù¾ÝÈçϹ«Ê½ÕÒµ½ÄÚ²ãÏûÏ¢ÖÐ×îºóÒ»ÌõÏûÏ¢Ç°ÃæµÄÏûÏ¢µÄabsolute offset£¨RO±íʾRelative Offset£¬IO±íʾInner Offset£¬¶øAO±íʾAbsolute Offset£©£º
RO = IO_of_a_message - IO_of_the_last_message
AO = AO_Of_Last_Inner_Message + RO |
×¢ÒâÕâÀïROÊÇÇ°ÃæµÄÏûÏ¢Ïà¶ÔÓÚ×îºóÒ»ÌõÏûÏ¢µÄIO¶øÑԵģ¬ËùÒÔÆäֵСÓÚµÈÓÚ0£¬0±íʾ×îºóÒ»ÌõÏûÏ¢×ÔÉí¡£
ѹËõÏûÏ¢£¬Ó¢ÎÄÊÇcompress message£¬KafkaÖл¹ÓÐÒ»¸öcompact message£¬³£³£Ò²»á±»ÈËÃÇÖ±Òë³ÉѹËõÏûÏ¢£¬ÐèҪעÒâÁ½ÕßµÄÇø±ð¡£compact messageÊÇÕë¶ÔÈÕÖ¾ÇåÀí²ßÂÔ¶øÑԵģ¨cleanup.policy=compact£©£¬ÊÇÖ¸ÈÕ־ѹËõ£¨log compaction£©ºóµÄÏûÏ¢£¬Õâ¸öºóÐøµÄϵÁÐÎÄÕÂÖлáÓнéÉÜ¡£±¾ÎÄÖеÄѹËõÏûÏ¢µ¥Ö¸compress message£¬¼´²ÉÓÃGZIP¡¢LZ4µÈѹËõ¹¤¾ßѹËõµÄÏûÏ¢¡£
ÔÚ½²Êöv1°æ±¾µÄÏûϢʱ£¬ÎÒÃÇÁ˽⵽v1°æ±¾±Èv0°æµÄÏûÏ¢¶àÁ˸ötimestampµÄ×ֶΡ£¶ÔÓÚѹËõµÄÇéÐΣ¬Íâ²ãÏûÏ¢µÄtimestampÉèÖÃΪ£º
1.Èç¹ûtimestampÀàÐÍÊÇCreateTime£¬ÄÇôÉèÖõÄÊÇÄÚ²ãÏûÏ¢ÖÐ×î´óµÄʱ¼ä´Á£¨the max timestampof inner messages if CreateTime is used£©¡£
2.Èç¹ûtimestampÀàÐÍÊÇLogAppendTime£¬ÄÇôÉèÖõÄÊÇkafka·þÎñÆ÷µ±Ç°µÄʱ¼ä´Á£»
ÄÚ²ãÏûÏ¢µÄtimestampÉèÖÃΪ£º
1.Èç¹ûÍâ²ãÏûÏ¢µÄtimestampÀàÐÍÊÇCreateTime£¬ÄÇôÉèÖõÄÊÇÉú²úÕß´´½¨ÏûϢʱµÄʱ¼ä´Á¡£
2.Èç¹ûÍâ²ãÏûÏ¢µÄtimestampÀàÐÍÊÇLogAppendTime£¬ÄÇôËùÓеÄÄÚ²ãÏûÏ¢µÄʱ¼ä´Á¶¼½«±»ºöÂÔ¡£
¶ÔÓÚattributes×ֶζøÑÔ£¬ËüµÄtimestampλֻÔÚÍâ²ãÏûÏ¢£¨wrapper message£©ÖÐÉèÖã¬ÄÚ²ãÏûÏ¢£¨inner message£©ÖеÄtimestampÀàÐÍÒ»Ö±¶¼ÊÇCreateTime¡£
v2°æ±¾
kafka´Ó0.11.0°æ±¾¿ªÊ¼ËùʹÓõÄÏûÏ¢¸ñʽ°æ±¾Îªv2£¬Õâ¸ö°æ±¾µÄÏûÏ¢Ïà±ÈÓÚv0ºÍv1µÄ°æ±¾¶øÑԸ͝ºÜ´ó£¬Í¬Ê±»¹²Î¿¼ÁËProtocol Buffer¶øÒýÈëÁ˱䳤ÕûÐÍ£¨Varints£©ºÍZigZag±àÂë¡£VarintsÊÇʹÓÃÒ»¸ö»ò¶à¸ö×Ö½ÚÀ´ÐòÁл¯ÕûÊýµÄÒ»ÖÖ·½·¨£¬ÊýֵԽС£¬ÆäËùÕ¼ÓõÄ×Ö½ÚÊý¾ÍÔ½ÉÙ¡£ZigZag±àÂëÒÔÒ»ÖÖ¾â³ÝÐΣ¨zig-zags£©µÄ·½Ê½À´»Ø´©ËóÓÚÕý¸ºÕûÊýÖ®¼ä£¬ÒÔʹµÃ´ø·ûºÅÕûÊýÓ³ÉäΪÎÞ·ûºÅÕûÊý£¬ÕâÑù¿ÉÒÔʹµÃ¾ø¶ÔÖµ½ÏСµÄ¸ºÊýÈÔÈ»ÏíÓнÏСµÄVarints±àÂëÖµ£¬±ÈÈç-1±àÂëΪ1,1±àÂëΪ2£¬-2±àÂëΪ3¡£Ïêϸ¿ÉÒԲο¼£ºhttps://developers.google.com/protocol-buffers/docs/encoding¡£
»Ø¹ËÒ»ÏÂkafka v0ºÍv1°æ±¾µÄÏûÏ¢¸ñʽ£¬Èç¹ûÏûÏ¢±¾ÉíûÓÐkey£¬ÄÇôkey length×Ö¶ÎΪ-1£¬intÀàÐ͵ÄÐèÒª4¸ö×Ö½ÚÀ´±£´æ£¬¶øÈç¹û²ÉÓÃVarintsÀ´±àÂëÔòÖ»ÐèÒªÒ»¸ö×Ö½Ú¡£¸ù¾ÝVarintsµÄ¹æÔò¿ÉÒÔÍÆµ¼³ö0-63Ö®¼äµÄÊý×ÖÕ¼1¸ö×Ö½Ú£¬64-8191Ö®¼äµÄÊý×ÖÕ¼2¸ö×Ö½Ú£¬8192-1048575Ö®¼äµÄÊý×ÖÕ¼3¸ö×Ö½Ú¡£¶økafka brokerµÄÅäÖÃmessage.max.bytesµÄĬÈÏ´óСΪ1000012£¨Varints±àÂëÕ¼3¸ö×Ö½Ú£©£¬Èç¹ûÏûÏ¢¸ñʽÖÐÓ볤¶ÈÓйصÄ×ֶβÉÓÃVarintsµÄ±àÂëµÄ»°£¬¾ø´ó¶àÊýÇé¿ö϶¼»á½ÚÊ¡¿Õ¼ä£¬¶øv2°æ±¾µÄÏûÏ¢¸ñʽҲÕýÊÇÕâÑù×öµÄ¡£²»¹ýÐèҪעÒâµÄÊÇVarints²¢·ÇÒ»Ö±»áÊ¡¿Õ¼ä£¬Ò»¸öint32×»áÕ¼ÓÃ5¸ö×Ö½Ú£¨´óÓÚĬÈϵÄ4×Ö½Ú£©£¬Ò»¸öint64×»áÕ¼ÓÃ10×Ö½Ú£¨´óÓÚĬÈϵÄ8×Ö½Ú£©¡£
v2°æ±¾ÖÐÏûÏ¢¼¯Î½Ö®ÎªRecord Batch£¬¶ø²»ÊÇÏÈǰµÄMessage SetÁË£¬ÆäÄÚ²¿Ò²°üº¬ÁËÒ»Ìõ»òÕß¶àÌõÏûÏ¢£¬ÏûÏ¢µÄ¸ñʽ²Î¼ûÏÂͼÖв¿ºÍÓÒ²¿¡£ÔÚÏûϢѹËõµÄÇéÐÎÏ£¬Record Batch Header²¿·Ö£¨²Î¼ûÏÂͼ×󲿣¬´Ófirst offsetµ½records count×ֶΣ©ÊDz»±»Ñ¹ËõµÄ£¬¶ø±»Ñ¹ËõµÄÊÇrecords×Ö¶ÎÖеÄËùÓÐÄÚÈÝ¡£

ÏÈÀ´½²ÊöÒ»ÏÂÏûÏ¢¸ñʽRecordµÄ¹Ø¼ü×ֶΣ¬¿ÉÒÔ¿´µ½ÄÚ²¿×ֶδóÁ¿²ÉÓÃÁËVarints£¬ÕâÑùKafka¿ÉÒÔ¸ù¾Ý¾ßÌåµÄÖµÀ´È·¶¨ÐèÒª¼¸¸ö×Ö½ÚÀ´±£´æ¡£v2°æ±¾µÄÏûÏ¢¸ñʽȥµôÁËcrc×ֶΣ¬ÁíÍâÔö¼ÓÁËlength£¨ÏûÏ¢×ܳ¤¶È£©¡¢timestamp delta£¨Ê±¼ä´ÁÔöÁ¿£©¡¢offset delta£¨Î»ÒÆÔöÁ¿£©ºÍheadersÐÅÏ¢£¬²¢ÇÒattributes±»ÆúÓÃÁË£¬±ÊÕß¶Ô´Ë×öÈçÏ·ÖÎö£¨¶ÔÓÚkey¡¢key length¡¢value¡¢value length×ֶκÍv0ÒÔ¼°v1°æ±¾µÄÒ»Ñù£¬ÕâÀï²»ÔÙ׸Êö£©£º
ÏÂÃæÀ´¾ßÌå³ÂÊöÒ»ÏÂÏûÏ¢£¨Record£©¸ñʽÖеĸ÷¸ö×ֶΣ¬´Ócrc32¿ªÊ¼ËãÆð£¬¸÷¸ö×ֶεĽâÊÍÈçÏ£º
1.length£ºÏûÏ¢×ܳ¤¶È¡£
2.attributes£ºÆúÓ㬵«ÊÇ»¹ÊÇÔÚÏûÏ¢¸ñʽÖÐÕ¼¾Ý1BµÄ´óС£¬ÒÔ±¸Î´À´µÄ¸ñʽÀ©Õ¹¡£
3.timestamp delta£ºÊ±¼ä´ÁÔöÁ¿¡£Í¨³£Ò»¸ötimestampÐèÒªÕ¼ÓÃ8¸ö×Ö½Ú£¬Èç¹ûÏñÕâÀï±£´æÓëRecordBatchµÄÆäʵʱ¼ä´ÁµÄ²îÖµµÄ»°¿ÉÒÔ½øÒ»²½µÄ½ÚʡռÓõÄ×Ö½ÚÊý¡£
4.offset delta£ºÎ»ÒÆÔöÁ¿¡£±£´æÓëRecordBatchÆðÊ¼Î»ÒÆµÄ²îÖµ£¬¿ÉÒÔ½ÚʡռÓõÄ×Ö½ÚÊý¡£
5.headers£ºÕâ¸ö×Ö¶ÎÓÃÀ´Ö§³ÖÓ¦Óü¶±ðµÄÀ©Õ¹£¬¶ø²»ÐèÒªÏñv0ºÍv1°æ±¾Ò»Ñù²»µÃ²»½«Ò»Ð©Ó¦Óü¶±ðµÄÊôÐÔֵǶÈëÔÚÏûÏ¢ÌåÀïÃæ¡£HeaderµÄ¸ñʽÈçÉÏͼ×îÓУ¬°üº¬keyºÍvalue£¬Ò»¸öRecordÀïÃæ¿ÉÒÔ°üº¬0ÖÁ¶à¸öHeader¡£¾ßÌå¿ÉÒԲο¼ÒÔÏÂKIP-82¡£
Èç¹û¶ÔÓÚv1°æ±¾µÄÏûÏ¢£¬Èç¹ûÓû§Ö¸¶¨µÄtimestampÀàÐÍÊÇLogAppendTime¶ø²»ÊÇCreateTime£¬ÄÇôÏûÏ¢´Ó·¢ËͶˣ¨Producer£©½øÈëbroker¶ËÖ®ºótimestamp×ֶλᱻ¸üУ¬ÄÇô´ËʱÏûÏ¢µÄcrcÖµ½«»á±»ÖØÐ¼ÆË㣬¶ø´ËÖµÔÚProducer¶ËÒѾ±»¼ÆËã¹ýÒ»´Î£»ÔÙÕߣ¬broker¶ËÔÚ½øÐÐÏûÏ¢¸ñʽת»»Ê±£¨±ÈÈçv1°æ×ª³Év0°æµÄÏûÏ¢¸ñʽ£©Ò²»áÖØÐ¼ÆËãcrcµÄÖµ¡£ÔÚÕâЩÀàËÆµÄÇé¿öÏ£¬ÏûÏ¢´Ó·¢ËͶ˵½Ïû·Ñ¶Ë£¨Consumer£©Ö®¼äÁ÷¶¯Ê±£¬crcµÄÖµÊDZ䶯µÄ£¬ÐèÒª¼ÆËãÁ½´ÎcrcµÄÖµ£¬ËùÒÔÕâ¸ö×ֶεÄÉè¼ÆÔÚv0ºÍv1°æ±¾ÖÐÏԵñȽϼ¦Àß¡£ÔÚv2°æ±¾Öн«crcµÄ×ֶδÓRecordÖÐ×ªÒÆµ½ÁËRecordBatchÖС£
v2°æ±¾¶ÔÓÚÏûÏ¢¼¯£¨RecordBatch£©×öÁ˳¹µ×µÄÐ޸ģ¬²Î¿¼ÉÏͼ×󲿣¬³ýÁ˸ոÕÌá¼°µÄcrc×ֶΣ¬»¹¶àÁËÈçÏÂ×ֶΣº
1.first offset£º±íʾµ±Ç°RecordBatchµÄÆðÊ¼Î»ÒÆ¡£
2.length£º¼ÆËãpartition leader epochµ½headersÖ®¼äµÄ³¤¶È¡£
3.partition leader epoch£ºÓÃÀ´È·±£Êý¾Ý¿É¿¿ÐÔ£¬Ïêϸ¿ÉÒԲο¼KIP-101
4.magic£ºÏûÏ¢¸ñʽµÄ°æ±¾ºÅ£¬¶ÔÓÚv2°æ±¾¶øÑÔ£¬magicµÈÓÚ2¡£
5.attributes£ºÏûÏ¢ÊôÐÔ£¬×¢ÒâÕâÀïÕ¼ÓÃÁËÁ½¸ö×Ö½Ú¡£µÍ3λ±íʾѹËõ¸ñʽ£¬¿ÉÒԲο¼v0ºÍv1£»µÚ4λ±íʾʱ¼ä´ÁÀàÐÍ£»µÚ5λ±íʾ´ËRecordBatchÊÇ·ñ´¦ÓÚÊÂÎñÖУ¬0±íʾ·ÇÊÂÎñ£¬1±íʾÊÂÎñ¡£µÚ6λ±íʾÊÇ·ñÊÇControlÏûÏ¢£¬0±íʾ·ÇControlÏûÏ¢£¬¶ø1±íʾÊÇControlÏûÏ¢£¬ControlÏûÏ¢ÓÃÀ´Ö§³ÖÊÂÎñ¹¦ÄÜ¡£
6.last offset delta£ºRecordBatchÖÐ×îºóÒ»¸öRecordµÄoffsetÓëfirst offsetµÄ²îÖµ¡£Ö÷Òª±»brokerÓÃÀ´È·ÈÏRecordBatchÖÐRecordsµÄ×é×°ÕýÈ·ÐÔ¡£
7.first timestamp£ºRecordBatchÖеÚÒ»ÌõRecordµÄʱ¼ä´Á¡£
8.max timestamp£ºRecordBatchÖÐ×î´óµÄʱ¼ä´Á£¬Ò»°ãÇé¿öÏÂÊÇÖ¸×îºóÒ»¸öRecordµÄʱ¼ä´Á£¬ºÍlast offset deltaµÄ×÷ÓÃÒ»Ñù£¬ÓÃÀ´È·±£ÏûÏ¢×é×°µÄÕýÈ·ÐÔ¡£
9.producer id£ºÓÃÀ´Ö§³ÖÃݵÈÐÔ£¬Ïêϸ¿ÉÒԲο¼KIP-98¡£
10.producer epoch£ººÍproducer idÒ»Ñù£¬ÓÃÀ´Ö§³ÖÃݵÈÐÔ¡£
11.first sequence£ººÍproducer id¡¢producer epochÒ»Ñù£¬ÓÃÀ´Ö§³ÖÃݵÈÐÔ¡£
12.records count£ºRecordBatchÖÐRecordµÄ¸öÊý¡£
ÕâÀïÎÒÃÇÔÙÀ´×öÒ»¸ö²âÊÔ£¬ÔÚ1.0.0µÄkafkaÖд´½¨Ò»¸öpartitionÊýºÍ¸±±¾Êý¶¼Îª1µÄtopic£¬Ãû³ÆÎª¡°msg_format_v2¡±¡£È»ºóͬÑù²åÈëÒ»Ìõkey=¡±key¡±£¬value=¡±value¡±µÄÏûÏ¢£¬²é¿´ÈÕÖ¾½á¹ûÈçÏ£º
[root@node1 kafka_2.12-1.0.0]# bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files /tmp/kafka-logs/msg_format_v2-0/00000000000000000000.log --print-data-log
Dumping /tmp/kafka-logs/msg_format_v2-0/00000000000000000000.log
Starting offset: 0
baseOffset: 0 lastOffset: 0 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false position: 0 CreateTime: 1524709879130 isvalid: true size: 76 magic: 2 compresscodec: NONE crc: 2857248333
|
¿ÉÒÔ¿´µ½size×Ö¶ÎΪ76£¬ÎÒÃǸù¾ÝÉÏͼÖеÄv2°æ±¾µÄÈÕÖ¾¸ñʽÀ´Ñé֤һϣ¬Record Batch Header²¿·Ö¹²61B¡£Record²¿·ÖÖÐattributesÕ¼1B£»timestamp deltaֵΪ0£¬Õ¼1B£»offset deltaֵΪ0£¬Õ¼1B£»key lengthֵΪ3£¬Õ¼1B£¬keyÕ¼3B£»value lengthֵΪ5£¬Õ¼1B£¬valueÕ¼5B£»headers countֵΪ0£¬Õ¼1B, ÎÞheaders¡£Record²¿·ÖµÄ×ܳ¤¶È=1B+1B+1B+1B+3B+1B+5B+1B=14B£¬ËùÒÔRecordµÄlength×Ö¶ÎֵΪ14£¬±àÂëΪ±ä³¤ÕûÐÍÕ¼1B¡£×îºóÍÆµ½³öÕâÌõÏûÏ¢µÄÕ¼ÓÃ×Ö½ÚÊý=61B+14B+1B=76B£¬·ûºÏ²âÊÔ½á¹û¡£Í¬ÑùÔÙ·¢Ò»Ìõkey=null£¬value=¡±value¡±µÄÏûÏ¢µÄ»°£¬¿ÉÒÔ¼ÆËã³öÕâÌõÏûÏ¢Õ¼73B¡£
Õâô¿´ÉÏÈ¥ºÃÏñv2°æ±¾µÄÏûÏ¢±È֮ǰ°æ±¾µÄÏûÏ¢Õ¼ÓÿռäÒª´óºÜ¶à£¬µÄÈ·¶ÔÓÚµ¥ÌõÏûÏ¢¶øÑÔÊÇÕâÑùµÄ£¬Èç¹ûÎÒÃÇÁ¬ÐøÍùmsg_format_v2ÖÐÔÙ·¢ËÍ10Ìõvalue³¤¶ÈΪ6,keyΪnullµÄÏûÏ¢£¬¿ÉÒԵõ½£º
baseOffset: 2 lastOffset: 11 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false position: 149 CreateTime: 1524712213771 isvalid: true size: 191 magic: 2 compresscodec: NONE crc: 820363253 |
±¾À´Ó¦¸ÃÕ¼ÓÃ740B´óСµÄ¿Õ¼ä£¬Êµ¼ÊÉÏÖ»Õ¼ÓÃÁË191B£¬Èç¹ûÔÚv0°æ±¾ÖÐÕâ10ÌõÏûÏ¢ÔòÐèÒªÕ¼ÓÃ320BµÄ¿Õ¼ä£¬v1°æ±¾ÔòÐèÒªÕ¼ÓÃ400BµÄ¿Õ¼ä£¬ÕâÑù¿´À´v2°æ±¾ÓÖ½ÚÊ¡Á˺ܶàµÄ¿Õ¼ä£¬ÒòΪÆä½«¶à¸öÏûÏ¢£¨Record£©´ò°ü´æ·Åµ½µ¥¸öRecordBatchÖУ¬ÓÖͨ¹ýVarints±àÂ뼫´óµÄ½ÚÊ¡Á˿ռ䡣
¾ÍÒÔv1ºÍv2°æ±¾¶Ô±È¶øÁ¢£¬ÖÁÓÚÄĸöÏûÏ¢¸ñʽռÓÿռä´óÊDz»È·¶¨µÄ£¬Òª¸ù¾Ý¾ßÌåÇé¿ö¾ßÌå·ÖÎö¡£±ÈÈçÿÌõÏûÏ¢µÄ´óСΪ16KB£¬ÄÇôһ¸öÏûÏ¢¼¯ÖÐÖ»Äܰüº¬ÓÐÒ»ÌõÏûÏ¢£¨²ÎÊýbatch.sizeĬÈÏ´óСΪ16384£©£¬ËùÒÔv1°æ±¾µÄÏûÏ¢¼¯´óСΪ12B+22B+16384B=16418B¡£¶ø¶ÔÓÚv2°æ±¾¶øÑÔ£¬ÆäÏûÏ¢¼¯´óСΪ61B+11B+16384B=17086B£¨lengthֵΪ16384+£¬Õ¼ÓÃ3B£¬value lengthֵΪ16384£¬Õ¼ÓôóСΪ3B£¬ÆäÓàÊýÖµÐ͵Ä×ֶζ¼¿ÉÒÔÖ»Õ¼ÓÃ1BµÄ¿Õ¼ä£©¡£¿ÉÒÔ¿´µ½v1°æ±¾ÓÖ»á±Èv2°æ±¾½ÚʡЩÐí¿Õ¼ä¡£
Æäʵ¿ÉÒÔ˼¿¼Ò»Ï£ºµ±ÏûÏ¢ÌåԽС£¬v2°æ±¾ÖеÄRecord×ֶεÄÕ¼Óûá±Èv1°æ±¾µÄLogHeader+RecordÕ¼ÓÃԽС£¬ÒÔÖÁÓÚij¸öÁÙ½çµã¿ÉÒÔÍêÈ«ºöÂÔµ½v2°æ±¾ÖÐRecord Batch HeaderµÄ61B´óСµÄÓ°Ïì¡£¾ÍËãÏûÏ¢ÌåºÜ´ó£¬v2°æ±¾µÄ¿Õ¼äÕ¼ÓÃÒ²²»»á±Èv1°æ±¾µÄ¿Õ¼äÕ¼ÓôóÌ«¶à£¬¼¸Ê®¸ö×Ö½ÚÄÚ£¬·´¹Û¶ÔÓÚÕâÖÖ´óÏûÏ¢ÌåµÄ´óС¶øÑÔ£¬Õ⼸ʮ¸ö×ֽڵĴóС´ÓijÖ̶ֳÈÉÏÓÖ¿ÉÒÔºöÂÔ¡£
Óɴ˿ɼû£¬v2°æ±¾µÄÏûÏ¢²»½öÌṩÁËÀàËÆÊÂÎñ¡¢Ãݵȵȸü¶àµÄ¹¦ÄÜ£¬»¹¶Ô¿Õ¼äÕ¼ÓÃÌṩÁË×ã¹»µÄÓÅ»¯£¬×ÜÌåÌáÉýºÜ´ó¡£Ò²ÓÉ´ËÌåÏÖÒ»¸öÓÅÐãµÄÉè¼ÆÊǶàôµÄÖØÒª£¬ËäȻ˵ÎÒÃDz»Òª¹ý¶ÈµÄÉè¼ÆºÍÓÅ»¯£¬ÄÇôÊÇ·ñ¿ÉÒÔ×ÅÑÛÓÚǰÀ´Ë¼¿¼Ò»Ï£¿kafkaΪÎÒÃÇ×öÁËÒ»¸öºÜºÃµÄ°ñÑù¡£
|