LevelDbÈÕ֪¼֮һ£ºLevelDb
101
˵ÆðLevelDbÒ²ÐíÄú²»Çå³þ£¬µ«ÊÇÈç¹û×÷ΪIT¹¤³Ìʦ£¬²»ÖªµÀÏÂÃæÁ½Î»´óÉñ¼¶±ðµÄ¹¤³Ìʦ£¬ÄÇÄúµÄÁìµ¼¹À¼Æ»áHold²»×¡ÁË£ºJeff
DeanºÍSanjay Ghemawat¡£ÕâÁ½Î»ÊÇGoogle¹«Ë¾ÖØÁ¿¼¶µÄ¹¤³Ìʦ£¬ÎªÊýÉõÉÙµÄGoogle
FellowÖ®¶þ¡£
Jeff DeanÆäÈË£ºhttp://research.google.com/people/jeff/index.html£¬Google´ó¹æÄ£·Ö²¼Ê½Æ½Ì¨BigtableºÍMapReduceÖ÷ÒªÉè¼ÆºÍʵÏÖÕß¡£
Sanjay GhemawatÆäÈË£ºhttp://research.google.com/people/sanjay/index.html£¬Google´ó¹æÄ£·Ö²¼Ê½Æ½Ì¨GFS£¬BigtableºÍMapReduceÖ÷ÒªÉè¼ÆºÍʵÏÖ¹¤³Ìʦ¡£
LevelDb¾ÍÊÇÕâÁ½Î»´óÉñ¼¶±ðµÄ¹¤³Ìʦ·¢ÆðµÄ¿ªÔ´ÏîÄ¿£¬¼ò¶øÑÔÖ®£¬LevelDbÊÇÄܹ»´¦ÀíÊ®ÒÚ¼¶±ð¹æÄ£Key-ValueÐÍÊý¾Ý³Ö¾ÃÐÔ´æ´¢µÄC++
³ÌÐò¿â¡£ÕýÏñÉÏÃæ½éÉܵģ¬Õâ¶þλÊÇBigtableµÄÉè¼ÆºÍʵÏÖÕߣ¬Èç¹ûÁ˽âBigtableµÄ»°£¬Ó¦¸ÃÖªµÀÔÚÕâ¸öÓ°ÏìÉîÔ¶µÄ·Ö²¼Ê½´æ´¢ÏµÍ³ÖÐÓÐÁ½¸öºËÐĵIJ¿·Ö£ºMaster
ServerºÍTablet Server¡£ÆäÖÐMaster Server×öһЩ¹ÜÀíÊý¾ÝµÄ´æ´¢ÒÔ¼°·Ö²¼Ê½µ÷¶È¹¤×÷£¬Êµ¼ÊµÄ·Ö²¼Ê½Êý¾Ý´æ´¢ÒÔ¼°¶Áд²Ù×÷ÊÇÓÉTablet
ServerÍê³ÉµÄ£¬¶øLevelDbÔò¿ÉÒÔÀí½âΪһ¸ö¼ò»¯°æµÄTablet Server¡£
LevelDbÓÐÈçÏÂÒ»Ð©ÌØµã£º
Ê×ÏÈ£¬LevelDbÊÇÒ»¸ö³Ö¾Ã»¯´æ´¢µÄKVϵͳ£¬ºÍRedisÕâÖÖÄÚ´æÐ͵ÄKVϵͳ²»Í¬£¬LevelDb²»»áÏñRedisÒ»Ñù¿ñ³ÔÄڴ棬¶øÊǽ«´ó²¿·ÖÊý¾Ý´æ´¢µ½´ÅÅÌÉÏ¡£
Æä´Î£¬LevleDbÔÚ´æ´¢Êý¾Ýʱ£¬ÊǸù¾Ý¼Ç¼µÄkeyÖµÓÐÐò´æ´¢µÄ£¬¾ÍÊÇ˵ÏàÁÚµÄkeyÖµÔÚ´æ´¢ÎļþÖÐÊÇÒÀ´Î˳Ðò´æ´¢µÄ£¬¶øÓ¦ÓÿÉÒÔ×Ô¶¨Òåkey´óС±È½Ïº¯Êý£¬LevleDb»á°´ÕÕÓû§¶¨ÒåµÄ±È½Ïº¯ÊýÒÀÐò´æ´¢ÕâЩ¼Ç¼¡£
ÔٴΣ¬Ïñ´ó¶àÊýKVϵͳһÑù£¬LevelDbµÄ²Ù×÷½Ó¿ÚºÜ¼òµ¥£¬»ù±¾²Ù×÷°üÀ¨Ð´¼Ç¼£¬¶Á¼Ç¼ÒÔ¼°É¾³ý¼Ç¼¡£Ò²Ö§³ÖÕë¶Ô¶àÌõ²Ù×÷µÄÔ×ÓÅúÁ¿²Ù×÷¡£
ÁíÍ⣬LevelDbÖ§³ÖÊý¾Ý¿ìÕÕ£¨snapshot£©¹¦ÄÜ£¬Ê¹µÃ¶ÁÈ¡²Ù×÷²»ÊÜд²Ù×÷Ó°Ï죬¿ÉÒÔÔÚ¶Á²Ù×÷¹ý³ÌÖÐʼÖÕ¿´µ½Ò»ÖµÄÊý¾Ý¡£
³ý´ËÍ⣬LevelDb»¹Ö§³ÖÊý¾ÝѹËõµÈ²Ù×÷£¬Õâ¶ÔÓÚ¼õС´æ´¢¿Õ¼äÒÔ¼°Ôö¿ìIOЧÂʶ¼ÓÐÖ±½ÓµÄ°ïÖú¡£
LevelDbÐÔÄܷdz£Í»³ö£¬¹Ù·½ÍøÕ¾±¨µÀÆäËæ»úдÐÔÄÜ´ïµ½40ÍòÌõ¼Ç¼ÿÃ룬¶øËæ»ú¶ÁÐÔÄÜ´ïµ½6ÍòÌõ¼Ç¼ÿÃë¡£×ÜÌåÀ´Ëµ£¬LevelDbµÄд²Ù×÷Òª´ó´ó¿ìÓÚ¶Á²Ù×÷£¬¶øË³Ðò¶Áд²Ù×÷Ôò´ó´ó¿ìÓÚËæ»ú¶Áд²Ù×÷¡£ÖÁÓÚΪºÎÊÇÕâÑù£¬¿´ÁËÎÒÃǺóÐøÍÆ³öµÄLevelDbÈÕ֪¼£¬¹À¼ÆÄú»áÁ˽âÆäÄÚÔÚÔÒò¡£
LevelDbÈÕ֪¼֮¶þ£ºÕûÌå¼Ü¹¹
LevelDb±¾ÖÊÉÏÊÇÒ»Ì״洢ϵͳÒÔ¼°ÔÚÕâÌ״洢ϵͳÉÏÌṩµÄһЩ²Ù×÷½Ó¿Ú¡£ÎªÁ˱ãÓÚÀí½âÕû¸öϵͳ¼°Æä´¦ÀíÁ÷³Ì£¬ÎÒÃÇ¿ÉÒÔ´ÓÁ½¸ö²»Í¬µÄ½Ç¶ÈÀ´¿´´ýLevleDb£º¾²Ì¬½Ç¶ÈºÍ¶¯Ì¬½Ç¶È¡£´Ó¾²Ì¬½Ç¶È£¬¿ÉÒÔ¼ÙÏëÕû¸öϵͳÕýÔÚÔËÐйý³ÌÖУ¨²»¶Ï²åÈëɾ³ý¶ÁÈ¡Êý¾Ý£©£¬´ËʱÎÒÃǸøLevelDbÕÕÏ࣬´ÓÕÕÆ¬¿ÉÒÔ¿´µ½Ö®Ç°ÏµÍ³µÄÊý¾ÝÔÚÄÚ´æºÍ´ÅÅÌÖÐÊÇÈçºÎ·Ö²¼µÄ£¬´¦ÓÚʲô״̬µÈ£»´Ó¶¯Ì¬µÄ½Ç¶È£¬Ö÷ÒªÊÇÁ˽âϵͳÊÇÈçºÎдÈëÒ»Ìõ¼Ç¼£¬¶Á³öÒ»Ìõ¼Ç¼£¬É¾³ýÒ»Ìõ¼Ç¼µÄ£¬Í¬Ê±Ò²°üÀ¨³ýÁËÕâЩ½Ó¿Ú²Ù×÷ÍâµÄÄÚ²¿²Ù×÷±ÈÈçcompaction£¬ÏµÍ³ÔËÐÐʱ±ÀÀ£ºóÈçºÎ»Ö¸´ÏµÍ³µÈµÈ·½Ãæ¡£
±¾½ÚËù½²µÄÕûÌå¼Ü¹¹Ö÷Òª´Ó¾²Ì¬½Ç¶ÈÀ´ÃèÊö£¬Ö®ºó½ÓÏÂÀ´µÄ¼¸½ÚÄÚÈÝ»áÏêÊö¾²Ì¬½á¹¹Éæ¼°µ½µÄÎļþ»òÕßÄÚ´æÊý¾Ý½á¹¹£¬LevelDbÈÕ֪¼ºó°ë²¿·ÖÖ÷Òª½éÉܶ¯Ì¬ÊÓ½ÇϵÄLevelDb£¬¾ÍÊÇ˵Õû¸öϵͳÊÇÔõôÔËתÆðÀ´µÄ¡£
LevelDb×÷Ϊ´æ´¢ÏµÍ³£¬Êý¾Ý¼Ç¼µÄ´æ´¢½éÖʰüÀ¨ÄÚ´æÒÔ¼°´ÅÅÌÎļþ£¬Èç¹ûÏñÉÏÃæËµµÄ£¬µ±LevelDbÔËÐÐÁËÒ»¶Îʱ¼ä£¬´ËʱÎÒÃǸøLevelDb½øÐÐ͸ÊÓÅÄÕÕ£¬ÄÇôÄú»á¿´µ½ÈçÏÂÒ»·¬¾°Ïó£º

ͼ1.1£ºLevelDb½á¹¹
´ÓͼÖпÉÒÔ¿´³ö£¬¹¹³ÉLevelDb¾²Ì¬½á¹¹µÄ°üÀ¨Áù¸öÖ÷Òª²¿·Ö£ºÄÚ´æÖеÄMemTableºÍImmutable
MemTableÒÔ¼°´ÅÅÌÉϵļ¸ÖÖÖ÷ÒªÎļþ£ºCurrentÎļþ£¬ManifestÎļþ£¬logÎļþÒÔ¼°SSTableÎļþ¡£µ±È»£¬LevelDb³ýÁËÕâÁù¸öÖ÷Òª²¿·Ö»¹ÓÐһЩ¸¨ÖúµÄÎļþ£¬µ«ÊÇÒÔÉÏÁù¸öÎļþºÍÊý¾Ý½á¹¹ÊÇLevelDbµÄÖ÷Ìå¹¹³ÉÔªËØ¡£
LevelDbµÄLogÎļþºÍMemtableÓëBigtableÂÛÎÄÖнéÉܵÄÊÇÒ»Öµģ¬µ±Ó¦ÓÃдÈëÒ»ÌõKey:Value¼Ç¼µÄʱºò£¬LevelDb»áÏÈÍùlogÎļþÀïдÈ룬³É¹¦ºó½«¼Ç¼²å½øMemtableÖУ¬ÕâÑù»ù±¾¾ÍËãÍê³ÉÁËдÈë²Ù×÷£¬ÒòΪһ´ÎдÈë²Ù×÷ֻɿ¼°Ò»´Î´ÅÅÌ˳ÐòдºÍÒ»´ÎÄÚ´æÐ´È룬ËùÒÔÕâÊÇΪºÎ˵LevelDbдÈëËٶȼ«¿ìµÄÖ÷ÒªÔÒò¡£
LogÎļþÔÚϵͳÖеÄ×÷ÓÃÖ÷ÒªÊÇÓÃÓÚϵͳ±ÀÀ£»Ö¸´¶ø²»¶ªÊ§Êý¾Ý£¬¼ÙÈçûÓÐLogÎļþ£¬ÒòΪдÈëµÄ¼Ç¼¸Õ¿ªÊ¼ÊDZ£´æÔÚÄÚ´æÖе쬴ËʱÈç¹ûϵͳ±ÀÀ££¬ÄÚ´æÖеÄÊý¾Ý»¹Ã»ÓÐÀ´µÃ¼°Dumpµ½´ÅÅÌ£¬ËùÒԻᶪʧÊý¾Ý£¨Redis¾Í´æÔÚÕâ¸öÎÊÌ⣩¡£ÎªÁ˱ÜÃâÕâÖÖÇé¿ö£¬LevelDbÔÚдÈëÄÚ´æÇ°ÏȽ«²Ù×÷¼Ç¼µ½LogÎļþÖУ¬È»ºóÔÙ¼ÇÈëÄÚ´æÖУ¬ÕâÑù¼´Ê¹ÏµÍ³±ÀÀ££¬Ò²¿ÉÒÔ´ÓLogÎļþÖлָ´ÄÚ´æÖеÄMemtable£¬²»»áÔì³ÉÊý¾ÝµÄ¶ªÊ§¡£
µ±Memtable²åÈëµÄÊý¾ÝÕ¼ÓÃÄÚ´æµ½ÁËÒ»¸ö½çÏÞºó£¬ÐèÒª½«ÄÚ´æµÄ¼Ç¼µ¼³öµ½Íâ´æÎļþÖУ¬LevleDb»áÉú³ÉеÄLogÎļþºÍMemtable£¬ÔÏȵÄMemtable¾Í³ÉΪImmutable
Memtable£¬¹ËÃû˼Ò壬¾ÍÊÇ˵Õâ¸öMemtableµÄÄÚÈÝÊDz»¿É¸ü¸ÄµÄ£¬Ö»ÄܶÁ²»ÄÜдÈë»òÕßɾ³ý¡£Ðµ½À´µÄÊý¾Ý±»¼ÇÈëеÄLogÎļþºÍMemtable£¬LevelDbºǫ́µ÷¶È»á½«Immutable
MemtableµÄÊý¾Ýµ¼³öµ½´ÅÅÌ£¬ÐγÉÒ»¸öеÄSSTableÎļþ¡£SSTable¾ÍÊÇÓÉÄÚ´æÖеÄÊý¾Ý²»¶Ïµ¼³ö²¢½øÐÐCompaction²Ù×÷ºóÐγɵ쬶øÇÒSSTableµÄËùÓÐÎļþÊÇÒ»Öֲ㼶½á¹¹£¬µÚÒ»²ãΪLevel
0£¬µÚ¶þ²ãΪLevel 1£¬ÒÀ´ÎÀàÍÆ£¬²ã¼¶Öð½¥Ôö¸ß£¬ÕâÒ²ÊÇΪºÎ³ÆÖ®ÎªLevelDbµÄÔÒò¡£
SSTableÖеÄÎļþÊÇKeyÓÐÐòµÄ£¬¾ÍÊÇ˵ÔÚÎļþÖÐСkey¼Ç¼ÅÅÔÚ´óKey¼Ç¼֮ǰ£¬¸÷¸öLevelµÄSSTable¶¼ÊÇÈç´Ë£¬µ«ÊÇÕâÀïÐèҪעÒâµÄÒ»µãÊÇ£ºLevel
0µÄSSTableÎļþ£¨ºó׺Ϊ.sst£©ºÍÆäËüLevelµÄÎļþÏà±ÈÓÐÌØÊâÐÔ£ºÕâ¸ö²ã¼¶ÄÚµÄ.sstÎļþ£¬Á½¸öÎļþ¿ÉÄÜ´æÔÚkeyÖØµþ£¬±ÈÈçÓÐÁ½¸ölevel
0µÄsstÎļþ£¬ÎļþAºÍÎļþB£¬ÎļþAµÄkey·¶Î§ÊÇ£º{bar, car}£¬ÎļþBµÄKey·¶Î§ÊÇ{blue,samecity}£¬ÄÇôºÜ¿ÉÄÜÁ½¸öÎļþ¶¼´æÔÚkey=¡±blood¡±µÄ¼Ç¼¡£¶ÔÓÚÆäËüLevelµÄSSTableÎļþÀ´Ëµ£¬Ôò²»»á³öÏÖͬһ²ã¼¶ÄÚ.sstÎļþµÄkeyÖØµþÏÖÏ󣬾ÍÊÇ˵Level
LÖÐÈÎÒâÁ½¸ö.sstÎļþ£¬ÄÇô¿ÉÒÔ±£Ö¤ËüÃǵÄkeyÖµÊDz»»áÖØµþµÄ¡£ÕâµãÐèÒªÌØ±ð×¢Ò⣬ºóÃæÄú»á¿´µ½ºÜ¶à²Ù×÷µÄ²îÒì¶¼ÊÇÓÉÓÚÕâ¸öÔÒòÔì³ÉµÄ¡£
SSTableÖеÄij¸öÎļþÊôÓÚÌØ¶¨²ã¼¶£¬¶øÇÒÆä´æ´¢µÄ¼Ç¼ÊÇkeyÓÐÐòµÄ£¬ÄÇô±ØÈ»ÓÐÎļþÖеÄ×îСkeyºÍ×î´ókey£¬ÕâÊǷdz£ÖØÒªµÄÐÅÏ¢£¬LevelDbÓ¦¸Ã¼ÇÏÂÕâЩÐÅÏ¢¡£Manifest¾ÍÊǸÉÕâ¸öµÄ£¬Ëü¼ÇÔØÁËSSTable¸÷¸öÎļþµÄ¹ÜÀíÐÅÏ¢£¬±ÈÈçÊôÓÚÄĸöLevel£¬ÎļþÃû³Æ½Ðɶ£¬×îСkeyºÍ×î´ókey¸÷×ÔÊǶàÉÙ¡£ÏÂͼÊÇManifestËù´æ´¢ÄÚÈݵÄʾÒ⣺

ͼ2.1£ºManifest´æ´¢Ê¾Òâͼ
ͼÖÐÖ»ÏÔʾÁËÁ½¸öÎļþ£¨manifest»á¼ÇÔØËùÓÐSSTableÎļþµÄÕâЩÐÅÏ¢£©£¬¼´Level 0µÄtest.sst1ºÍtest.sst2Îļþ£¬Í¬Ê±¼ÇÔØÁËÕâЩÎļþ¸÷×Ô¶ÔÓ¦µÄkey·¶Î§£¬±ÈÈçtest.sstt1µÄkey·¶Î§ÊÇ¡°an¡±µ½
¡°banana¡±£¬¶øÎļþtest.sst2µÄkey·¶Î§ÊÇ¡°baby¡±µ½¡°samecity¡±£¬¿ÉÒÔ¿´³öÁ½ÕßµÄkey·¶Î§ÊÇÓÐÖØµþµÄ¡£
CurrentÎļþÊǸÉʲôµÄÄØ£¿Õâ¸öÎļþµÄÄÚÈÝÖ»ÓÐÒ»¸öÐÅÏ¢£¬¾ÍÊǼÇÔØµ±Ç°µÄmanifestÎļþÃû¡£ÒòΪÔÚLevleDbµÄÔËÐйý³ÌÖУ¬Ëæ×ÅCompactionµÄ½øÐУ¬SSTableÎļþ»á·¢Éú±ä»¯£¬»áÓÐеÄÎļþ²úÉú£¬ÀϵÄÎļþ±»·ÏÆú£¬ManifestÒ²»á¸ú×Å·´Ó³ÕâÖֱ仯£¬´ËʱÍùÍù»áÐÂÉú³ÉManifestÎļþÀ´¼ÇÔØÕâÖֱ仯£¬¶øCurrentÔòÓÃÀ´Ö¸³öÄĸöManifestÎļþ²ÅÊÇÎÒÃǹØÐĵÄÄǸöManifestÎļþ¡£
ÒÔÉϽéÉܵÄÄÚÈݾ͹¹³ÉÁËLevelDbµÄÕûÌ徲̬½á¹¹£¬ÔÚLevelDbÈÕ֪¼½ÓÏÂÀ´µÄÄÚÈÝÖУ¬ÎÒÃÇ»áÊ×ÏȽéÉÜÖØÒªÎļþ»òÕßÄÚ´æÊý¾ÝµÄ¾ßÌåÊý¾Ý²¼¾ÖÓë½á¹¹¡£
LevelDbÈÕ֪¼֮Èý£ºlogÎļþ
ÉϽÚÄÚÈݽ²µ½logÎļþÔÚLevelDbÖеÄÖ÷Òª×÷ÓÃÊÇϵͳ¹ÊÕϻָ´Ê±£¬Äܹ»±£Ö¤²»»á¶ªÊ§Êý¾Ý¡£ÒòΪÔÚ½«¼Ç¼дÈëÄÚ´æµÄMemtable֮ǰ£¬»áÏÈдÈëLogÎļþ£¬ÕâÑù¼´Ê¹ÏµÍ³·¢Éú¹ÊÕÏ£¬MemtableÖеÄÊý¾ÝûÓÐÀ´µÃ¼°Dumpµ½´ÅÅ̵ÄSSTableÎļþ£¬LevelDBÒ²¿ÉÒÔ¸ù¾ÝlogÎļþ»Ö¸´ÄÚ´æµÄMemtableÊý¾Ý½á¹¹ÄÚÈÝ£¬²»»áÔì³Éϵͳ¶ªÊ§Êý¾Ý£¬ÔÚÕâµãÉÏLevelDbºÍBigtableÊÇÒ»Öµġ£
ÏÂÃæÎÒÃÇ´ø´ó¼Ò¿´¿´logÎļþµÄ¾ßÌåÎïÀíºÍÂß¼²¼¾ÖÊÇÔõÑùµÄ£¬LevelDb¶ÔÓÚÒ»¸ölogÎļþ£¬»á°ÑËüÇиî³ÉÒÔ32KΪµ¥Î»µÄÎïÀíBlock£¬Ã¿´Î¶ÁÈ¡µÄµ¥Î»ÒÔÒ»¸öBlock×÷Ϊ»ù±¾¶ÁÈ¡µ¥Î»£¬ÏÂͼչʾµÄlogÎļþÓÉ3¸öBlock¹¹³É£¬ËùÒÔ´ÓÎïÀí²¼¾ÖÀ´½²£¬Ò»¸ölogÎļþ¾ÍÊÇÓÉÁ¬ÐøµÄ32K´óСBlock¹¹³ÉµÄ¡£

ͼ3.1 logÎļþ²¼¾Ö
ÔÚÓ¦ÓõÄÊÓÒ°ÀïÊÇ¿´²»µ½ÕâЩBlockµÄ£¬Ó¦Óÿ´µ½µÄÊÇһϵÁеÄKey:Value¶Ô£¬ÔÚLevelDbÄÚ²¿£¬»á½«Ò»¸öKey:Value¶Ô¿´×öÒ»Ìõ¼Ç¼µÄÊý¾Ý£¬ÁíÍâÔÚÕâ¸öÊý¾ÝǰÔö¼ÓÒ»¸ö¼Ç¼ͷ£¬ÓÃÀ´¼ÇÔØÒ»Ð©¹ÜÀíÐÅÏ¢£¬ÒÔ·½±ãÄÚ²¿´¦Àí£¬Í¼3.2ÏÔʾÁËÒ»¸ö¼Ç¼ÔÚLevelDbÄÚ²¿ÊÇÈçºÎ±íʾµÄ¡£

ͼ3.2 ¼Ç¼½á¹¹
¼Ç¼ͷ°üº¬Èý¸ö×ֶΣ¬ChechSumÊǶԡ°ÀàÐÍ¡±ºÍ¡°Êý¾Ý¡±×ֶεÄУÑéÂ룬ΪÁ˱ÜÃâ´¦Àí²»ÍêÕû»òÕßÊDZ»ÆÆ»µµÄÊý¾Ý£¬µ±LevelDb¶ÁÈ¡¼Ç¼Êý¾Ýʱºò»á¶ÔÊý¾Ý½øÐÐУÑ飬Èç¹û·¢Ïֺʹ洢µÄCheckSumÏàͬ£¬ËµÃ÷Êý¾ÝÍêÕûÎÞÆÆ»µ£¬¿ÉÒÔ¼ÌÐøºóÐøÁ÷³Ì¡£¡°¼Ç¼³¤¶È¡±¼ÇÔØÁËÊý¾ÝµÄ´óС£¬¡°Êý¾Ý¡±ÔòÊÇÉÏÃæ½²µÄKey:ValueÊýÖµ¶Ô£¬¡°ÀàÐÍ¡±×Ö¶ÎÔòÖ¸³öÁËÿÌõ¼Ç¼µÄÂß¼½á¹¹ºÍlogÎļþÎïÀí·Ö¿é½á¹¹Ö®¼äµÄ¹ØÏµ£¬¾ßÌå¶øÑÔ£¬Ö÷ÒªÓÐÒÔÏÂËÄÖÖÀàÐÍ£ºFULL/FIRST/MIDDLE/LAST¡£
Èç¹û¼Ç¼ÀàÐÍÊÇFULL£¬´ú±íÁ˵±Ç°¼Ç¼ÄÚÈÝÍêÕûµØ´æ´¢ÔÚÒ»¸öÎïÀíBlockÀûÓб»²»Í¬µÄÎïÀíBlockÇи£»Èç¹û¼Ç¼±»ÏàÁÚµÄÎïÀíBlockÇи£¬ÔòÀàÐÍ»áÊÇÆäËûÈýÖÖÀàÐÍÖеÄÒ»ÖÖ¡£ÎÒÃÇÒÔͼ3.1ËùʾµÄÀý×ÓÀ´¾ßÌå˵Ã÷¡£
¼ÙÉèĿǰ´æÔÚÈýÌõ¼Ç¼£¬Record A£¬Record BºÍRecord C£¬ÆäÖÐRecord A´óСΪ10K£¬Record
B ´óСΪ80K£¬Record C´óСΪ12K£¬ÄÇôÆäÔÚlogÎļþÖеÄÂß¼²¼¾Ö»áÈçͼ3.1Ëùʾ¡£Record
AÊÇͼÖÐÀ¶É«ÇøÓòËùʾ£¬ÒòΪ´óСΪ10K<32K£¬Äܹ»·ÅÔÚÒ»¸öÎïÀíBlockÖУ¬ËùÒÔÆäÀàÐÍΪFULL£»Record
B ´óСΪ80K£¬¶øBlock 1ÒòΪ·ÅÈëÁËRecord A£¬ËùÒÔ»¹Ê£ÏÂ22K£¬²»×ãÒÔ·ÅÏÂRecord
B£¬ËùÒÔÔÚBlock 1µÄÊ£Óಿ·Ö·ÅÈëRecord BµÄ¿ªÍ·Ò»²¿·Ö£¬ÀàÐͱêʶΪFIRST£¬´ú±íÁËÊÇÒ»¸ö¼Ç¼µÄÆðʼ²¿·Ö£»Record
B»¹ÓÐ58KûÓд洢£¬ÕâЩֻÄÜÒÀ´Î·ÅÔÚºóÐøµÄÎïÀíBlockÀïÃæ£¬ÒòΪBlock 2´óСֻÓÐ32K£¬ÈÔÈ»·Å²»ÏÂRecord
BµÄÊ£Óಿ·Ö£¬ËùÒÔBlock 2È«²¿ÓÃÀ´·ÅRecord B£¬ÇÒ±êʶÀàÐÍΪMIDDLE£¬Òâ˼ÊÇÕâÊÇRecord
BÖмäÒ»¶ÎÊý¾Ý£»Record BʣϵIJ¿·Ö¿ÉÒÔÍêÈ«·ÅÔÚBlock 3ÖУ¬ÀàÐͱêʶΪLAST£¬´ú±íÁËÕâÊÇRecord
BµÄĩβÊý¾Ý£»Í¼ÖлÆÉ«µÄRecord CÒòΪ´óСΪ12K£¬Block 3ʣϵĿռä×ãÒÔÈ«²¿·ÅÏÂËü£¬ËùÒÔÆäÀàÐͱêʶΪFULL¡£
´ÓÕâ¸öСÀý×Ó¿ÉÒÔ¿´³öÂß¼¼Ç¼ºÍÎïÀíBlockÖ®¼äµÄ¹ØÏµ£¬LevelDbÒ»´ÎÎïÀí¶ÁȡΪһ¸öBlock£¬È»ºó¸ù¾ÝÀàÐÍÇé¿öÆ´½Ó³öÂß¼¼Ç¼£¬¹©ºóÐøÁ÷³Ì´¦Àí¡£
LevelDbÈÕ֪¼֮ËÄ£ºSSTableÎļþ
SSTableÊÇBigtableÖÐÖÁ¹ØÖØÒªµÄÒ»¿é£¬¶ÔÓÚLevelDbÀ´ËµÒ²ÊÇÈç´Ë£¬¶ÔLevelDbµÄSSTableʵÏÖϸ½ÚµÄÁ˽âÒ²ÓÐÖúÓÚÁ˽âBigtableÖÐһЩʵÏÖϸ½Ú¡£
±¾½ÚÄÚÈÝÖ÷Òª½²ÊöSSTableµÄ¾²Ì¬²¼¾Ö½á¹¹£¬ÎÒÃÇÔøÔÚ¡°LevelDbÈÕ֪¼֮¶þ£ºÕûÌå¼Ü¹¹¡±ÖÐ˵¹ý£¬SSTableÎļþÐγÉÁ˲»Í¬LevelµÄ²ã¼¶½á¹¹£¬ÖÁÓÚÕâ¸ö²ã¼¶½á¹¹ÊÇÈçºÎÐγɵÄÎÒÃÇ·ÅÔÚºóÃæCompactionÒ»½Úϸ˵¡£±¾½ÚÖ÷Òª½éÉÜSSTableij¸öÎļþµÄÎïÀí²¼¾ÖºÍÂß¼²¼¾Ö½á¹¹£¬Õâ¶ÔÁ˽âLevelDbµÄÔËÐйý³ÌºÜÓаïÖú¡£
LevelDb²»Í¬²ã¼¶ÓкܶàSSTableÎļþ£¨ÒÔºó׺.sstÎªÌØÕ÷£©£¬ËùÓÐ.sstÎļþÄÚ²¿²¼¾Ö¶¼ÊÇÒ»ÑùµÄ¡£ÉϽڽéÉÜLogÎļþÊÇÎïÀí·Ö¿éµÄ£¬SSTableÒ²Ò»Ñù»á½«Îļþ»®·ÖΪ¹Ì¶¨´óСµÄÎïÀí´æ´¢¿é£¬µ«ÊÇÁ½ÕßÂß¼²¼¾Ö´ó²»Ïàͬ£¬¸ù±¾ÔÒòÊÇ£ºLogÎļþÖеļǼÊÇKeyÎÞÐòµÄ£¬¼´ÏȺó¼Ç¼µÄkey´óСûÓÐÃ÷È·´óС¹ØÏµ£¬¶ø.sstÎļþÄÚ²¿ÔòÊǸù¾Ý¼Ç¼µÄKeyÓÉСµ½´óÅÅÁе쬴ÓÏÂÃæ½éÉܵÄSSTable²¼¾Ö¿ÉÒÔÌå»áµ½KeyÓÐÐòÊÇΪºÎÈç´ËÉè¼Æ.sstÎļþ½á¹¹µÄ¹Ø¼ü¡£

ͼ4.1 .sstÎļþµÄ·Ö¿é½á¹¹
ͼ4.1չʾÁËÒ»¸ö.sstÎļþµÄÎïÀí»®·Ö½á¹¹£¬Í¬LogÎļþÒ»Ñù£¬Ò²ÊÇ»®·ÖΪ¹Ì¶¨´óСµÄ´æ´¢¿é£¬Ã¿¸öBlock·ÖΪÈý¸ö²¿·Ö£¬ºìÉ«²¿·ÖÊÇÊý¾Ý´æ´¢Çø£¬
À¶É«µÄTypeÇøÓÃÓÚ±êʶÊý¾Ý´æ´¢ÇøÊÇ·ñ²ÉÓÃÁËÊý¾ÝѹËõËã·¨£¨SnappyѹËõ»òÕßÎÞѹËõÁ½ÖÖ£©£¬CRC²¿·ÖÔòÊÇÊý¾ÝУÑéÂ룬ÓÃÓÚÅбðÊý¾ÝÊÇ·ñÔÚÉú³ÉºÍ´«ÊäÖгö´í¡£
ÒÔÉÏÊÇ.sstµÄÎïÀí²¼¾Ö£¬ÏÂÃæ½éÉÜ.sstÎļþµÄÂß¼²¼¾Ö£¬ËùνÂß¼²¼¾Ö£¬¾ÍÊÇ˵¾¡¹Ü´ó¼Ò¶¼ÊÇÎïÀí¿é£¬µ«ÊÇÿһ¿é´æ´¢Ê²Ã´ÄÚÈÝ£¬ÄÚ²¿ÓÖÓÐʲô½á¹¹µÈ¡£Í¼4.2չʾÁË.sstÎļþµÄÄÚ²¿Âß¼½âÊÍ¡£

ͼ4.2 Âß¼²¼¾Ö
´Óͼ4.2¿ÉÒÔ¿´³ö£¬´Ó´óµÄ·½Ã棬¿ÉÒÔ½«.sstÎļþ»®·ÖΪÊý¾Ý´æ´¢ÇøºÍÊý¾Ý¹ÜÀíÇø£¬Êý¾Ý´æ´¢Çø´æ·Åʵ¼ÊµÄKey:ValueÊý¾Ý£¬Êý¾Ý¹ÜÀíÇøÔòÌṩһЩË÷ÒýÖ¸ÕëµÈ¹ÜÀíÊý¾Ý£¬Ä¿µÄÊǸü¿ìËÙ±ã½ÝµÄ²éÕÒÏàÓ¦µÄ¼Ç¼¡£Á½¸öÇøÓò¶¼ÊÇÔÚÉÏÊöµÄ·Ö¿é»ù´¡Éϵ쬾ÍÊÇ˵ÎļþµÄÇ°ÃæÈô¸É¿éʵ¼Ê´æ´¢KVÊý¾Ý£¬ºóÃæÊý¾Ý¹ÜÀíÇø´æ´¢¹ÜÀíÊý¾Ý¡£¹ÜÀíÊý¾ÝÓÖ·ÖΪËÄÖÖ²»Í¬ÀàÐÍ£º×ÏÉ«µÄMeta
Block£¬ºìÉ«µÄMetaBlock Ë÷ÒýºÍÀ¶É«µÄÊý¾ÝË÷Òý¿éÒÔ¼°Ò»¸öÎļþβ²¿¿é¡£
LevelDb 1.2°æ¶ÔÓÚMeta BlockÉÐÎÞʵ¼ÊʹÓã¬Ö»ÊDZ£ÁôÁËÒ»¸ö½Ó¿Ú£¬¹À¼Æ»áÔÚºóÐø°æ±¾ÖмÓÈëÄÚÈÝ£¬ÏÂÃæÎÒÃÇ¿´¿´Êý¾ÝË÷ÒýÇøºÍÎļþβ²¿FooterµÄÄÚ²¿½á¹¹¡£

ͼ4.3 Êý¾ÝË÷Òý
ͼ4.3ÊÇÊý¾ÝË÷ÒýµÄÄÚ²¿½á¹¹Ê¾Òâͼ¡£ÔÙ´ÎÇ¿µ÷һϣ¬Data BlockÄÚµÄKV¼Ç¼Êǰ´ÕÕKeyÓÉСµ½´óÅÅÁеģ¬Êý¾ÝË÷ÒýÇøµÄÿÌõ¼Ç¼ÊǶÔij¸öData
Block½¨Á¢µÄË÷ÒýÐÅÏ¢£¬Ã¿ÌõË÷ÒýÐÅÏ¢°üº¬Èý¸öÄÚÈÝ£¬ÒÔͼ4.3ËùʾµÄÊý¾Ý¿éiµÄË÷ÒýIndex iÀ´Ëµ£ººìÉ«²¿·ÖµÄµÚÒ»¸ö×ֶμÇÔØ´óÓÚµÈÓÚÊý¾Ý¿éiÖÐ×î´óµÄKeyÖµµÄÄǸöKey£¬µÚ¶þ¸ö×Ö¶ÎÖ¸³öÊý¾Ý¿éiÔÚ.sstÎļþÖÐµÄÆðʼλÖ㬵ÚÈý¸ö×Ö¶ÎÖ¸³öData
Block iµÄ´óС£¨ÓÐʱºòÊÇÓÐÊý¾ÝѹËõµÄ£©¡£ºóÃæÁ½¸ö×ֶκÃÀí½â£¬ÊÇÓÃÓÚ¶¨Î»Êý¾Ý¿éÔÚÎļþÖеÄλÖõ쬵ÚÒ»¸ö×Ö¶ÎÐèÒªÏêϸ½âÊÍһϣ¬ÔÚË÷ÒýÀï±£´æµÄÕâ¸öKeyֵδ±ØÒ»¶¨ÊÇijÌõ¼Ç¼µÄKey,ÒÔͼ4.3µÄÀý×ÓÀ´Ëµ£¬¼ÙÉèÊý¾Ý¿éi
µÄ×îСKey=¡°samecity¡±£¬×î´óKey=¡°the best¡±;Êý¾Ý¿éi+1µÄ×îСKey=¡°the
fox¡±,×î´óKey=¡°zoo¡±,ÄÇô¶ÔÓÚÊý¾Ý¿éiµÄË÷ÒýIndex iÀ´Ëµ£¬ÆäµÚÒ»¸ö×ֶμÇÔØ´óÓÚµÈÓÚÊý¾Ý¿éiµÄ×î´óKey(¡°the
best¡±)ͬʱҪСÓÚÊý¾Ý¿éi+1µÄ×îСKey(¡°the fox¡±)£¬ËùÒÔÀý×ÓÖÐIndex iµÄµÚÒ»¸ö×Ö¶ÎÊÇ£º¡°the
c¡±£¬Õâ¸öÊÇÂú×ãÒªÇóµÄ£»¶øIndex i+1µÄµÚÒ»¸ö×Ö¶ÎÔòÊÇ¡°zoo¡±£¬¼´Êý¾Ý¿éi+1µÄ×î´óKey¡£
ÎļþĩβFooter¿éµÄÄÚ²¿½á¹¹¼ûͼ4.4£¬metaindex_handleÖ¸³öÁËmetaindex
blockµÄÆðʼλÖúʹóС£»inex_handleÖ¸³öÁËindex BlockµÄÆðʼµØÖ·ºÍ´óС£»ÕâÁ½¸ö×ֶοÉÒÔÀí½âΪË÷ÒýµÄË÷Òý£¬ÊÇΪÁËÕýÈ·¶Á³öË÷ÒýÖµ¶øÉèÁ¢µÄ£¬ºóÃæ¸ú×ÅÒ»¸öÌî³äÇøºÍħÊý¡£

ͼ4.4 Footer
ÉÏÃæÖ÷Òª½éÉܵÄÊÇÊý¾Ý¹ÜÀíÇøµÄÄÚ²¿½á¹¹£¬ÏÂÃæÎÒÃÇ¿´¿´Êý¾ÝÇøµÄÒ»¸öBlockµÄÊý¾Ý²¿·ÖÄÚ²¿ÊÇÈçºÎ²¼¾ÖµÄ£¨Í¼4.1ÖеĺìÉ«²¿·Ö£©£¬Í¼4.5ÊÇÆäÄÚ²¿²¼¾ÖʾÒâͼ¡£

ͼ4.5 Êý¾ÝBlockÄÚ²¿½á¹¹
´ÓͼÖпÉÒÔ¿´³ö£¬ÆäÄÚ²¿Ò²·ÖΪÁ½¸ö²¿·Ö£¬Ç°ÃæÊÇÒ»¸ö¸öKV¼Ç¼£¬Æä˳ÐòÊǸù¾ÝKeyÖµÓÉСµ½´óÅÅÁеģ¬ÔÚBlockβ²¿ÔòÊÇһЩ¡°ÖØÆôµã¡±£¨Restart
Point£©,ÆäʵÊÇһЩָÕ룬ָ³öBlockÄÚÈÝÖеÄһЩ¼Ç¼λÖá£
¡°ÖØÆôµã¡±ÊǸÉʲôµÄÄØ£¿ÎÒÃÇÒ»ÔÙÇ¿µ÷£¬BlockÄÚÈÝÀïµÄKV¼Ç¼Êǰ´ÕÕKey´óСÓÐÐòµÄ£¬ÕâÑùµÄ»°£¬ÏàÁÚµÄÁ½Ìõ¼Ç¼ºÜ¿ÉÄÜKey²¿·Ö´æÔÚÖØµþ£¬±ÈÈçkey
i=¡°the Car¡±£¬Key i+1=¡°the color¡±,ÄÇôÁ½Õß´æÔÚÖØµþ²¿·Ö¡°the c¡±£¬ÎªÁ˼õÉÙKeyµÄ´æ´¢Á¿£¬Key
i+1¿ÉÒÔÖ»´æ´¢ºÍÉÏÒ»ÌõKey²»Í¬µÄ²¿·Ö¡°olor¡±£¬Á½ÕߵĹ²Í¬²¿·Ö´ÓKey iÖпÉÒÔ»ñµÃ¡£¼Ç¼µÄKeyÔÚBlockÄÚÈݲ¿·Ö¾ÍÊÇÕâô´æ´¢µÄ£¬Ö÷ҪĿµÄÊǼõÉÙ´æ´¢¿ªÏú¡£¡°ÖØÆôµã¡±µÄÒâ˼ÊÇ£ºÔÚÕâÌõ¼Ç¼¿ªÊ¼£¬²»ÔÙ²Éȡֻ¼ÇÔØ²»Í¬µÄKey²¿·Ö£¬¶øÊÇÖØÐ¼Ç¼ËùÓеÄKeyÖµ£¬¼ÙÉèKey
i+1ÊÇÒ»¸öÖØÆôµã£¬ÄÇôKeyÀïÃæ»áÍêÕû´æ´¢¡°the color¡±£¬¶ø²»ÊDzÉÓüòÂԵġ°olor¡±·½Ê½¡£Blockβ²¿¾ÍÊÇÖ¸³öÄÄЩ¼Ç¼ÊÇÕâÐ©ÖØÆôµãµÄ¡£

ͼ4.6 ¼Ç¼¸ñʽ
ÔÚBlockÄÚÈÝÇø£¬Ã¿¸öKV¼Ç¼µÄÄÚ²¿½á¹¹ÊÇÔõÑùµÄ£¿Í¼4.6¸ø³öÁËÆäÏêϸ½á¹¹£¬Ã¿¸ö¼Ç¼°üº¬5¸ö×ֶΣºkey¹²Ïí³¤¶È£¬±ÈÈçÉÏÃæµÄ¡°olor¡±¼Ç¼£¬
ÆäkeyºÍÉÏÒ»Ìõ¼Ç¼¹²ÏíµÄKey²¿·Ö³¤¶ÈÊÇ¡°the c¡±µÄ³¤¶È£¬¼´5£»key·Ç¹²Ïí³¤¶È£¬¶ÔÓÚ¡°olor¡±À´Ëµ£¬ÊÇ4£»value³¤¶ÈÖ¸³öKey:ValueÖÐValueµÄ³¤¶È£¬ÔÚºóÃæµÄValueÄÚÈÝ×Ö¶ÎÖд洢ʵ¼ÊµÄValueÖµ£»¶økey·Ç¹²ÏíÄÚÈÝÔòʵ¼Ê´æ´¢¡°olor¡±Õâ¸öKey×Ö·û´®¡£
ÉÏÃæ½²µÄÕâЩ¾ÍÊÇ.sstÎļþµÄÈ«²¿ÄÚ²¿°ÂÃØ¡£
LevelDbÈÕ֪¼֮Î壺MemTableÏê½â
LevelDbÈÕ֪¼ǰÊöС½Ú´óÖ½²ÊöÁË´ÅÅÌÎļþÏà¹ØµÄÖØÒª¾²Ì¬½á¹¹£¬±¾Ð¡½Ú½²ÊöÄÚ´æÖеÄÊý¾Ý½á¹¹Memtable£¬MemtableÔÚÕû¸öÌåϵÖеÄÖØÒªµØÎ»Ò²²»ÑÔ¶øÓ÷¡£×ÜÌå¶øÑÔ£¬ËùÓÐKVÊý¾Ý¶¼ÊÇ´æ´¢ÔÚMemtable£¬Immutable
MemtableºÍSSTableÖеģ¬Immutable Memtable´Ó½á¹¹ÉϽ²ºÍMemtableÊÇÍêȫһÑùµÄ£¬Çø±ð½ö½öÔÚÓÚÆäÊÇÖ»¶ÁµÄ£¬²»ÔÊÐíдÈë²Ù×÷£¬¶øMemtableÔòÊÇÔÊÐíдÈëºÍ¶ÁÈ¡µÄ¡£µ±MemtableдÈëµÄÊý¾ÝÕ¼ÓÃÄÚ´æµ½´ïÖ¸¶¨ÊýÁ¿£¬Ôò×Ô¶¯×ª»»ÎªImmutable
Memtable£¬µÈ´ýDumpµ½´ÅÅÌÖУ¬ÏµÍ³»á×Ô¶¯Éú³ÉеÄMemtable¹©Ð´²Ù×÷дÈëÐÂÊý¾Ý£¬Àí½âÁËMemtable£¬ÄÇôImmutable
Memtable×ÔÈ»²»ÔÚ»°Ï¡£
LevelDbµÄMemTableÌṩÁ˽«KVÊý¾ÝдÈ룬ɾ³ýÒÔ¼°¶ÁÈ¡KV¼Ç¼µÄ²Ù×÷½Ó¿Ú£¬µ«ÊÇÊÂʵÉÏMemtable²¢²»´æÔÚÕæÕýµÄɾ³ý²Ù×÷,ɾ³ýij¸öKeyµÄValueÔÚMemtableÄÚÊÇ×÷Ϊ²åÈëÒ»Ìõ¼Ç¼ʵʩµÄ£¬µ«ÊÇ»á´òÉÏÒ»¸öKeyµÄɾ³ý±ê¼Ç£¬ÕæÕýµÄɾ³ý²Ù×÷ÊÇLazyµÄ£¬»áÔÚÒÔºóµÄCompaction¹ý³ÌÖÐÈ¥µôÕâ¸öKV¡£
ÐèҪעÒâµÄÊÇ£¬LevelDbµÄMemtableÖÐKV¶ÔÊǸù¾ÝKey´óСÓÐÐò´æ´¢µÄ£¬ÔÚϵͳ²åÈëеÄKVʱ£¬LevelDbÒª°ÑÕâ¸öKV²åµ½ºÏÊʵÄλÖÃÉÏÒÔ±£³ÖÕâÖÖKeyÓÐÐòÐÔ¡£Æäʵ£¬LevelDbµÄMemtableÀàÖ»ÊÇÒ»¸ö½Ó¿ÚÀà£¬ÕæÕýµÄ²Ù×÷ÊÇͨ¹ý±³ºóµÄSkipListÀ´×öµÄ£¬°üÀ¨²åÈë²Ù×÷ºÍ¶ÁÈ¡²Ù×÷µÈ£¬ËùÒÔMemtableµÄºËÐÄÊý¾Ý½á¹¹ÊÇÒ»¸öSkipList¡£
SkipListÊÇÓÉWilliam Pugh·¢Ã÷¡£ËûÔÚCommunications of the
ACM June 1990, 33(6) 668-676 ·¢±íÁËSkip lists: a probabilistic
alternative to balanced trees£¬ÔÚ¸ÃÂÛÎÄÖÐÏêϸ½âÊÍÁËSkipListµÄÊý¾Ý½á¹¹ºÍ²åÈëɾ³ý²Ù×÷¡£
SkipListÊÇÆ½ºâÊ÷µÄÒ»ÖÖÌæ´úÊý¾Ý½á¹¹£¬µ«ÊǺͺìºÚÊ÷²»ÏàͬµÄÊÇ£¬SkipList¶ÔÓÚÊ÷µÄƽºâµÄʵÏÖÊÇ»ùÓÚÒ»ÖÖËæ»ú»¯µÄËã·¨µÄ£¬ÕâÑùÒ²¾ÍÊÇ˵SkipListµÄ²åÈëºÍɾ³ýµÄ¹¤×÷ÊDZȽϼòµ¥µÄ¡£
¹ØÓÚSkipListµÄÏêϸ½éÉÜ¿ÉÒԲο¼ÕâÆªÎÄÕ£ºhttp://www.cnblogs.com/xuqiang/archive/2011/05/22/2053516.html£¬½²ÊöµÄºÜÇå³þ£¬LevelDbµÄSkipList»ù±¾ÉÏÊÇÒ»¸ö¾ßÌåʵÏÖ£¬²¢ÎÞÌØÊâÖ®´¦¡£
SkipList²»½öÊÇά»¤ÓÐÐòÊý¾ÝµÄÒ»¸ö¼òµ¥ÊµÏÖ£¬¶øÇÒÏà±È½ÏƽºâÊ÷À´Ëµ£¬ÔÚ²åÈëÊý¾ÝµÄʱºò¿ÉÒÔ±ÜÃâÆµ·±µÄÊ÷½Úµãµ÷Õû²Ù×÷£¬ËùÒÔдÈëЧÂÊÊǺܸߵģ¬LevelDbÕûÌå¶øÑÔÊǸö¸ßдÈëϵͳ£¬SkipListÔÚÆäÖÐÓ¦¸ÃÒ²Æðµ½Á˺ÜÖØÒªµÄ×÷Óá£RedisΪÁ˼ӿì²åÈë²Ù×÷£¬Ò²Ê¹ÓÃÁËSkipListÀ´×÷ΪÄÚ²¿ÊµÏÖÊý¾Ý½á¹¹¡£
LevelDbÈÕ֪¼֮Áù дÈëÓëɾ³ý¼Ç¼
ÔÚ֮ǰµÄÎå½ÚLevelDbÈÕ֪¼ÖУ¬ÎÒÃǽéÉÜÁËLevelDbµÄһЩ¾²Ì¬Îļþ¼°ÆäÏêϸ²¼¾Ö£¬´Ó±¾½Ú¿ªÊ¼£¬ÎÒÃÇ¿´¿´LevelDbµÄһЩ¶¯Ì¬²Ù×÷£¬±ÈÈç¶Áд¼Ç¼£¬Compaction£¬´íÎó»Ö¸´µÈ²Ù×÷¡£
±¾½Ú½éÉÜlevelDbµÄ¼Ç¼¸üвÙ×÷£¬¼´²åÈëÒ»ÌõKV¼Ç¼»òÕßɾ³ýÒ»ÌõKV¼Ç¼¡£levelDbµÄ¸üвÙ×÷ËÙ¶ÈÊǷdz£¿ìµÄ£¬Ô´ÓÚÆäÄÚ²¿»úÖÆ¾ö¶¨ÁËÕâÖÖ¸üвÙ×÷µÄ¼òµ¥ÐÔ¡£

ͼ6.1 LevelDbдÈë¼Ç¼
ͼ6.1ÊÇlevelDbÈçºÎ¸üÐÂKVÊý¾ÝµÄʾÒâͼ£¬´ÓͼÖпÉÒÔ¿´³ö£¬¶ÔÓÚÒ»¸ö²åÈë²Ù×÷Put(Key,Value)À´Ëµ£¬Íê³É²åÈë²Ù×÷°üº¬Á½¸ö¾ßÌå²½Ö裺Ê×ÏÈÊǽ«ÕâÌõKV¼Ç¼ÒÔ˳ÐòдµÄ·½Ê½×·¼Óµ½Ö®Ç°½éÉܹýµÄlogÎļþĩ⣬ÒòΪ¾¡¹ÜÕâÊÇÒ»¸ö´ÅÅ̶Áд²Ù×÷£¬µ«ÊÇÎļþµÄ˳Ðò×·¼ÓдÈëЧÂÊÊǺܸߵģ¬ËùÒÔ²¢²»»áµ¼ÖÂдÈëËٶȵĽµµÍ£»µÚ¶þ¸ö²½ÖèÊÇ:Èç¹ûдÈëlogÎļþ³É¹¦£¬ÄÇô½«ÕâÌõKV¼Ç¼²åÈëÄÚ´æÖеÄMemtableÖУ¬Ç°Ãæ½éÉܹý£¬MemtableÖ»ÊÇÒ»²ã·â×°£¬ÆäÄÚ²¿ÆäʵÊÇÒ»¸öKeyÓÐÐòµÄSkipListÁÐ±í£¬²åÈëÒ»ÌõмǼµÄ¹ý³ÌÒ²ºÜ¼òµ¥£¬¼´ÏȲéÕÒºÏÊʵIJåÈëλÖã¬È»ºóÐÞ¸ÄÏàÓ¦µÄÁ´½ÓÖ¸Õ뽫мǼ²åÈë¼´¿É¡£Íê³ÉÕâÒ»²½£¬Ð´Èë¼Ç¼¾ÍËãÍê³ÉÁË£¬ËùÒÔÒ»¸ö²åÈë¼Ç¼²Ù×÷Éæ¼°Ò»´Î´ÅÅÌÎļþ×·¼ÓдºÍÄÚ´æSkipList²åÈë²Ù×÷£¬ÕâÊÇΪºÎlevelDbдÈëËÙ¶ÈÈç´Ë¸ßЧµÄ¸ù±¾ÔÒò¡£
´ÓÉÏÃæµÄ½éÉܹý³ÌÖÐÒ²¿ÉÒÔ¿´³ö£ºlogÎļþÄÚÊÇkeyÎÞÐòµÄ£¬¶øMemtableÖÐÊÇkeyÓÐÐòµÄ¡£ÄÇôÈç¹ûÊÇɾ³ýÒ»ÌõKV¼ÇÂ¼ÄØ£¿¶ÔÓÚlevelDbÀ´Ëµ£¬²¢²»´æÔÚÁ¢¼´É¾³ýµÄ²Ù×÷£¬¶øÊÇÓë²åÈë²Ù×÷ÏàͬµÄ£¬Çø±ðÊÇ£¬²åÈë²Ù×÷²åÈëµÄÊÇKey:Value
Öµ£¬¶øÉ¾³ý²Ù×÷²åÈëµÄÊÇ¡°Key:ɾ³ý±ê¼Ç¡±£¬²¢²»ÕæÕýȥɾ³ý¼Ç¼£¬¶øÊǺǫ́CompactionµÄʱºò²ÅÈ¥×öÕæÕýµÄɾ³ý²Ù×÷¡£
levelDbµÄдÈë²Ù×÷¾ÍÊÇÈç´Ë¼òµ¥¡£ÕæÕýµÄÂé·³ÔÚºóÃæ½«Òª½éÉܵĶÁÈ¡²Ù×÷ÖС£
LevelDbÈÕ֪¼֮Æß£º¶ÁÈ¡¼Ç¼
LevelDbÊÇÕë¶Ô´ó¹æÄ£Key/ValueÊý¾ÝµÄµ¥»ú´æ´¢¿â£¬´ÓÓ¦ÓõĽǶÈÀ´¿´£¬LevelDb¾ÍÊÇÒ»¸ö´æ´¢¹¤¾ß¡£¶ø×÷Ϊ³ÆÖ°µÄ´æ´¢¹¤¾ß£¬³£¼ûµÄµ÷ÓýӿÚÎÞ·ÇÊÇÐÂÔöKV£¬É¾³ýKV£¬¶ÁÈ¡KV£¬¸üÐÂKey¶ÔÓ¦µÄValueÖµÕâô¼¸ÖÖ²Ù×÷¡£LevelDbµÄ½Ó¿ÚûÓÐÖ±½ÓÖ§³Ö¸üвÙ×÷µÄ½Ó¿Ú£¬Èç¹ûÐèÒª¸üÐÂij¸öKeyµÄValue,Äã¿ÉÒÔÑ¡ÔñÖ±½ÓÉúÃ͵زåÈëеÄKV£¬±£³ÖKeyÏàͬ£¬ÕâÑùϵͳÄÚµÄkey¶ÔÓ¦µÄvalue¾Í»á±»¸üУ»»òÕßÄã¿ÉÒÔÏÈɾ³ý¾ÉµÄKV£¬
Ö®ºóÔÙ²åÈëеÄKV£¬ÕâÑù±È½ÏίÍñµØÍê³ÉKVµÄ¸üвÙ×÷¡£
¼ÙÉèÓ¦ÓÃÌá½»Ò»¸öKeyÖµ£¬ÏÂÃæÎÒÃÇ¿´¿´LevelDbÊÇÈçºÎ´Ó´æ´¢µÄÊý¾ÝÖжÁ³öÆä¶ÔÓ¦µÄValueÖµµÄ¡£Í¼7-1ÊÇLevelDb¶ÁÈ¡¹ý³ÌµÄÕûÌåʾÒâͼ¡£

ͼ7-1 LevelDb¶ÁÈ¡¼Ç¼Á÷³Ì
LevelDbÊ×ÏÈ»áÈ¥²é¿´ÄÚ´æÖеÄMemtable£¬Èç¹ûMemtableÖаüº¬key¼°Æä¶ÔÓ¦µÄvalue£¬Ôò·µ»ØvalueÖµ¼´¿É£»Èç¹ûÔÚMemtableûÓжÁµ½key£¬Ôò½ÓÏÂÀ´µ½Í¬Ñù´¦ÓÚÄÚ´æÖеÄImmutable
MemtableÖÐÈ¥¶ÁÈ¡£¬ÀàËÆµØ£¬Èç¹û¶Áµ½¾Í·µ»Ø£¬ÈôÊÇûÓжÁµ½,ÄÇôֻÄÜÍò°ãÎÞÄÎÏ´ӴÅÅÌÖеĴóÁ¿SSTableÎļþÖвéÕÒ¡£ÒòΪSSTableÊýÁ¿½Ï¶à£¬¶øÇҷֳɶà¸öLevel£¬ËùÒÔÔÚSSTableÖжÁÊý¾ÝÊÇÏ൱òêÑÑÇúÕÛµÄÒ»¶ÎÂó̡£×ܵĶÁÈ¡ÔÔòÊÇÕâÑùµÄ£ºÊ×ÏÈ´ÓÊôÓÚlevel
0µÄÎļþÖвéÕÒ£¬Èç¹ûÕÒµ½Ôò·µ»Ø¶ÔÓ¦µÄvalueÖµ£¬Èç¹ûûÓÐÕÒµ½ÄÇôµ½level 1ÖеÄÎļþÖÐÈ¥ÕÒ£¬Èç´ËÑ»·Íù¸´£¬Ö±µ½ÔÚij²ãSSTableÎļþÖÐÕÒµ½Õâ¸ökey¶ÔÓ¦µÄvalueΪֹ£¨»òÕ߲鵽×î¸ßlevel£¬²éÕÒʧ°Ü£¬ËµÃ÷Õû¸öϵͳÖв»´æÔÚÕâ¸öKey)¡£
ÄÇôΪʲôÊÇ´ÓMemtableµ½Immutable Memtable£¬ÔÙ´ÓImmutable Memtableµ½Îļþ£¬¶øÎļþÖÐΪºÎÊÇ´ÓµÍlevelµ½¸ßlevelÕâôһ¸ö²éѯ·¾¶ÄØ£¿µÀÀíºÎÔÚ£¿Ö®ËùÒÔÑ¡ÔñÕâô¸ö²éѯ·¾¶£¬ÊÇÒòΪ´ÓÐÅÏ¢µÄ¸üÐÂʱ¼äÀ´Ëµ£¬ºÜÃ÷ÏÔMemtable´æ´¢µÄÊÇ×îÐÂÏʵÄKV¶Ô£»Immutable
MemtableÖд洢µÄKVÊý¾Ý¶ÔµÄÐÂÏʳ̶ȴÎÖ®£»¶øËùÓÐSSTableÎļþÖеÄKVÊý¾ÝÐÂÏʳ̶ÈÒ»¶¨²»ÈçÄÚ´æÖеÄMemtableºÍImmutable
MemtableµÄ¡£¶ÔÓÚSSTableÎļþÀ´Ëµ£¬Èç¹ûͬʱÔÚlevel LºÍLevel L+1ÕÒµ½Í¬Ò»¸ökey£¬level
LµÄÐÅÏ¢Ò»¶¨±Èlevel L+1µÄҪС£Ò²¾ÍÊÇ˵£¬ÉÏÃæÁгöµÄ²éÕÒ·¾¶¾ÍÊǰ´ÕÕÊý¾ÝÐÂÏʳ̶ÈÅÅÁгöÀ´µÄ£¬Ô½ÐÂÏʵÄÔ½ÏȲéÕÒ¡£
ΪɶҪÓÅÏȲéÕÒÐÂÏʵÄÊý¾ÝÄØ£¿Õâ¸öµÀÀí²»ÑÔ¶øÓ÷£¬¾Ù¸öÀý×Ó¡£±ÈÈçÎÒÃÇÏÈÍùlevelDbÀïÃæ²åÈëÒ»ÌõÊý¾Ý
{key="www.samecity.com" value="ÎÒÃÇ"},¹ýÁ˼¸Ì죬samecityÍøÕ¾¸ÄÃûΪ£º69ͬ³Ç£¬´ËʱÎÒÃDzåÈëÊý¾Ý{key="www.samecity.com"
value="69ͬ³Ç"}£¬Í¬ÑùµÄkey,²»Í¬µÄvalue£»Âß¼ÉÏÀí½âºÃÏñlevelDbÖÐÖ»ÓÐÒ»¸ö´æ´¢¼Ç¼£¬¼´µÚ¶þ¸ö¼Ç¼£¬µ«ÊÇÔÚlevelDbÖкܿÉÄÜ´æÔÚÁ½Ìõ¼Ç¼£¬¼´ÉÏÃæµÄÁ½¸ö¼Ç¼¶¼ÔÚlevelDbÖд洢ÁË£¬´ËʱÈç¹ûÓû§²éѯkey="www.samecity.com",ÎÒÃǵ±È»Ï£ÍûÕÒµ½×îеĸüмǼ£¬Ò²¾ÍÊǵڶþ¸ö¼Ç¼·µ»Ø£¬Õâ¾ÍÊÇΪºÎÒªÓÅÏȲéÕÒÐÂÏÊÊý¾ÝµÄÔÒò¡£
ǰÎÄÓн²£º¶ÔÓÚSSTableÎļþÀ´Ëµ£¬Èç¹ûͬʱÔÚlevel LºÍLevel L+1ÕÒµ½Í¬Ò»¸ökey£¬level
LµÄÐÅÏ¢Ò»¶¨±Èlevel L+1µÄҪС£ÕâÊÇÒ»¸ö½áÂÛ£¬ÀíÂÛÉÏÐèÒªÒ»¸öÖ¤Ã÷¹ý³Ì£¬·ñÔò»áÕÐÖÂÈçϵÄÎÊÌ⣺ΪÉñÂíÄØ£¿´ÓµÀÀíÉϽ²ÄØ£¬ºÜÃ÷°×£ºÒòΪLevel
L+1µÄÊý¾Ý²»ÊÇ´Óʯͷ·ìÀï±Ä³öÀ´µÄ£¬Ò²²»ÊÇ×öÃÎÃε½µÄ£¬ÄÇËüÊÇ´ÓÄÄÀïÀ´µÄ£¿Level L+1µÄÊý¾ÝÊÇ´ÓLevel
L ¾¹ýCompactionºóµÃµ½µÄ£¨Èç¹ûÄú²»ÖªµÀʲôÊÇCompaction£¬ÄÇô........Ò²ÐíÒÔºó»áÖªµÀµÄ£©£¬Ò²¾ÍÊÇ˵£¬Äú¿´µ½µÄÏÖÔÚµÄLevel
L+1²ãµÄSSTableÊý¾ÝÊÇ´ÓÔÀ´µÄLevel LÖÐÀ´µÄ£¬ÏÖÔÚµÄLevel L±ÈÔÀ´µÄLevel LÊý¾ÝÒªÐÂÏÊ£¬ËùÒÔ¿ÉÖ¤£¬ÏÖÔÚµÄLevel
L±ÈÏÖÔÚµÄLevel L+1µÄÊý¾ÝÒªÐÂÏÊ¡£
SSTableÎļþºÜ¶à£¬ÈçºÎ¿ìËÙµØÕÒµ½key¶ÔÓ¦µÄvalueÖµ£¿ÔÚLevelDbÖУ¬level 0Ò»Ö±¶¼°®¸ãÌØÊ⻯£¬ÔÚlevel
0ºÍÆäËülevelÖвéÕÒij¸ökeyµÄ¹ý³ÌÊDz»Ò»ÑùµÄ¡£ÒòΪlevel 0ϵIJ»Í¬Îļþ¿ÉÄÜkeyµÄ·¶Î§ÓÐÖØµþ£¬Ä³¸öÒª²éѯµÄkeyÓпÉÄܶà¸öÎļþ¶¼°üº¬£¬ÕâÑùµÄ»°LevelDbµÄ²ßÂÔÊÇÏÈÕÒ³ölevel
0ÖÐÄÄЩÎļþ°üº¬Õâ¸ökey£¨manifestÎļþÖмÇÔØÁËlevelºÍ¶ÔÓ¦µÄÎļþ¼°ÎļþÀïkeyµÄ·¶Î§ÐÅÏ¢£¬LevelDbÔÚÄÚ´æÖб£ÁôÕâÖÖÓ³Éä±í£©£¬
Ö®ºó°´ÕÕÎļþµÄÐÂÏʳ̶ÈÅÅÐò£¬ÐµÄÎļþÅÅÔÚÇ°Ãæ£¬Ö®ºóÒÀ´Î²éÕÒ£¬¶Á³ökey¶ÔÓ¦µÄvalue¡£¶øÈç¹ûÊÇ·Çlevel
0µÄ»°£¬ÒòΪÕâ¸ölevelµÄÎļþÖ®¼äkeyÊDz»ÖصþµÄ£¬ËùÒÔÖ»´ÓÒ»¸öÎļþ¾Í¿ÉÒÔÕÒµ½key¶ÔÓ¦µÄvalue¡£
×îºóÒ»¸öÎÊÌâ,Èç¹û¸ø¶¨Ò»¸öÒª²éѯµÄkeyºÍij¸ökey range°üº¬Õâ¸ökeyµÄSSTableÎļþ£¬ÄÇôlevelDbÊÇÈçºÎ½øÐоßÌå²éÕÒ¹ý³ÌµÄÄØ£¿levelDbÒ»°ã»áÏÈÔÚÄÚ´æÖеÄCacheÖвéÕÒÊÇ·ñ°üº¬Õâ¸öÎļþµÄ»º´æ¼Ç¼£¬Èç¹û°üº¬£¬Ôò´Ó»º´æÖжÁÈ¡£»Èç¹û²»°üº¬£¬Ôò´ò¿ªSSTableÎļþ£¬Í¬Ê±½«Õâ¸öÎļþµÄË÷Òý²¿·Ö¼ÓÔØµ½ÄÚ´æÖв¢·ÅÈëCacheÖС£
ÕâÑùCacheÀïÃæ¾ÍÓÐÁËÕâ¸öSSTableµÄ»º´æÏµ«ÊÇÖ»ÓÐË÷Òý²¿·ÖÔÚÄÚ´æÖУ¬Ö®ºólevelDb¸ù¾ÝË÷Òý¿ÉÒÔ¶¨Î»µ½ÄĸöÄÚÈÝBlock»á°üº¬ÕâÌõkey£¬´ÓÎļþÖжÁ³öÕâ¸öBlockµÄÄÚÈÝ£¬ÔÚ¸ù¾Ý¼Ç¼һһ±È½Ï£¬Èç¹ûÕÒµ½Ôò·µ»Ø½á¹û£¬Èç¹ûûÓÐÕÒµ½£¬ÄÇô˵Ã÷Õâ¸ölevelµÄSSTableÎļþ²¢²»°üº¬Õâ¸ökey£¬ËùÒÔµ½ÏÂÒ»¼¶±ðµÄSSTableÖÐÈ¥²éÕÒ¡£
´Ó֮ǰ½éÉܵÄLevelDbµÄд²Ù×÷ºÍÕâÀï½éÉܵĶÁ²Ù×÷¿ÉÒÔ¿´³ö£¬Ïà¶Ôд²Ù×÷£¬¶Á²Ù×÷´¦ÀíÆðÀ´Òª¸´ÔӺܶ࣬ËùÒÔдµÄËٶȱØÈ»ÒªÔ¶Ô¶¸ßÓÚ¶ÁÊý¾ÝµÄËÙ¶È£¬Ò²¾ÍÊÇ˵£¬LevelDb±È½ÏÊʺÏд²Ù×÷¶àÓÚ¶Á²Ù×÷µÄÓ¦Óó¡ºÏ¡£¶øÈç¹ûÓ¦ÓÃÊǺܶà¶Á²Ù×÷ÀàÐ͵ģ¬ÄÇô˳Ðò¶ÁȡЧÂÊ»á±È½Ï¸ß£¬ÒòΪÕâÑù´ó²¿·ÖÄÚÈݶ¼»áÔÚ»º´æÖÐÕÒµ½£¬¾¡¿ÉÄܱÜÃâ´óÁ¿µÄËæ»ú¶ÁÈ¡²Ù×÷¡£
LevelDbÈÕ֪¼֮°Ë£ºCompaction²Ù×÷
ǰÎÄÓÐÊö£¬¶ÔÓÚLevelDbÀ´Ëµ£¬Ð´Èë¼Ç¼²Ù×÷ºÜ¼òµ¥£¬É¾³ý¼Ç¼½ö½öдÈëÒ»¸öɾ³ý±ê¼Ç¾ÍËãÍêÊ£¬µ«ÊǶÁÈ¡¼Ç¼±È½Ï¸´ÔÓ£¬ÐèÒªÔÚÄÚ´æÒÔ¼°¸÷¸ö²ã¼¶ÎļþÖÐÒÀÕÕÐÂÏʳ̶ÈÒÀ´Î²éÕÒ£¬´ú¼ÛºÜ¸ß¡£ÎªÁ˼ӿì¶ÁÈ¡ËÙ¶È£¬levelDb²ÉÈ¡ÁËcompactionµÄ·½Ê½À´¶ÔÒÑÓеļǼ½øÐÐÕûÀíѹËõ£¬Í¨¹ýÕâÖÖ·½Ê½£¬À´É¾³ýµôһЩ²»ÔÙÓÐЧµÄKVÊý¾Ý£¬¼õСÊý¾Ý¹æÄ££¬¼õÉÙÎļþÊýÁ¿µÈ¡£
levelDbµÄcompaction»úÖÆºÍ¹ý³ÌÓëBigtableËù½²ÊöµÄÊÇ»ù±¾Ò»Öµģ¬BigtableÖн²µ½ÈýÖÖÀàÐ͵Äcompaction:
minor £¬majorºÍfull¡£Ëùνminor Compaction£¬¾ÍÊǰÑmemtableÖеÄÊý¾Ýµ¼³öµ½SSTableÎļþÖУ»major
compaction¾ÍÊǺϲ¢²»Í¬²ã¼¶µÄSSTableÎļþ£¬¶øfull compaction¾ÍÊǽ«ËùÓÐSSTable½øÐкϲ¢¡£
LevelDb°üº¬ÆäÖÐÁ½ÖÖ£¬minorºÍmajor¡£
ÎÒÃǽ«Îª´ó¼ÒÏêϸÐðÊöÆä»úÀí¡£
ÏÈÀ´¿´¿´minor CompactionµÄ¹ý³Ì¡£Minor compaction
µÄÄ¿µÄÊǵ±ÄÚ´æÖеÄmemtable´óСµ½ÁËÒ»¶¨ÖµÊ±£¬½«ÄÚÈݱ£´æµ½´ÅÅÌÎļþÖУ¬Í¼8.1ÊÇÆä»úÀíʾÒâͼ¡£

ͼ8.1 minor compaction
´Ó8.1¿ÉÒÔ¿´³ö£¬µ±memtableÊýÁ¿µ½ÁËÒ»¶¨³Ì¶È»áת»»Îªimmutable memtable£¬´Ëʱ²»ÄÜÍùÆäÖÐдÈë¼Ç¼£¬Ö»ÄÜ´ÓÖжÁÈ¡KVÄÚÈÝ¡£Ö®Ç°½éÉܹý£¬immutable
memtableÆäʵÊÇÒ»¸ö¶à²ã¼¶¶ÓÁÐSkipList£¬ÆäÖеļǼÊǸù¾ÝkeyÓÐÐòÅÅÁеġ£ËùÒÔÕâ¸öminor
compactionʵÏÖÆðÀ´Ò²ºÜ¼òµ¥£¬¾ÍÊǰ´ÕÕimmutable memtableÖмǼÓÉСµ½´ó±éÀú£¬²¢ÒÀ´ÎдÈëÒ»¸ölevel
0 µÄн¨SSTableÎļþÖУ¬Ð´Íêºó½¨Á¢ÎļþµÄindex Êý¾Ý£¬ÕâÑù¾ÍÍê³ÉÁËÒ»´Îminor compaction¡£´ÓͼÖÐÒ²¿ÉÒÔ¿´³ö£¬¶ÔÓÚ±»É¾³ýµÄ¼Ç¼£¬ÔÚminor
compaction¹ý³ÌÖв¢²»ÕæÕýɾ³ýÕâ¸ö¼Ç¼£¬ÔÒòÒ²ºÜ¼òµ¥£¬ÕâÀïÖ»ÖªµÀҪɾµôkey¼Ç¼£¬µ«ÊÇÕâ¸öKVÊý¾ÝÔÚÄÄÀï?ÄÇÐèÒª¸´ÔӵIJéÕÒ£¬ËùÒÔÔÚminor
compactionµÄʱºò²¢²»×öɾ³ý£¬Ö»Êǽ«Õâ¸ökey×÷Ϊһ¸ö¼Ç¼дÈëÎļþÖУ¬ÖÁÓÚÕæÕýµÄɾ³ý²Ù×÷£¬ÔÚÒÔºó¸ü¸ß²ã¼¶µÄcompactionÖлáÈ¥×ö¡£
µ±Ä³¸ölevelϵÄSSTableÎļþÊýÄ¿³¬¹ýÒ»¶¨ÉèÖÃÖµºó£¬levelDb»á´ÓÕâ¸ölevelµÄSSTableÖÐÑ¡ÔñÒ»¸öÎļþ£¨level>0£©£¬½«ÆäºÍ¸ßÒ»²ã¼¶µÄlevel+1µÄSSTableÎļþºÏ²¢£¬Õâ¾ÍÊÇmajor
compaction¡£
ÎÒÃÇÖªµÀÔÚ´óÓÚ0µÄ²ã¼¶ÖУ¬Ã¿¸öSSTableÎļþÄÚµÄKey¶¼ÊÇÓÉСµ½´óÓÐÐò´æ´¢µÄ£¬¶øÇÒ²»Í¬ÎļþÖ®¼äµÄkey·¶Î§£¨ÎļþÄÚ×îСkeyºÍ×î´ókeyÖ®¼ä£©²»»áÓÐÈκÎÖØµþ¡£Level
0µÄSSTableÎļþÓÐÐ©ÌØÊ⣬¾¡¹Üÿ¸öÎļþÒ²ÊǸù¾ÝKeyÓÉСµ½´óÅÅÁУ¬µ«ÊÇÒòΪlevel 0µÄÎļþÊÇͨ¹ýminor
compactionÖ±½ÓÉú³ÉµÄ£¬ËùÒÔÈÎÒâÁ½¸ölevel 0ϵÄÁ½¸össtableÎļþ¿ÉÄÜÔÙkey·¶Î§ÉÏÓÐÖØµþ¡£ËùÒÔÔÚ×ömajor
compactionµÄʱºò£¬¶ÔÓÚ´óÓÚlevel 0µÄ²ã¼¶£¬Ñ¡ÔñÆäÖÐÒ»¸öÎļþ¾ÍÐУ¬µ«ÊǶÔÓÚlevel 0À´Ëµ£¬Ö¸¶¨Ä³¸öÎļþºó£¬±¾levelÖкܿÉÄÜÓÐÆäËûSSTableÎļþµÄkey·¶Î§ºÍÕâ¸öÎļþÓÐÖØµþ£¬ÕâÖÖÇé¿öÏ£¬ÒªÕÒ³öËùÓÐÓÐÖØµþµÄÎļþºÍlevel
1µÄÎļþ½øÐкϲ¢£¬¼´level 0ÔÚ½øÐÐÎļþÑ¡ÔñµÄʱºò£¬¿ÉÄÜ»áÓжà¸öÎļþ²ÎÓëmajor compaction¡£
levelDbÔÚÑ¡¶¨Ä³¸ölevel½øÐÐcompactionºó£¬»¹ÒªÑ¡ÔñÊǾßÌåÄĸöÎļþÒª½øÐÐcompaction£¬levelDbÔÚÕâÀïÓиöС¼¼ÇÉ£¬
¾ÍÊÇ˵ÂÖÁ÷À´£¬±ÈÈçÕâ´ÎÊÇÎļþA½øÐÐcompaction£¬ÄÇôÏ´ξÍÊÇÔÚkey rangeÉϽô°¤×ÅÎļþAµÄÎļþB½øÐÐcompaction£¬ÕâÑùÿ¸öÎļþ¶¼»áÓлú»áÂÖÁ÷ºÍ¸ß²ãµÄlevel
Îļþ½øÐкϲ¢¡£
Èç¹ûÑ¡ºÃÁËlevel LµÄÎļþAºÍlevel L+1²ãµÄÎļþ½øÐкϲ¢£¬ÄÇôÎÊÌâÓÖÀ´ÁË£¬Ó¦¸ÃÑ¡Ôñlevel
L+1ÄÄЩÎļþ½øÐкϲ¢£¿levelDbÑ¡ÔñL+1²ãÖкÍÎļþAÔÚkey rangeÉÏÓÐÖØµþµÄËùÓÐÎļþÀ´ºÍÎļþA½øÐкϲ¢¡£
Ò²¾ÍÊÇ˵£¬Ñ¡¶¨ÁËlevel LµÄÎļþA,Ö®ºóÔÚlevel L+1ÖÐÕÒµ½ÁËËùÓÐÐèÒªºÏ²¢µÄÎļþB,C,D¡..µÈµÈ¡£Ê£ÏµÄÎÊÌâ¾ÍÊǾßÌåÊÇÈçºÎ½øÐÐmajor
ºÏ²¢µÄ£¿¾ÍÊÇ˵¸ø¶¨ÁËһϵÁÐÎļþ£¬Ã¿¸öÎļþÄÚ²¿ÊÇkeyÓÐÐòµÄ£¬ÈçºÎ¶ÔÕâЩÎļþ½øÐкϲ¢£¬Ê¹µÃÐÂÉú³ÉµÄÎļþÈÔÈ»KeyÓÐÐò£¬Í¬Ê±Å×µôÄÄЩ²»ÔÙÓмÛÖµµÄKV
Êý¾Ý¡£Í¼8.2˵Ã÷ÁËÕâÒ»¹ý³Ì¡£

ͼ8.2 SSTable Compaction
Major compactionµÄ¹ý³ÌÈçÏ£º¶Ô¶à¸öÎļþ²ÉÓö෹鲢ÅÅÐòµÄ·½Ê½£¬ÒÀ´ÎÕÒ³öÆäÖÐ×îСµÄKey¼Ç¼£¬Ò²¾ÍÊǶԶà¸öÎļþÖеÄËùÓмÇÂ¼ÖØÐ½øÐÐÅÅÐò¡£Ö®ºó²Éȡһ¶¨µÄ±ê×¼ÅжÏÕâ¸öKeyÊÇ·ñ»¹ÐèÒª±£´æ£¬Èç¹ûÅжÏûÓб£´æ¼ÛÖµ£¬ÄÇôֱ½ÓÅ×µô£¬Èç¹û¾õµÃ»¹ÐèÒª¼ÌÐø±£´æ£¬ÄÇô¾Í½«ÆäдÈëlevel
L+1²ãÖÐÐÂÉú³ÉµÄÒ»¸öSSTableÎļþÖС£¾ÍÕâÑù¶ÔKVÊý¾ÝÒ»Ò»´¦Àí£¬ÐγÉÁËһϵÁÐеÄL+1²ãÊý¾ÝÎļþ£¬Ö®Ç°µÄL²ãÎļþºÍL+1²ã²ÎÓëcompaction
µÄÎļþÊý¾Ý´ËʱÒѾûÓÐÒâÒåÁË£¬ËùÒÔÈ«²¿É¾³ý¡£ÕâÑù¾ÍÍê³ÉÁËL²ãºÍL+1²ãÎļþ¼Ç¼µÄºÏ²¢¹ý³Ì¡£
ÄÇôÔÚmajor compaction¹ý³ÌÖУ¬ÅжÏÒ»¸öKV¼Ç¼ÊÇ·ñÅׯúµÄ±ê×¼ÊÇÊ²Ã´ÄØ£¿ÆäÖÐÒ»¸ö±ê×¼ÊÇ:¶ÔÓÚij¸ökeyÀ´Ëµ£¬Èç¹ûÔÚСÓÚL²ãÖдæÔÚÕâ¸öKey£¬ÄÇôÕâ¸öKVÔÚmajor
compaction¹ý³ÌÖпÉÒÔÅ×µô¡£ÒòΪÎÒÃÇÇ°Ãæ·ÖÎö¹ý£¬¶ÔÓڲ㼶µÍÓÚLµÄÎļþÖÐÈç¹û´æÔÚͬһKeyµÄ¼Ç¼£¬ÄÇô˵Ã÷¶ÔÓÚKeyÀ´Ëµ£¬ÓиüÐÂÏʵÄValue´æÔÚ£¬ÄÇô¹ýÈ¥µÄValue¾ÍµÈÓÚûÓÐÒâÒåÁË£¬ËùÒÔ¿ÉÒÔɾ³ý¡£
LevelDbÈÕ֪¼֮¾Å levelDbÖеÄCache
Êé½ÓǰÎÄ£¬Ç°Ãæ½²¹ý¶ÔÓÚlevelDbÀ´Ëµ£¬¶ÁÈ¡²Ù×÷Èç¹ûûÓÐÔÚÄÚ´æµÄmemtableÖÐÕÒµ½¼Ç¼£¬Òª¶à´Î½øÐдÅÅÌ·ÃÎʲÙ×÷¡£¼ÙÉè×îÓÅÇé¿ö£¬¼´µÚÒ»´Î¾ÍÔÚlevel
0ÖÐ×îеÄÎļþÖÐÕÒµ½ÁËÕâ¸ökey£¬ÄÇôҲÐèÒª¶ÁÈ¡2´Î´ÅÅÌ£¬Ò»´ÎÊǽ«SSTableµÄÎļþÖеÄindex²¿·Ö¶ÁÈëÄڴ棬ÕâÑù¸ù¾ÝÕâ¸öindex¿ÉÒÔÈ·¶¨keyÊÇÔÚÄĸöblockÖд洢£»µÚ¶þ´ÎÊǶÁÈëÕâ¸öblockµÄÄÚÈÝ£¬È»ºóÔÚÄÚ´æÖвéÕÒkey¶ÔÓ¦µÄvalue¡£
levelDbÖÐÒýÈëÁËÁ½¸ö²»Í¬µÄCache:Table CacheºÍBlock
Cache¡£ÆäÖÐBlock CacheÊÇÅäÖÿÉÑ¡µÄ£¬¼´ÔÚÅäÖÃÎļþÖÐÖ¸¶¨ÊÇ·ñ´ò¿ªÕâ¸ö¹¦ÄÜ¡£

ͼ9.1 table cache
ͼ9.1ÊÇtable cacheµÄ½á¹¹¡£ÔÚCacheÖУ¬keyÖµÊÇSSTableµÄÎļþÃû³Æ£¬Value²¿·Ö°üº¬Á½²¿·Ö£¬Ò»¸öÊÇÖ¸Ïò´ÅÅÌ´ò¿ªµÄSSTableÎļþµÄÎļþÖ¸Õ룬ÕâÊÇΪÁË·½±ã¶ÁÈ¡ÄÚÈÝ£»ÁíÍâÒ»¸öÊÇÖ¸ÏòÄÚ´æÖÐÕâ¸öSSTableÎļþ¶ÔÓ¦µÄTable½á¹¹Ö¸Õ룬table½á¹¹ÔÚÄÚ´æÖУ¬±£´æÁËSSTableµÄindexÄÚÈÝÒÔ¼°ÓÃÀ´Ö¸Ê¾block
cacheÓõÄcache_id ,µ±È»³ý´ËÍ⻹ÓÐÆäËüһЩÄÚÈÝ¡£
±ÈÈçÔÚget(key)¶ÁÈ¡²Ù×÷ÖУ¬Èç¹ûlevelDbÈ·¶¨ÁËkeyÔÚij¸ölevelÏÂij¸öÎļþAµÄkey
range·¶Î§ÄÚ£¬ÄÇôÐèÒªÅжÏÊDz»ÊÇÎļþAÕæµÄ°üº¬Õâ¸öKV¡£´Ëʱ£¬levelDb»áÊ×ÏȲéÕÒTable Cache£¬¿´Õâ¸öÎļþÊÇ·ñÔÚ»º´æÀÈç¹ûÕÒµ½ÁË£¬ÄÇô¸ù¾Ýindex²¿·Ö¾Í¿ÉÒÔ²éÕÒÊÇÄĸöblock°üº¬Õâ¸ökey¡£Èç¹ûûÓÐÔÚ»º´æÖÐÕÒµ½Îļþ£¬ÄÇô´ò¿ªSSTableÎļþ£¬½«Æäindex²¿·Ö¶ÁÈëÄڴ棬Ȼºó²åÈëCacheÀïÃæ£¬È¥indexÀïÃæ¶¨Î»Äĸöblock°üº¬Õâ¸öKey
¡£Èç¹ûÈ·¶¨ÁËÎļþÄĸöblock°üº¬Õâ¸ökey£¬ÄÇôÐèÒª¶ÁÈëblockÄÚÈÝ£¬ÕâÊǵڶþ´Î¶ÁÈ¡¡£

ͼ9.2 block cache
Block CacheÊÇΪÁ˼ӿìÕâ¸ö¹ý³ÌµÄ£¬Í¼9.2ÊÇÆä½á¹¹Ê¾Òâͼ¡£ÆäÖеÄkeyÊÇÎļþµÄcache_id¼ÓÉÏÕâ¸öblockÔÚÎļþÖÐµÄÆðʼλÖÃblock_offset¡£¶øvalueÔòÊÇÕâ¸öBlockµÄÄÚÈÝ¡£
Èç¹ûlevelDb·¢ÏÖÕâ¸öblockÔÚblock cacheÖУ¬ÄÇô¿ÉÒÔ±ÜÃâ¶ÁÈ¡Êý¾Ý£¬Ö±½ÓÔÚcacheÀïµÄblockÄÚÈÝÀïÃæ²éÕÒkeyµÄvalue¾ÍÐУ¬Èç¹ûûÕÒµ½ÄØ£¿ÄÇô¶ÁÈëblockÄÚÈݲ¢°ÑËü²åÈëblock
cacheÖС£levelDb¾ÍÊÇÕâÑùͨ¹ýÁ½¸öcacheÀ´¼Ó¿ì¶ÁÈ¡Ëٶȵġ£´ÓÕâÀï¿ÉÒÔ¿´³ö£¬Èç¹û¶ÁÈ¡µÄÊý¾Ý¾Ö²¿ÐԱȽϺã¬Ò²¾ÍÊÇ˵Ҫ¶ÁµÄÊý¾Ý´ó²¿·ÖÔÚcacheÀïÃæ¶¼ÄܶÁµ½£¬ÄÇô¶ÁȡЧÂÊÓ¦¸Ã»¹ÊǺܸߵ쬶øÈç¹ûÊǶÔkey½øÐÐ˳Ðò¶ÁȡЧÂÊÒ²Ó¦¸Ã²»´í£¬ÒòΪһ´Î¶ÁÈëºó¿ÉÒÔ¶à´Î±»¸´Óᣵ«ÊÇÈç¹ûÊÇËæ»ú¶ÁÈ¡£¬Äú¿ÉÒÔÍÆ¶ÏÏÂÆäЧÂÊÈçºÎ¡£
LevelDbÈÕ֪¼֮ʮ Version¡¢VersionEdit¡¢VersionSet
Version ±£´æÁ˵±Ç°´ÅÅÌÒÔ¼°ÄÚ´æÖÐËùÓеÄÎļþÐÅÏ¢£¬Ò»°ãÖ»ÓÐÒ»¸öVersion½Ð×ö"current"
version£¨µ±Ç°°æ±¾£©¡£Leveldb»¹±£´æÁËһϵÁеÄÀúÊ·°æ±¾£¬ÕâЩÀúÊ·°æ±¾ÓÐʲô×÷ÓÃÄØ£¿
µ±Ò»¸öIterator´´½¨ºó£¬Iterator¾ÍÒýÓõ½ÁËcurrent version(µ±Ç°°æ±¾)£¬Ö»ÒªÕâ¸öIterator²»±»deleteÄÇô±»IteratorÒýÓõİ汾¾Í»áÒ»Ö±´æ»î¡£Õâ¾ÍÒâζ×ŵ±ÄãÓÃÍêÒ»¸öIteratorºó£¬ÐèÒª¼°Ê±É¾³ýËü¡£
µ±Ò»´ÎCompaction½áÊøºó£¨»áÉú³ÉеÄÎļþ£¬ºÏ²¢Ç°µÄÎļþÐèҪɾ³ý£©£¬Leveldb»á´´½¨Ò»¸öеİ汾×÷Ϊµ±Ç°°æ±¾£¬ÔÏȵĵ±Ç°°æ±¾¾Í»á±äΪÀúÊ·°æ±¾¡£
VersionSet ÊÇËùÓÐVersionµÄ¼¯ºÏ£¬¹ÜÀí×ÅËùÓдæ»îµÄVersion¡£
VersionEdit ±íʾVersionÖ®¼äµÄ±ä»¯£¬Ï൱ÓÚdelta ÔöÁ¿£¬±íʾÓÐÔö¼ÓÁ˶àÉÙÎļþ£¬É¾³ýÁËÎļþ¡£ÏÂͼ±íʾËûÃÇÖ®¼äµÄ¹ØÏµ¡£
Version0 +VersionEdit-->Version1
VersionEdit»á±£´æµ½MANIFESTÎļþÖУ¬µ±×öÊý¾Ý»Ö¸´Ê±¾Í»á´ÓMANIFESTÎļþÖжÁ³öÀ´Öؽ¨Êý¾Ý¡£
leveldbµÄÕâÖÖ°æ±¾µÄ¿ØÖÆ£¬ÈÃÎÒÏëµ½ÁËË«bufferÇл»£¬Ë«bufferÇл»À´×ÔÓÚͼÐÎѧÖУ¬ÓÃÓÚ½â¾öÆÁÄ»»æÖÆÊ±µÄÉÁÆÁÎÊÌ⣬ÔÚ·þÎñÆ÷±à³ÌÖÐÒ²ÓÐÓô¦¡£
±ÈÈçÎÒÃǵķþÎñÆ÷ÉÏÓÐÒ»¸ö×Öµä¿â£¬Ã¿ÌìÎÒÃÇÐèÒª¸üÐÂÕâ¸ö×Öµä¿â£¬ÎÒÃÇ¿ÉÒÔпªÒ»¸öbuffer£¬½«ÐµÄ×Öµä¿â¼ÓÔØµ½Õâ¸öÐÂbufferÖУ¬µÈµ½¼ÓÔØÍê±Ï£¬½«×ÖµäµÄÖ¸ÕëÖ¸ÏòеÄ×Öµä¿â¡£
leveldbµÄversion¹ÜÀíºÍË«bufferÇл»ÀàËÆ£¬µ«ÊÇÈç¹ûÔversion±»Ä³¸öiteratorÒýÓã¬ÄÇôÕâ¸översion»áÒ»Ö±±£³Ö£¬Ö±µ½Ã»Óб»ÈκÎÒ»¸öiteratorÒýÓ㬴Ëʱ¾Í¿ÉÒÔɾ³ýÕâ¸översion¡£
|