±à¼ÍƼö: |
±¾ÎÄÖ÷Òª·ÖÎöÌÖÂÛÁË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;
}; |
|