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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÓÅÑŵÄBitcask/BeansDB
 
×÷Õߣº ¶¡¿­
  1365  次浏览      27
 2022-1-13
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª·ÖÎöÌÖÂÛÁËbeansDBµÄÉè¼ÆºÍʵÏÖÉϵÄһЩ¹Ø¼ü¼¼Êõ£¬°üÀ¨Êý¾ÝÎļþ×éÖ¯¡¢ÄÚ´æhash treeË÷ÒýµÈ £¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚ Öªºõ £¬ÓÉAlice±à¼­¡¢ÍƼö¡£

˵Ã÷

BitcaskÊÇÓÉBashoÌá³öµÄº£Á¿Ð¡Îļþ´æ´¢³¡¾°ÏµĽâ¾ö·½°¸£¬Ö÷Òª½â¾öÒÔÏÂÎÊÌâ:

1.¶ÁдµÍÑÓ³Ù

2.Ëæ»úдÇëÇóµÄ´ÅÅ̸ßÍÌÍÂÁ¿

3.¹ÊÕÏʱµÄ¿ìËÙ»Ö¸´ÇÒ²»¶ªÊý¾Ý

4.ʹÓüòµ¥

ÔÚbitcaskµÄÂÛÎÄ£¨»òÕß˵¸ÅÒªÉè¼Æ¸üºÏÊÊ£©ÖÐÖ÷ÒªÃèÊöÁËBitcask¶ÔÎļþ´æ´¢¸ñʽµÄ¶¨ÒåÒÔ¼°Ò»Ð©ÓÅ»¯´ëÊ©¡£

BeansDBÊÇDouban²Î¿¼bitcaskÂÛÎÄ¿ª·¢µÄÊʺÏÓÚdoubanʹÓó¡¾°µÄº£Á¿Ð¡Îļþ´æ´¢ÏµÍ³¡£×÷ÕßDaviesͨ¹ý½³ÐĶÀ¾ßµÄÉè¼ÆºÍÉîºñµÄ¼¼Êõˮƽ½«ÕâÒ»¸´ÔÓµÄÎÊÌâ½â¾öµÄ±È½ÏÓÅÑÅ£¬ÖµµÃ×ÐϸƷζһ·¬¡£

×÷ÕßÔÚ¸ÅÒªÔĶÁbitcaskÂÛÎĺÍbeansDBÔ´ÂëµÄ»ù´¡ÉÏ·ÖÎöÌÖÂÛÁËbeansDBµÄÉè¼ÆºÍʵÏÖÉϵÄһЩ¹Ø¼ü¼¼Êõ£¬°üÀ¨Êý¾ÝÎļþ×éÖ¯¡¢ÄÚ´æhash treeË÷ÒýµÈ¡£×îºó£¬×÷ÕßÌá³ö×Ô¼ºµÄ¿´·¨ÒÔ¼°×Ô¼ºµÄһЩÒÉ»ó£¬Ï£ÍûÓë¸÷λÄÜÒ»ÆðÉîÈë̽ÌÖ¡£

Êý¾Ý´æ´¢

×ÜÌå¼Ü¹¹

BitcaskÖ÷Òª×ÅÑÛ½â¾öº£Á¿Ð¡Îļþ´æ´¢µÄ´æ´¢ÐÔÄܵÍÏÂÎÊÌ⣬beansDB×÷ΪÆä¿ªÔ´°æ±¾£¬ÊµÏÖÁËbitcaskÂÛÎÄÖÐÌá³öµÄ½â¾ö·½°¸¡£×÷ÕßDavies½«ÆäʵÏֵĸüÓÅÑÅ¡£

´ÓÕûÌåÉÏÀ´¿´£¬Ò»¸öBeansDB½ø³Ì½«¹ÜÀíµÄ´æ´¢¿Õ¼ä£¨¿ÉÒÔÊÇÒ»¿é´ÅÅÌ»òÕß´ÅÅÌÉÏij¸öĿ¼£©×éÖ¯³ÉÒ»¿ÃÊ÷×´½á¹¹£¨Ê÷µÄÉî¶È¿É×÷ΪÆô¶¯²ÎÊý£©¡£Êý¾ÝÎļþ±»´æ´¢ÔÚ×îµ×²ãµÄĿ¼Ï£¬ÈçÏÂÊDzâÊÔ»·¾³ÖÐÒ»¸öµäÐÍ´æ´¢ÅäÖãº

hzdingkai2013@inspur1:~/workspace/beansdb-0.6/bin/bin/bean4/data$ tree
.
©À©¤©¤ 0
©¦ ©À©¤©¤ 0
©¦ ©À©¤©¤ 1
...
©¦ ©À©¤©¤ e
©¦ ©¸©¤©¤ f
©À©¤©¤ 1
©¦ ©À©¤©¤ 0
©¦ ©À©¤©¤ 1
...
©¦ ©À©¤©¤ f
...
©À©¤©¤ f
©¦ ©À©¤©¤ 0
©¦ ©À©¤©¤ 1
...
©¦ ©À©¤©¤ f

ÆäÖÐÓÐ256¸ö×ÓĿ¼£¨ÅäÖõÄÊ÷Éî¶ÈΪ2£©¿ÉÒԴ洢ʵ¼ÊÎļþÊý¾Ý¡£Ã¿¸ö×ÓĿ¼¶ÔÓ¦ÁËÒ»¸öbitcaskʵÀý£¬Õû¸öbeansDB½ø³ÌÔòÓɶà¸öbitcaskʵÀý×éÖ¯¶ø³É¡£ÏÂͼÄܽϺõط´Ó³hstoreÓëbitcaskʵÀýÖ®¼äµÄ¹ØÏµ£º

Îļþ¸ñʽ

ÔÚÿ¸öbitcaskʵÀýÄÚ²¿£¬BeansDB²ÉÈ¡ÁËbitcaskÂÛÎ͍ÒåµÄÎļþ´æ´¢¸ñʽ£¬ÈçÏ£º

bitcaskʵÀýÌØµã

ÿ¸öĿ¼ÏÂÖ»ÓÐÒ»¸ö»îÔ¾Îļþ£¨µ±Ç°¿ÉдÈ룩£¬³ÆÎª active data file £¬ÆäËûÎļþ³ÆÎª older data file £¬Ö»¶Á²»Ð´

ÿ¸öÎļþ×÷Ϊ¼Ç¼±»×·¼ÓдÈë active data file

ÎļþµÄɾ³ýÒ²±»×÷ΪһÌõ record ×·¼ÓÖÁactive data fileºóÃæ

ÔªÊý¾Ý´æ´¢

bitcaskÉè¼Æ³õÖÔÒâÔÚ½â¾öСÎļþ´æ´¢µÄЧÂʵÍÏÂÎÊÌ⣬¶øÐ¡Îļþ´æ´¢Ð§ÂʵÍϵÄÔ­Òò³ýÁËÎļþËæ»úIO½Ï¶àÍ⣬»¹ÈÝÒ×ÓÉÓÚÎļþÊýÁ¿µÄ±©ÕǶøµ¼ÖÂÔªÊý¾Ý(dentry/inode)¿ªÏúµÄÔö´ó£¬Ö±½ÓÓ°Ïì¶ÁдЧÂÊ¡£

ΪÁ˽â¾ö¸ÃÎÊÌ⣬bitcask½«ÎļþÒÔÈÕÖ¾·½Ê½×·¼ÓÖÁbitcaskʵÀý(Ŀ¼)µÄ´óÎļþÖУ¬×Ô¼º¹ÜÀíÎļþË÷Òý£¬¼´ÎļþkeyÖÁÔÚ´ÅÅÌÎļþλÖÃÒÔ¼°ÎļþÄÚÆ«ÒÆ¡£beansDBÎļþÔªÊý¾Ý¸ñʽΪ£º

Ϊ½øÒ»²½Ìá¸ßÐÔÄÜ£¬bitcask»á½«ËùÓÐÔªÊý¾Ý»º´æÔÚÄÚ´æÖУ¬ÔÚ¶ÁÎļþʱֻÐèÒªÒ»´ÎIO¼´¿É¡£

ΪÁËÄܽ«Èç´ËÖÚ¶àµÄÎļþÔªÊý¾ÝÈ«²¿»º´æÔÚÄÚ´æÖУ¬±ØÐëµÃ¾¡Á¿Ñ¹Ëõÿ¸öÎļþµÄÔªÊý¾Ý×Ö½ÚÊý£¬beansDBÔÚÕâ·½Ãæ¿Éν¿àÐĹÂÒ裺

struct t_item {
uint32_t pos; // Êý¾Ý¼Ç¼ÔÚÈÕÖ¾ÎļþÆðÊ¼Æ«ÒÆ
int32_t ver; // Êý¾Ý¼Ç¼°æ±¾ºÅ
uint16_t hash; // Êý¾Ý¼Ç¼hash
uint8_t length; // keyµÄ³¤¶È
char key[1]; // keyµÄʵ¼ÊÖµ
};

ÕâÀï¿´µ½Ò»¸öºÜÆæ¹ÖÏÖÏó¾ÍÊÇÕâÀïûÓмǼÎļþ±»´æ´¢ËùÔڵĴóÎļþid£¨ÔÚbeansDBÄÚÓÐרÃųƺôΪ bucket £©¡£ÕâÆäʵÊÇѹËõÔªÊý¾Ý´æ´¢¿Õ¼äµÄ¼«ºÃÀý×Ó£º beansDB½«posµÄµÍ8λÓÃÀ´´æ´¢bucket id ¡£

ÕâÑùÿ¸öbitcaskʵÀýÄÚ±ã¿ÉÒÔ×î¶à´æ´¢256¸öbucket¡£¸ß24λ±ãÓÃÀ´´æ´¢bucketÄÚÆ«ÒÆ¡£Ã¿¸öbucket´óСһ°ã¶¨ÒåΪ2GB£¬ÕâÑùÿ¸öbitcaskʵÀý×î´óÖ§³ÖµÄ´æ´¢¿Õ¼äΪ512GB£¬Í×Í׵ģ¡

¸ù¾ÝÉÏÃæµÄ¶¨ÒåÎÒÃÇ´óÖ¿ÉÒÔ¼ÆËã³öÿ¸öÎļþÔªÊý¾ÝÕ¼¾ÝµÄ×Ü´æ´¢¿Õ¼äsize = 4B + 4B + 2B + 1B + size(key) = 11B + size(key)£¬¿ÉÒÔ˵ÒѾ­ºÜСÁË£¬°´ÕÕ20B/Îļþ¼ÆË㣬100MB¸öÎļþÒ²Ö»Õ¼ÓÃÔ¼2GBÄÚ´æ¡£

Hash tree

BeansDBʹÓÃÁËhash treeÀ´´æ´¢bitcaskʵÀýµÄÔªÊý¾Ý¡£Ê¹ÓÃÊý×éʵÏÖÁË16²æhash tree

Ö®ËùÒÔʹÓÃhash treeµÄÖ÷ÒªÔ­ÒòÓжþ£º

ÀàËÆÓÚÆÕͨµÄ¹þÏ£×Öµä, ±£´æ key ÒÔ¼°ËüÔÚ´ÅÅÌÖеÄλÖÃ, ·½Ãæ¿ìËÙ·ÃÎÊ.

¿É¿ìËٱȽÏÁ½¸ö´æ´¢½ÚµãÖеÄÄÚÈÝÊÇ·ñÒ»ÖÂ, ½«ËùÓÐ key °´ÕÕÆä¹þÏ£×éÖ¯³ÉÊ÷, ͬʱ ½ÚµãµÄ¹þÏ£ÊÇ×Ó½ÚµãµÄ¹þÏ£µÄ¹þÏ£ , ÕâÑù¿ÉÒÔ¿ìËٱȽϲ¢ÕÒ³ö²îÒì.

¹Ø¼üÁ÷³Ì

ÔÚÕâÀï²¢²»´òËãһһö¾ÙAPIʵÏÖ£¬Ö»ÒÔBeansDBΪÀý´óÖÂÃèÊöÆäºËÐÄAPIµÄÄÚ²¿Á÷³Ì¡£

Put

1.¸ù¾Ýkey¶¨Î»¸Ã·¢ÍùÄĸö´æ´¢Ä¿Â¼£¨bitcask instance£©£»

2.ÔÚbitcaskµÄhash treeÖиù¾Ýkey²éÕÒ¶ÔÓ¦µÄItemÊÇ·ñ´æÔÚ£¬Èç¹û´æÔÚ£¬ËµÃ÷ÊÇupdate£¬¼Ç¼ÏÂԭʼ°æ±¾ºÅ(oldv)£»

3.¸ù¾Ýԭʼ°æ±¾ºÅÒÔ¼°¸üÐÂÀàÐ;ö¶¨Ð°汾ºÅ£»

4.ΪҪдÈëµÄÊý¾Ý¼ÆËãhash£º uint16_t hash = gen_hash(value, vlen) £»

5.Èç¹û²½Öè2µÃµ½µÄitem²»Îªnull²¢ÇÒµ±Ç°Ð´ÈëÊý¾ÝºÍÒѾ­´æÔÚÊý¾Ý£¨¸ù¾Ý²½Öè4¼ÆËãµÄhashÖµ¶Ô±È£©ÊÇÒ»ÑùµÄ£¬ÄÇÆäʵʲôҲ²»ÓÃ×ö£¬Ö±½Ó·µ»Ø¼´¿É£»

6.·ÖÅäеÄDataRecord²¢³õʼ»¯£¬ÒÔÈÝÄÉҪдÈëµÄÐÂÊý¾Ý£»

7.½«6·ÖÅäµÄDataRecordдÈëbitcaskµÄ»º´æbuffer£¬ µÈ´ýºóÐø¶¨ÆÚsyncµ½ÈÕÖ¾Îļþ(bucket)£»

8.ÔÚbitcaskµÄhash treeÖвåÈë»ò¸üиüǼµÄÔªÊý¾ÝÐÅÏ¢²¢·µ»Ø³É¹¦

˵Ã÷£º

ÔÚbeansdbµÄʵÏÖÖУ¬Ã¿¸öbitcaskʵÀýÓÐÁ½¸öhash tree£¬È«¾ÖµÄhash treeºÍµ±Ç°ÕýÔÚдÈëbucketµÄhash tree¡£Õâô×öµÄÔ­ÒòÊÇΪÁ˼ӿìÉú³Éhint fileµÄËÙ¶È¡£¿É²Î¿¼ bc_rotate µÄ´úÂë¡£Òò´Ë£¬ÔÚ8µÄ²åÈëhash treeʱºòÐèÒª·Ö±ð²åÈëÕâÁ½¿ÃÊ÷

ÉÏÃæµÄд¹ý³Ì¶¼ÊÇÔÚbitcaskµÄÐ´Ëø±£»¤Ö®ÏÂÍê³ÉµÄ pthread_mutex_lock(&bc->write_lock) ¡£Õâ»á²»»á³ÉΪÐÔÄÜÆ¿¾±£¿Ó¦¸Ã²»ÖÁÓÚ£¬ÒòΪȫÊÇÄÚ´æ²Ù×÷£¡

²½Öè7ÖпÉÄÜдÈëBitcaskʵÀýµÄÄڴ滺³åÇø¿ÉÄܾͷµ»ØÁË£¬ DZÔÚ·çÏÕ£¡

Get

¸ù¾Ýkey¶¨Î»´æ´¢Ä¿Â¼(bitcask instance)£»

ÔÚbitcaskµÄhash treeÖвé¸Ãkey¶ÔÓ¦µÄItemÊÇ·ñ´æÔÚ£¬²»´æÔÚÔò·µ»Ønull

ÅжÏitemÖмǼµÄbucket id(pos & 0xff)ÊÇ·ñÊǵ±Ç°ÕýÔÚдÈëµÄbucket£¬Èç¹ûÊÇÏÈÅжÏÒª¶ÁÈ¡µÄÊý¾ÝÊÇ·ñÔÚÄڴ滺³åÇø£»

·ñÔò¸ù¾Ýpos & 0xffffff00´ÓÏàÓ¦µÄbucketÖжÁ³öÊý¾Ý²¢·µ»Ø¡£

Delete

deleteµÄÁ÷³ÌÓëputÒ»Ö£¬Ö»ÊÇÆäversionÉèÖÃΪ-1¡£±ê¼ÇΪɾ³ý£¬ÓëÕý³£µÄputÇø±ðÔÚÓÚ£º

valueֵΪ¿Õ£»

еÄDataRecordµÄ°æ±¾Îª-oldversion - 1£¬Îª¸ºÖµ£»

˵Ã÷

  • deleteµÄʱºò²¢Ã»Óн«¼Ç¼µÄÔªÊý¾Ý(Item)´Óhash treeÖÐɾ³ý£»¶øÊÇÓиöºǫ́Ï̻߳á×ö¶¨ÆÚѹËõ£¨½«version<0µÄµÄÔªÊý¾Ý¼Ç¼ɾµô£©¡£ÕâÑùÉè¼ÆµÄÖ÷ÒªÀíÓÉÎÒÏë¿ÉÄÜÊDZÜÃâÔÚɾ³ýµÄʱºò¶Ôhash tree×÷µ÷Õû°É¡£ºǫ́ѹËõµÄʵÏֿɲο¼ bc_optimize ¡£
  • ¼¸¸ö¹Ø¼üÎÊÌâ

    ÄÚ´æÊ¹ÓÃ

    Õâ¸öÎÒÃÇÔÚÇ°Ãæ´óÖ¹ÀËã¹ý£¬2GBµÄÄÚ´æ¿É´óÔ¼´æ´¢100M¸öÎļþ£¬ÓëbeansDB×÷ÕßµÄÉè¼ÆÄ¿±ê²î²»¶à£¬±ÈBitcaskÄÚ´æÀûÓÃЧÂʸߡ£

    Òì³£»Ö¸´

    ΪÁ˽â¾öBeansDBÉè¼ÆÔÚ½ø³ÌÒì³£Í˳öʱÿ¸öbitcakʵÀý¶¼ÐèÒª´Ó´ÅÅָ̻´ÄÚ´æÎļþÓ³Éä±í£¨key->ÔªÊý¾Ý£©¶ø²»µÃ²»¶ÁÈ¡´óÁ¿Êý¾ÝµÄÎÊÌâ¡£bitcask»á½«Ã¿¸ö´óÎļþ(bucket)Éú³ÉÒ»¸öË÷ÒýÎļþhintfile£¬ÆäʵÊǸÃbucketÄÚËùÓÐÎļþÔªÊý¾ÝµÄÒ»·Ý´ÅÅÌdump¡£

    Ç°ÃæÎÒÃÇ¿´µ½ÔÚдÈëbitcaskʵÀýʱ³ýÁËдÈëbitcaskÈ«¾ÖµÄhash treeÍ⻹дÈëÁËÒ»¿Ãcurrent hash tree£¬Õâ±ãÊǵ±Ç°»îÔ¾bucketµÄÔªÊý¾ÝÊ÷£¬ÔÚbucketдÂú¹Ø±ÕʱÔÚºǫ́ÓÉÄÚ´ædumpÖÁ´ÅÅÌÖС£Ïë·¨·Ç³£×ÔÈ»£¬ÊµÏַdz£ÓÅÑÅ¡£

    ¼´±ãÈç´Ë£¬ÓÉÓÚÿ¸öbitcaskʵÀýÖÐË÷ÒýÎļþ¿ÉÄÜÒ²±È½Ï¶à£¨¼ÙÈç°´ÕÕÿ¸öbitcask¹ÜÀí256GB´ÅÅ̿ռ䣬¶øÃ¿¸öÎļþƽ¾ù´óСΪ128KB¼ÆË㣬ÿ¸öbitcask×ܵÄÎļþÊýÁ¿Ô¼Îª2M£¬¶øÃ¿¸öÎļþÔªÊý¾ÝÁ¿Ô¼Îª20B£¬Ôòÿ¸öbitcaskʵÀýµÄÔªÊý¾Ý×ÜÁ¿Ô¼Îª40MB£¬¼´Ã¿¸öbitcaskµÄÔªÊý¾Ý»Ö¸´Ê±¼äÒ²±È½Ï¿ì£¬È¡¾öÓÚÔªÊý¾ÝIOËÙ¶È£©£¬¼´Ê¹Óжà¸öbitcaskʵÀý£¬ÎÒÃÇÒ²¿ÉÒÔ²ÉÈ¡²¢Ðлָ´£¨Ã¿¸öbitcaskʵÀý²¢ÐеضÁ³öÔªÊý¾Ý£¬¹¹½¨hash tree£©µÄ²ßÂÔÀ´ÌáÉý»Ö¸´Ð§ÂÊ¡£

    Êý¾Ý¿É¿¿ÐÔÒÔ¼°ÓÉ´ËÒý³öµÄÒ»ÖÂÐÔÌÖÂÛ

    ±¾ÆªÖ÷ÒªÌÖÂÛbeasdbÈçºÎÓÅÑÅʵÏÖÁËbitcask¶¨ÒåµÄ´æ´¢¸ñʽ¡£ÎÒÃDz¢Ã»ÓÐÌÖÂÛÎļþÊý¾ÝµÄ¿É¿¿ÐÔÒÔ¼°²ÉÓöั±¾²ßÂÔ±£Ö¤¿É¿¿ÐÔʱµÄÒ»ÖÂÐÔÎÊÌâ¡£×÷Õß´úÂëÖÐҲûÏà¹ØÄÚÈÝ¡£

    ´ó¸Å²Â²â£º

  • Ê×ÏÈÉϲãÉèÖÃproxy£¬½«Ð´ÇëÇóת·¢ÖÁ¶à¸±±¾£¬¶à¸±±¾È«²¿Ð´Èë²ÅËã³É¹¦£»
  • Èç¹û·¢ÉúдÒì³££¬Ö±½Óͨ¹ýͬ²½hash treeÀ´×öÊý¾Ýͬ²½¼´¿É£¬¿É²Î¿¼Ç°ÃæËµµÄhash treeÌØÐÔÀ´Àí½â¡£
  • beansDB´æ´¢Ó¦ÓÃ

    ¸ù¾Ý×÷ÕߵIJ©¿Í͸¶£¬beansDBĿǰÔÚdoubanÖ÷ÒªÓÐÁ½Ì×´æ´¢¼¯Èº£ºÒ»Ì×´æ´¢ÖîÈçͼƬ¡¢Èռǵȼ«Ð¡Îļþ£¬¶øÁíÍâÒ»Ì×´æ´¢ÖîÈçÒôÀÖ¡¢ÊÓÆµµÈ½Ï´óÎļþ£¬ÎÒµ¹ÊÇºÜºÃÆæ¶ÔÓÚһЩ³¬´óÎļþ£¨È糬¹ý×î´óbucketµÄÏÞÖÆ£©£¬beansDBÈçºÎ´¦Àí£¿²Â²â´ó¸ÅÊÇÓ¦ÓòãÇÐÆ¬¡£

    ¿ÉÄܶªÊý¾Ý

    ÓÉÓÚbeansDBÔÚдÈëʱֻÊÇд»º³åÇø¼´·µ»Ø£¬Òò´Ë£¬¿Í»§¶Ë¼´Ê¹µÃµ½Ð´³É¹¦µÄ½á¹ûÒ²²»Ò»¶¨±£ÏÕ¡£¾ÝÉçÇøÓÐÈË·´Ó³£¬È·Êµ¶ªÊý¾ÝÁË¡£

    ÓëDavies½»Á÷¹ýÕâ¸öÎÊÌâµÃÖªBeansDBÖ§³ÖÒì²½Êý¾ÝˢУ¬ÇÒÔÚÉú²ú»·¾³ÖÐͨ¹ý¶à¸±±¾²ßÂÔÀ´¼õÉÙ¶ªÊý¾Ý·çÏÕ¡£

    Êý¾Ýmerge

    ÓÉÓÚbeansdbµÄɾ³ý½öÊÇÂß¼­É¾³ý£¬Æäʵ¼ÊÎïÀíÊý¾ÝÒÀÈ»´æÔÚ£¬Òò´Ë£¬ÐèÒªºǫ́ÈÎÎñ¶¨ÆÚ¶ÔÀ¬»øÊý¾Ý½Ï¶àµÄbucket×÷¿Õ¼ä»ØÊÕ£ºmerge¡£

    beansDBÖеÄmergeÒ²±È½Ï¼òµ¥£ºË³ÐòɨÃèÿ¸öbucket¡£É¨ÃèÆähash treeµÄÿ¸ö¼Ç¼£¬²éÕÒÆäÔÚÈ«¾Öhash treeÖÐÊÇ·ñÒÀÈ»ÓÐЧ£¬Èç¹ûÎÞЧ£¬¸Ã¼Ç¼¿Õ¼ä¼´¿É±»»ØÊÕ¡£

    merge µÄʱºò, ¶Ôµ±Ç°mergeµÄbucket»áÉú²úÒ»¸öСµÄhash tree, ¶ÔÓ¦ÐÂÉú²úµÄÊý¾ÝÎļþ¡£Ò»¸öÊý¾ÝÎļþ merge Íê³Éºó, »áËø×¡Ð´, ²¢Õâ¸öСµÄhash treeµÄÄÚÈݸüе½Ö÷Ìå hash tree ÖÐ, Õâ¸ö¹ý³ÌÊÇMlogN ¸´ÔӶȵÄÄÚ´æ²Ù×÷, NÊÇÒ»¸öbucket µÄ¼Ç¼Êý, M Êǵ±Ç°Êý¾ÝÎļþµÄ¼Ç¼Êý, MÒ»°ãÔÚ1MÒÔÄÚ, ¸üÐÂÓ¦¸ÃÄÜÔÚ 1s ×óÓÒµÄʱ¼äÄÚÍê³É¡£

    Êý¾Ý½á¹¹

    Item

    typedef struct t_item Item;
    struct t_item {
    uint32_t pos; // Êý¾Ý¼Ç¼ÔÚÈÕÖ¾ÎļþÆðÊ¼Æ«ÒÆ
    int32_t ver; // Êý¾Ý¼Ç¼°æ±¾ºÅ
    uint16_t hash; // Êý¾Ý¼Ç¼hash
    uint8_t length; // keyµÄ³¤¶È
    char key[1]; // keyµÄʵ¼ÊÖµ
    };

    Item´ú±íÁËÿ¸öÊý¾Ý¼Ç¼(Îļþ)µÄÔªÊý¾ÝÐÅÏ¢£¬±»´æ´¢ÔÚbeansdbµÄhash treeµÄÿ¸öÒ¶×Ó½Úµã(node)ÉÏ¡£

    Node

    typedef struct t_node Node;
    struct t_node {
    uint16_t is_node:1; // ÊÇ·ñÊÇÖмä½Úµã
    uint16_t valid:1;
    uint16_t depth:4; // ½ÚµãÉî¶È
    uint16_t flag:9;
    uint16_t hash; // node hash value ?
    uint32_t count; // ½ÚµãÖÐÓÐЧÊý¾ÝÏî¸öÊý
    Data *data; // ½ÚµãÖд洢µÄʵ¼ÊÊý¾ÝÏî
    };

    NodeÊÇhash treeÖеÄÿ¸ö½ÚµãµÄÊý¾Ý½á¹¹¡£

    Data

    typedef struct t_data Data;
    struct t_data {
    int size;
    int used;
    int count; // ItemÊý×éµÄʵ¼Ê´óС
    Item head[0];
    };

    DataÊǽڵãNodeÖÐʵ¼Ê´æ´¢µÄÊý¾Ý¡£¸ÃÊý¾ÝÊÇÓÉItem×é³ÉµÄÊý×é¡£

    DataRecord

    typedef struct data_record {
    char *value; // Êý¾ÝÔÚÄÚ´æÖеÄÖ¸Õë
    union {
    bool free_value; // free value or not
    uint32_t crc;
    };
    int32_t tstamp;
    int32_t flag;
    int32_t version;
    uint32_t ksz;
    uint32_t vsz;
    char key[0]; // ʵ¼ÊkeyÖµ
    } DataRecord;

    DataRecordÊÇʵ¼Ê´æ´¢ÔÚÈÕÖ¾ÎļþµÄÊý¾Ý¼Ç¼µÄ¸ñʽ¡£Ã¿¸öÊý¾Ý¼Ç¼°´Õոøñʽ±»Ò»ÌõÌõ×·¼ÓÖÁÈÕÖ¾ÎļþÖС£

    bitcask_t

    struct bitcask_t {
    uint32_t depth, pos;
    time_t before;
    Mgr *mgr;
    // µ±Ç°ÕýÔÚдÈëºÍÈ«¾ÖµÄhash tree
    HTree *tree, *curr_tree;
    int last_snapshot;
    int curr; // µ±Ç°ÕýдÈëµÄbucket
    uint64_t bytes, curr_bytes;
    // д»º³åÇø£¬Ð´Èë¼Ç¼ÏÈдÈ뻺³åÇø
    // »º³åÇøÂúʱÔÙflushÖÁÈÕÖ¾Îļþ
    char *write_buffer;
    time_t last_flush_time;
    uint32_t wbuf_size, wbuf_start_pos, wbuf_curr_pos;
    pthread_mutex_t flush_lock, buffer_lock, write_lock;
    int optimize_flag;
    };

     

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

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

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

    Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
    MongoDBʵս¿Î³Ì
    ²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
    PostgreSQLÊý¾Ý¿âʵսÅàѵ
    ×îл¼Æ»®
    DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
    DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
    UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
    AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
    »ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
    ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
     
    ×îÐÂÎÄÕÂ
    ´óÊý¾Ýƽ̨ϵÄÊý¾ÝÖÎÀí
    ÈçºÎÉè¼ÆÊµÊ±Êý¾Ýƽ̨£¨¼¼Êõƪ£©
    ´óÊý¾Ý×ʲú¹ÜÀí×ÜÌå¿ò¼Ü¸ÅÊö
    Kafka¼Ü¹¹ºÍÔ­Àí
    ELK¶àÖּܹ¹¼°ÓÅÁÓ
    ×îпγÌ
    ´óÊý¾Ýƽ̨´î½¨Óë¸ßÐÔÄܼÆËã
    ´óÊý¾Ýƽ̨¼Ü¹¹ÓëÓ¦ÓÃʵս
    ´óÊý¾ÝϵͳÔËά
    ´óÊý¾Ý·ÖÎöÓë¹ÜÀí
    Python¼°Êý¾Ý·ÖÎö
    ³É¹¦°¸Àý
    ijͨÐÅÉ豸ÆóÒµ PythonÊý¾Ý·ÖÎöÓëÍÚ¾ò
    Ä³ÒøÐÐ È˹¤ÖÇÄÜ+Python+´óÊý¾Ý
    ±±¾© Python¼°Êý¾Ý·ÖÎö
    ÉñÁúÆû³µ ´óÊý¾Ý¼¼Êõƽ̨-Hadoop
    ÖйúµçÐÅ ´óÊý¾Ýʱ´úÓëÏÖ´úÆóÒµµÄÊý¾Ý»¯ÔËӪʵ¼ù