±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁË×Ö½ÚÌø¶¯×ÔÑеķֲ¼Ê½Í¼Êý¾Ý¿âºÍͼ¼ÆËãרÓÃÒýÇæ×öÉî¶È½âÎöºÍ·ÖÏí£¬Õ¹Ê¾Ð¼¼ÊõÊÇÈçºÎ½â¾öÒµÎñÎÊÌ⣬ӰÏ켸ÒÚ»¥ÁªÍøÓû§µÄ²úÆ·ÌåÑé¡£
±¾ÎÄÀ´×ÔCSDN£¬ÓÉ»ðÁú¹ûÈí¼þLinda±à¼¡¢ÍƼö¡£ |
|
1. ͼ״½á¹¹Êý¾Ý¹ã·º´æÔÚ
×Ö½ÚÌø¶¯µÄËùÓвúÆ·µÄ´ó²¿·ÖÒµÎñÊý¾Ý£¬¼¸ºõ¶¼¿ÉÒÔ¹éÈëµ½ÒÔÏÂÈýÖÖ£º
Óû§ÐÅÏ¢¡¢Óû§ºÍÓû§µÄ¹ØÏµ£¨¹Ø×¢¡¢ºÃÓѵȣ©£»
ÄÚÈÝ£¨ÊÓÆµ¡¢ÎÄÕ¡¢¹ã¸æµÈ£©£»
Óû§ºÍÄÚÈݵÄÁªÏµ£¨µãÔÞ¡¢ÆÀÂÛ¡¢×ª·¢¡¢µã»÷¹ã¸æµÈ£©¡£
ÕâÈýÖÖÊý¾Ý¹ØÁªÔÚÒ»Æð£¬ÐγÉͼ״£¨Graph£©½á¹¹Êý¾Ý¡£

ΪÁËÂú×ã social graph µÄÔÚÏßÔöɾ¸Ä²é³¡¾°£¬×Ö½ÚÌø¶¯×ÔÑÐÁË·Ö²¼Ê½Í¼´æ´¢ÏµÍ³¡ª¡ªByteGraph¡£Õë¶ÔÉÏÊöͼ״½á¹¹Êý¾Ý£¬ByteGraph
Ö§³ÖÓÐÏòÊôÐÔͼÊý¾ÝÄ£ÐÍ£¬Ö§³Ö Gremlin ²éѯÓïÑÔ£¬Ö§³ÖÁé»î·á¸»µÄдÈëºÍ²éѯ½Ó¿Ú£¬¶ÁдÍÌÍ¿ÉÀ©Õ¹µ½Ç§Íò
QPS£¬ÑÓ³ÙºÁÃë¼¶¡£Ä¿Ç°£¬ByteGraph Ö§³ÖÁËÍ·Ìõ¡¢¶¶Òô¡¢ TikTok¡¢Î÷¹Ï¡¢»ðɽµÈ¼¸ºõ×Ö½ÚÌø¶¯È«²¿²úÆ·Ïߣ¬±é²¼È«Çò»ú·¿¡£ÔÚÕâÆªÎÄÕÂÖУ¬½«´ÓÊÊÓó¡¾°¡¢ÄÚ²¿¼Ü¹¹¡¢¹Ø¼üÎÊÌâ·ÖÎö¼¸¸ö·½Ãæ×÷ÉîÈë½éÉÜ¡£
ByteGraph Ö÷ÒªÓÃÓÚÔÚÏß OLTP ³¡¾°£¬¶øÔÚÀëÏß³¡¾°Ï£¬Í¼Êý¾ÝµÄ·ÖÎöºÍ¼ÆËãÐèÇóÒ²Öð½¥ÏÔÏÖ¡£2019
ÄêÄê³õ£¬Gartner Êý¾ÝÓë·ÖÎö·å»áÉϽ«Í¼ÁÐΪ 2019 ÄêÊ®´óÊý¾ÝºÍ·ÖÎöÇ÷ÊÆÖ®Ò»£¬Ô¤¼ÆÈ«Çòͼ·ÖÎöÓ¦Óý«ÒÔÿÄê
100% µÄËÙ¶ÈѸÃÍÔö³¤£¬2020 Ä꽫´ïµ½ 80 ÒÚÃÀÔª¡£Òò´Ë£¬ÎÒÃÇÍŶÓͬʱҲ¿ªÆôÁËÔÚÀëÏßͼ¼ÆË㳡¾°µÄÖ§³ÖºÍʵ¼ù¡£
ÏÂÃæ»á´ÓͼÊý¾Ý¿âºÍͼ¼ÆËãÁ½¸ö²¿·Ö£¬·Ö±ðÀ´½éÉÜ×Ö½ÚÌø¶¯ÔÚÕâ·½ÃæµÄһЩ¹¤×÷¡£
2. ×ÔÑÐͼÊý¾Ý¿â£¨ByteGraph£©½éÉÜ
´ÓÊý¾ÝÄ£ÐͽǶȿ´£¬Í¼Êý¾Ý¿âÄÚ²¿Êý¾ÝÊÇÓÐÏòÊôÐÔͼ£¬Æä»ù±¾ÔªËØÊÇ Graph Öеĵ㣨Vertex£©¡¢±ß£¨Edge£©ÒÔ¼°ÆäÉϸ½×ŵÄÊôÐÔ£»×÷Ϊһ¸ö¹¤¾ß£¬Í¼Êý¾Ý¶ÔÍâÌṩµÄ½Ó¿Ú¶¼ÊÇÎ§ÈÆÕâÐ©ÔªËØÕ¹¿ª¡£
ͼÊý¾Ý¿â±¾ÖÊÒ²ÊÇÒ»¸ö´æ´¢ÏµÍ³£¬ËüºÍ³£¼ûµÄ KV ´æ´¢ÏµÍ³¡¢MySQL ´æ´¢ÏµÍ³µÄÏà±ÈÖ÷񻂿±ðÔÚÓÚÄ¿±êÊý¾ÝµÄÂß¼¹ØÏµ²»Í¬ºÍ·ÃÎÊģʽ²»Í¬£¬¶ÔÓÚÊý¾ÝÄÚÔÚ¹ØÏµÊÇͼģÐÍÒÔ¼°ÔÚͼÉÏÓÎ×ßÀàºÍģʽƥÅäÀàµÄ²éѯ£¬±ÈÈçÉç½»¹ØÏµ²éѯ£¬Í¼Êý¾Ý¿â»áÓиü´óµÄÐÔÄÜÓÅÊÆºÍ¸ü¼Ó¼ò½à¸ßЧµÄ½Ó¿Ú¡£
2.1 Ϊʲô²»Ñ¡Ôñ¿ªÔ´Í¼Êý¾Ý¿â
ͼÊý¾Ý¿âÔÚ 90 Äê´ú³öÏÖ£¬Ö±µ½×î½ü¼¸ÄêÔÚÊý¾Ý±¬Õ¨µÄ´óÇ÷ÊÆÏ¿ìËÙ·¢Õ¹£¬°Ù»¨Æë·Å£»µ«Ä¿Ç°±È½Ï³ÉÊìµÄ´ó²¿·Ö¶¼ÊÇÃæ¶Ô´«Í³ÐÐÒµ½ÏСµÄÊý¾Ý¼¯ºÍ½ÏµÍµÄ·ÃÎÊÍÌͳ¡¾°£¬±ÈÈ翪ԴµÄ
Neo4j Êǵ¥»ú¼Ü¹¹£»Òò´Ë£¬ÔÚ»¥ÁªÍø³¡¾°Ï£¬Í¨³£¶¼ÊÇ»ùÓÚÒÑÓеĻù´¡ÉèÊ©¶¨ÖÆÏµÍ³£º±ÈÈç Facebook
»ùÓÚ MySQL ϵͳ·â×°ÁË Social Graph ϵͳ TAO£¬¼¸ºõ³ÐÔØÁË Facebook
ËùÓÐÊý¾ÝÂß¼£»Linkedln ÔÚ KV Ö®ÉϹ¹½¨ÁË Social Graph ·þÎñ£»Î¢²©ÊÇ»ùÓÚ Redis
¹¹½¨ÁË·ÛË¿ºÍ¹Ø×¢¹ØÏµ¡£
×Ö½ÚÌø¶¯µÄ Graph ÔÚÏß´æ´¢³¡¾°£¬ ÆäÐèÇóÒ²ÊÇÓÐ×ÔÉíÌØµãµÄ£¬¿ÉÒÔ×ܽáΪ£º
º£Á¿Êý¾Ý´æ´¢£º°ÙÒڵ㡢ÍòÒڱߵÄÊý¾Ý¹æÄ££»²¢ÇÒͼ·ûºÏÃÝÂÉ·Ö²¼£¬±ÈÈçÉÙÁ¿´ó V ·ÛË¿´ïµ½¼¸Ç§Íò£»
º£Á¿ÍÌÍ£º×î´ó¼¯Èº QPS ´ïµ½ÊýǧÍò£»
µÍÑÓ³Ù£ºÒªÇó·ÃÎÊÑÓ³Ù pct99 ÐèÒªÏÞÖÆÔÚºÁÃë¼¶£»
¶Á¶àдÉÙ£º¶ÁÁ÷Á¿ÊÇдÁ÷Á¿µÄ½Ó½ü°Ù±¶Ö®¶à£»
ÇáÁ¿²éѯ¶à£¬ÖØÁ¿²éѯÉÙ£º90%²éѯÊÇͼÉ϶þ¶ÈÒÔÄÚ²éѯ£»
ÈÝÔּܹ¹Ñݽø£ºÒªÄÜÖ§³Ö×Ö½ÚÌø¶¯³ÇÓòÍø¡¢¹ãÓòÍø¡¢ÖÞ¼ÊÍøÂçÖ®¼äÖ÷±¸ÈÝÔÖ¡¢ÒìµØ¶à»îµÈ²»Í¬ÈÝÔÖ²¿Êð·½°¸¡£
ÊÂʵÉÏ£¬ÎÒÃǵ÷ÑйýÁ˺ܶàÒµ½çϵͳ£¬ Õâ¸öÖ÷Ìâ¿ÉÒÔÔÙµ¥¶À·ÖÏíһƪÎÄÕ¡£µ«ÊÇ£¬Ãæ¶Ô×Ö½ÚÌø¶¯ÊÀ½ç¼¶µÄº£Á¿Êý¾ÝºÍº£Á¿²¢·¢ÇëÇó£¬ÓÃÍòÒÚ¼¶·Ö²¼Ê½´æ´¢¡¢Ç§Íò¸ß²¢·¢¡¢µÍÑÓ³Ù¡¢Îȶ¨¿É¿ØÕâÈý¸öÌõ¼þÒ»Æðȥɸѡ£¬Òµ½çÔÚÏßÉϱ»ÑéÖ¤Îȶ¨¿ÉÐÅÀµµÄ¿ªÔ´Í¼´æ´¢ÏµÍ³»ù±¾Ã»ÓÐÂú×ãµÄÁË£»ÁíÍ⣬¶ÔÓÚÒ»¸ö³ÐÔØ¹«Ë¾ºËÐÄÊý¾ÝµÄÖØÒªµÄ»ù´¡ÉèÊ©£¬ÊÇÖµµÃ³¤ÆÚͶÈë²¢ÇÒÉî¶ÈÕÆ¿ØµÄ¡£
Òò´Ë£¬ÎÒÃÇÔÚ 18 Äê 8 Ô·ݣ¬¿ªÊ¼´ÓµÚÒ»ÐдúÂ뿪ʼ̤ÉÏͼÊý¾Ý¿âµÄÂþÂþÕ÷³Ì£¬´Ó½â¾öÒ»¸ö×îºËÐĵͶÒôÉç½»¹ØÏµÎÊÌâÈëÊÖ£¬Öð½¥ÑݱäΪ֧³ÖÓÐÏòÊôÐÔͼÊý¾ÝÄ£ÐÍ¡¢Ö§³ÖдÈëÔ×ÓÐÔ¡¢²¿·Ö
Gremlin ͼ²éѯÓïÑÔµÄͨÓÃͼÊý¾Ý¿âϵͳ£¬ÔÚ¹«Ë¾ËùÓвúÆ·ÌåϵÂ䵨£¬ÎÒÃdzÆÖ®Îª ByteGraph¡£ÏÂÃæ£¬»á´ÓÊý¾ÝÄ£ÐÍ¡¢ÏµÍ³¼Ü¹¹µÈ¼¸¸ö²¿·Ö£¬ÓÉdzÈëÉîºÍ´ó¼Ò·ÖÏíÎÒÃǵŤ×÷¡£
2.2 ByteGraph µÄÊý¾ÝÄ£ÐÍºÍ API
Êý¾ÝÄ£ÐÍ
¾ÍÏñÎÒÃÇÔÚʹÓà SQL Êý¾Ý¿âʱ£¬ÏÈÒªÍê³ÉÊý¾Ý¿â Schema ÒÔ¼°·¶Ê½Éè¼ÆÒ»Ñù£¬ByteGraph
Ò²ÐèÒªÓû§Íê³ÉÀàËÆµÄÊý¾ÝÄ£ÐͳéÏ󣬵«Í¼µÄÊý¾Ý³éÏó¸ü¼Ó¼òµ¥£¬»ù±¾ÉÏÊǰÑÊý¾ÝÖ®¼äµÄ¹ØÏµ¡°·Ò롱³ÉÓÐÏòÊôÐÔͼ£¬ÎÒÃdzÆÖ®Îª¡°¹¹Í¼¡±¹ý³Ì¡£
±ÈÈçÔÚÇ°ÃæÌáµ½µÄ£¬Èç¹ûÏë°ÑÓû§¹ØÏµ´æÈë ByteGraph£¬µÚÒ»²½¾ÍÊÇÐèÒª°ÑÓû§³éÏóΪµã£¬µÚ¶þ²½°Ñ"¹Ø×¢¹ØÏµ¡±¡¢¡°ºÃÓѹØÏµ¡±³éÏóΪ±ß¾ÍÍêÈ«¸ã¶¨ÁË¡£ÏÂÃæ£¬ÎÒÃǾʹӴúÂë²ãÃæ½éÉÜϵã±ßµÄÊý¾ÝÀàÐÍ¡£
µã£¨Vertex£©
µãÊÇͼÊý¾Ý¿âµÄ»ù±¾ÔªËØ£¬Í¨³£·´Ó³µÄÊǾ²Ì¬ÐÅÏ¢¡£ÔÚ ByteGraph ÖУ¬µã°üº¬ÒÔÏÂ×ֶΣº
- µãµÄid(uint64_t):
±ÈÈçÓû§id×÷Ϊһ¸öµã
- µãµÄtype(uint32_t): ±ÈÈçappID×÷ΪµãµÄtype
- µãµÄÊôÐÔ£¨KV ¶Ô£©£º±ÈÈç 'name': string£¬'age':
int, 'gender': male£¬µÈ×Ô¶¨ÒåÊôÐÔ
- [id, type]Ψһ¶¨ÒåÒ»¸öµã |
±ß£¨Edge£©
Ò»Ìõ±ßÓÉÁ½¸öµãºÍµãÖ®¼äµÄ±ßµÄÀàÐÍ×é³É£¬±ß¿ÉÒÔÃèÊöµãÖ®¼äµÄ¹ØÏµ£¬±ÈÈçÓû§ A ¹Ø×¢ÁËÓû§ B £¬¿ÉÒÔÓÃÒÔÏÂ×Ö¶ÎÀ´ÃèÊö£º
- Á½¸öµã£¨Vertex£©:
±ÈÈçÓû§AºÍÓû§B
- ±ßµÄÀàÐÍ(string): ±ÈÈç¡°¹Ø×¢¡±
- ±ßµÄʱ¼ä´Á(uint64_t)£ºÕâ¸ötÖµÊÇÒµÎñ×Ô¶¨Ò庬ÒåµÄ£¬±ÈÈç¿ÉÒÔÓÃÓڼǼ¹Ø×¢·¢ÉúµÄʱ¼ä´Á
- ±ßÊôÐÔ£¨KV¶Ô£©£º±ÈÈç'ts_us': int64
ÃèÊö¹ØÏµ´´½¨Ê±¼äµÄÊôÐÔ£¬ÒÔ¼°ÆäËûÓû§×Ô¶¨ÒåÊôÐÔ |
±ßµÄ·½Ïò
ÔÚ ByteGraph µÄÊý¾ÝÄ£ÐÍÖУ¬±ßÊÇÓз½ÏòµÄ£¬Ä¿Ç°Ö§³Ö 3 Öֱߵķ½Ïò:
- ÕýÏò±ß£ºÈç A ¹Ø×¢
B(A -> B)
- ·´Ïò±ß£ºÈç B ±» A ¹Ø×¢(B <- A)
- Ë«Ïò±ß£ºÈç A Óë B ÊǺÃÓÑ(A <->
B) |
³¡¾°Ê¹ÓÃαÂë¾ÙÀý
¹¹Í¼Íê±Ïºó£¬ÎÒÃǾͿÉÒÔ°ÑÒµÎñÂ߼ͨ¹ý Gremlin ²éѯÓïÑÔÀ´ÊµÏÖÁË£»Îª±ãÓÚ´ó¼ÒÀí½â£¬ÎÒÃÇÁоټ¸ÖÖµäÐ͵ij¡¾°ÎªÀý¡£
³¡¾°Ò»£º¼Ç¼¹Ø×¢¹ØÏµ A ¹Ø×¢ B
// ´´½¨Óû§AºÍB£¬¿ÉÒÔʹÓÃ
.property('name', 'Alice') Óï¾äÌí¼ÓÓû§ÊôÐÔ
g.addV().property("type",
A.type).property("id", A.id)
g.addV().property("type",
B.type).property("id", B.id)
// ´´½¨¹Ø×¢¹ØÏµ A -> B£¬ÆäÖÐaddE("¹Ø×¢")ÖÐÖ¸¶¨Á˱ߵÄÀàÐÍÐÅÏ¢£¬fromºÍto·Ö±ðÖ¸¶¨ÆðµãºÍÖյ㣬
g.addE("¹Ø×¢").from(A.id,
A.type).to(B.id, B.type).property("ts_us",
now) |
³¡¾°¶þ£º²éѯ A ¹Ø×¢µÄÇÒ¹Ø×¢ÁË C µÄËùÓÐÓû§
Óû§ A ½øÈëÓû§ C µÄÏêÇéÒ³Ãæ£¬Ïë¿´¿´ A ºÍ C Ö®¼äµÄ¶þ¶ÈÖмä½ÚµãÓÐÄÄЩ£¬±ÈÈç A->B,B->C£¬B
ÔòΪÖмä½Úµã¡£
// where()±íʾ¶ÔÓÚÉÏÒ»¸östepµÄÿ¸öÖ´Ðнá¹û£¬Ö´ÐÐ×Ó²éѯ¹ýÂËÌõ¼þ£¬Ö»±£Áô¹Ø×¢ÁËCµÄÓû§¡£
g.V().has("type",
A.type).has("id", A.id).out("¹Ø×¢").where(out("¹Ø×¢").has("type",
C.type).has("id", C.id).count().is(gte(1))) |
³¡¾°Èý£º²éѯ A µÄºÃÓѵĺÃÓÑ£¨¶þ¶È¹ØÏµ£©
// both("ºÃÓÑ")Ï൱ÓÚin("ºÃÓÑ")ºÍout("ºÃÓÑ")µÄºÏ¼¯
g.V().has("type",
A.type).has("id", A.id).both("ºÃÓÑ").both("ºÃÓÑ").toSet() |
2.3 ϵͳ¼Ü¹¹
Ç°Ãæ¼¸¸öÕ½ڣ¬´ÓÓû§½Ç¶È½éÉÜÁË ByteGraph µÄÊÊÓó¡¾°ºÍ¶ÔÍâʹÓÃ×ËÊÆ¡£ÄÇ ByteGraph
¼Ü¹¹ÊÇÔõÑùµÄ£¬ÄÚ²¿ÊÇÈçºÎ¹¤×÷µÄÄØ£¬ÕâÒ»½Ú¾ÍÀ´´ÓÄÚ²¿ÊµÏÖÀ´×÷½øÒ»²½½éÉÜ¡£
ÏÂÃæÕâÕÅͼչʾÁË ByteGraph µÄÄÚ²¿¼Ü¹¹£¬ÆäÖÐ bg ÊÇ ByteGraph µÄËõд¡£
¾ÍÏñ MySQL ͨ³£¿ÉÒÔ·ÖΪ SQL ²ãºÍÒýÇæ²ãÁ½²ãÒ»Ñù£¬ByteGraph ×ÔÉ϶øÏ·ÖΪ²éѯ²ã
(bgdb)¡¢´æ´¢/ÊÂÎñÒýÇæ²ã£¨bgkv£©¡¢´ÅÅÌ´æ´¢²ãÈý²ã£¬Ã¿²ã¶¼ÊÇÓɶà¸ö½ø³ÌʵÀý×é³É¡£ÆäÖÐ bgdb
²ãÓë bgkv ²ã»ìºÏ²¿Ê𣬴ÅÅÌ´æ´¢²ã¶ÀÁ¢²¿Êð£¬ÎÒÃÇÏêϸ½éÉÜÿһ²ãµÄ¹Ø¼üÉè¼Æ¡£

²éѯ²ã(bgdb)
bgdb ²ãºÍ MySQL µÄ SQL ²ãÒ»Ñù£¬Ö÷Òª¹¤×÷ÊÇ×ö¶ÁдÇëÇóµÄ½âÎöºÍ´¦Àí£»ÆäÖУ¬Ëùν¡°´¦Àí¡±¿ÉÒÔ·ÖΪÒÔÏÂÈý¸ö²½Ö裺
½«¿Í»§¶Ë·¢À´µÄ Gremlin ²éѯÓï¾ä×öÓï·¨½âÎö£¬Éú³ÉÖ´Ðмƻ®£»
²¢¸ù¾ÝÒ»¶¨µÄ·ÓɹæÔò£¨ÀýÈçÒ»ÖÂÐÔ¹þÏ££©ÕÒµ½Ä¿±êÊý¾ÝËùÔڵĴ洢½Úµã£¨bgkv£©£¬½«Ö´Ðмƻ®ÖеĶÁдÇëÇó·¢Ë͸ø
¶à¸ö bgkv£»
½« bgkv ¶Áд½á¹û»ã×ÜÒÔ¼°¹ýÂË´¦Àí£¬µÃµ½×îÖÕ½á¹û£¬·µ»Ø¸ø¿Í»§¶Ë¡£
bgdb ²ãûÓÐ״̬£¬¿ÉÒÔˮƽÀ©ÈÝ£¬Óà Go ÓïÑÔ¿ª·¢¡£

´æ´¢/ÊÂÎñÒýÇæ²ã£¨bgkv)
bgkv ²ãÊÇÓɶà¸ö½ø³ÌʵÀý×é³É£¬Ã¿¸öʵÀý¹ÜÀíÕû¸ö¼¯ÈºÊý¾ÝµÄÒ»¸ö×Ó¼¯£¨shard / partition)¡£
bgkv ²ãµÄʵÏֺ͹¦ÄÜÓеãÀàËÆÄÚ´æÊý¾Ý¿â£¬Ìṩ¸ßÐÔÄܵÄÊý¾Ý¶Áд¹¦ÄÜ£¬ÆäÌØµãÊÇ£º
½Ó¿Ú²»Í¬£ºÖ»Ìṩµã±ß¶Áд½Ó¿Ú£»
Ö§³ÖËã×ÓÏÂÍÆ£ºÍ¨¹ý°Ñ¼ÆËã(Ëã×Ó)ÒÆ¶¯µ½´æ´¢£¨bgkv£©ÉÏ£¬Äܹ»ÓÐЧÌáÉý¶ÁÐÔÄÜ£»
¾ÙÀý£º±ÈÈçij¸ö´ó V ×î½üÒ»ÄêÒ»Ö±ÔÚÕÇ·Û£¬bgkv Ö§³Ö²éѯ×î½üµÄ 100 ¸ö·ÛË¿£¬Ôò²»±Ø¶Á³öËùÓеİÙÍò·ÛË¿¡£
»º´æ´æ´¢Óлú½áºÏ£ºÆä×÷Ϊ KV store µÄ»º´æ²ã£¬Ìṩ»º´æ¹ÜÀíµÄ¹¦ÄÜ£¬Ö§³Ö»º´æ¼ÓÔØ¡¢»»³ö¡¢»º´æºÍ´ÅÅÌͬ²½Òì²½
sync µÈ¸´ÔÓ¹¦ÄÜ¡£
´ÓÉÏÊöÃèÊö¿ÉÒÔ¿´³ö£¬bgkv µÄÐÔÄܺÍÄÚ´æÊ¹ÓÃЧÂÊÊǷdz£¹Ø¼üµÄ£¬Òò´Ë²ÉÓà C++ ±àд¡£
´ÅÅÌ´æ´¢²ã(KV Cluster)
ΪÁËÄܹ»Ìṩº£Á¿´æ´¢¿Õ¼äºÍ½Ï¸ßµÄ¿É¿¿ÐÔ¡¢¿ÉÓÃÐÔ£¬Êý¾Ý±ØÐë×îÖÕÂäÈë´ÅÅÌ£¬ÎÒÃÇµ×²ã´æ´¢ÊÇÑ¡ÔñÁ˹«Ë¾×ÔÑеķֲ¼Ê½
KV store¡£
ÈçºÎ°Ñͼ´æ´¢ÔÚ KV Êý¾Ý¿âÖÐ
ÉÏһС½Ú£¬Ö»ÊǽéÉÜÁË ByteGraph ÄÚ²¿Èý²ãµÄ¹ØÏµ£¬Ï¸ÐĵĶÁÕß¿ÉÄÜÒѾ·¢ÏÖ£¬ByteGraph
ÍⲿÊÇͼ½Ó¿Ú£¬µ×²ãÊÇÒÀÀµ KV ´æ´¢£¬ÄÇôÎÊÌâÀ´ÁË£ºÈçºÎ°Ñ¶¯éü°ÙÍò·ÛË¿µÄͼÊý¾Ý´æ´¢ÔÚÒ»¸ö KV ϵͳÉÏÄØ£¿
ÔÚ×Ö½ÚÌø¶¯µÄÒµÎñ³¡¾°ÖУ¬´æÔںܶà·ÃÎÊÈȶȺ͡°Êý¾ÝÃܶȡ±¼«¸ßµÄ³¡¾°£¬±ÈÈç¶¶ÒôµÄ´ó V¡¢ÈÈÃŵÄÎÄÕµȣ¬Æä·ÛË¿Êý»òÕßµãÔÞÊý»á³¬¹ýǧÍò¼¶±ð£»µ«×÷Ϊ
KV store£¬Ï£ÍûÒµÎñ·½µÄ KV ¶ÔµÄ´óС£¨Byte Êý£©ÊÇ¿ØÖÆÔÚ KB Á¿¼¶µÄ£¬ÇÒ×îºÃÊÇ´óС¾ùÔȵģº¶ÔÓÚÌ«´óµÄ
value£¬ÊÇ»á˲¼ä´òÂú I/O ·¾¶µÄ£¬ÎÞ·¨±£Ö¤ÏßÉÏÎȶ¨ÐÔ£»¶ÔÓÚÌØ±ðСµÄ value£¬Ôò´æ´¢Ð§ÂʱȽϵ͡£ÊÂʵÉÏ£¬Êý¾Ý´óС²»¾ùÔÈÕâ¸öÎÊÌâÀ§ÈÅÁ˺ܶàÒµÎñÍŶӣ¬ÔÚÏßÉÏÒ²»á¾³£±¬³öʹʡ£
¶ÔÓÚÒ»¸öÓÐǧÍò·ÛË¿µÄ¶¶Òô´ó V£¬Ï൱ÓÚͼÖеÄij¸öµãÓÐǧÍòÌõ±ßµÄ³ö¶È£¬²»½öÒªÄÜ´æ´¢ÏÂÀ´£¬¶øÇÒÒªÄÜÂú×ãÏßÉϺÁÃë¼¶µÄÔöɾ²é¸Ä£¬ÄÇô
ByteGraph ÊÇÈçºÎ½â¾öÕâ¸öÎÊÌâµÄÄØ£¿
˼·ÆäʵºÜ¼òµ¥£¬×ܽáÀ´Ëµ£¬¾ÍÊDzÉÓÃÁé»îµÄ±ß¾ÛºÏ·½Ê½£¬Ê¹µÃ KV store ÖÐµÄ value ´óСÊǾùÔȵ쬾ßÌå¿ÉÒÔÓÃÒÔÏÂËÄÌõÀ´ÃèÊö£º
Ò»¸öµã£¨Vertex£©ºÍÆäËùÓÐÏàÁ¬µÄ±ß×é³ÉÁËÒ»Êý¾Ý×飨Group£©£»²»Í¬µÄÆðµãºÍ¼°ÆäÖÕµãÊÇÊôÓÚ²»Í¬µÄ
Group£¬ÊÇ´æ´¢ÔÚ²»Í¬µÄ KV ¶ÔµÄ£»±ÈÈçÓû§ A µÄ·ÛË¿ºÍÓû§ B µÄ·ÛË¿£¬¾ÍÊǷֳɲ»Í¬ KV
´æ´¢£»
¶ÔÓÚijһ¸öµãµÄ¼°Æä³ö±ß£¬µ±³ö¶ÈÊýÁ¿±È½ÏС£¨KB ¼¶±ð£©£¬½«ÆäËùÓгö¶È¼´ËùÓÐÖÕµãÐòÁл¯ÎªÒ»¸ö KV ¶Ô£¬ÎÒÃdzÆÖ®ÎªÒ»¼¶´æ´¢·½Ê½£¨ºóÃæ»áÕ¹¿ªÃèÊö£©£»
µ±Ò»¸öµãµÄ³ö¶ÈÖð½¥Ôö¶à£¬±ÈÈçÒ»¸öÆÕͨÓû§Ö𽥳ɳ¤Îª¶¶Òô´ó V£¬ÎÒÃÇÔò²ÉÓ÷ֲ¼Ê½ B-Tree ×éÖ¯Õâ°ÙÍò·ÛË¿£¬ÎÒÃdzÆÖ®Îª¶þ¼¶´æ´¢£»
Ò»¼¶´æ´¢ºÍ¶þ¼¶´æ´¢Ö®¼ä¿ÉÒÔÔÚÏß²¢·¢°²È«µÄ»¥ÏàÇл»£»
Ò»¼¶´æ´¢¸ñʽ
Ò»¼¶´æ´¢¸ñʽÖУ¬Ö»ÓÐÒ»¸ö KV ¶Ô£¬key ºÍ value µÄ±àÂ룺
- key: ij¸öÆðµã
id + Æðµã type + ±ß type
- value: ´ËÆðµãµÄËùÓгö±ß£¨Edge£©¼°Æä±ßÉÏÊôÐÔ¾ÛºÏ×÷Ϊ
value£¬µ«²»°üÀ¨ÖÕµãµÄÊôÐÔ |
¶þ¼¶´æ´¢£¨µãµÄ³ö¶È´óÓÚãÐÖµ£©
Èç¹ûÒ»¸ö´ó V ·è¿ñÕÇ·Û£¬Ôò´æ´¢·ÛË¿µÄ value ¾Í»áÔ½À´Ô½´ó£¬½â¾öÕâ¸öÎÊÌâµÄ˼·ҲºÜÆÓËØ£º²ð³É¶à¸ö
KV ¶Ô¡£
µ«ÈçºÎ²ðÄØ£¿ByteGraph µÄ·½Ê½¾ÍÊǰÑËùÓгö¶ÈºÍÖÕµã²ð³É¶à¸ö KV ¶Ô£¬ËùÓÐ KV ¶ÔÐγÉÒ»¿ÃÂß¼Éϵķֲ¼Ê½
B-Tree£¬Ö®ËùÒÔ˵¡°Âß¼Éϵġ±£¬ÊÇÒòΪÊ÷ÖÐµÄ½Úµã¹ØÏµÊÇ¿¿ KV ÖÐ key À´Ö¸ÏòµÄ£¬²¢·ÇÄÚ´æÖ¸Õ룻B-Tree
ÊÇ·Ö²¼Ê½µÄ£¬ÊÇÖ¸¹¹³ÉÕâ¿ÃÊ÷µÄ¸÷¼¶½ÚµãÊÇ·Ö²¼ÔÚ¼¯Èº¶à¸öʵÀýÉϵ쬲¢²»Êǵ¥»úË÷Òý¹ØÏµ¡£¾ßÌå¹ØÏµÈçÏÂͼËùʾ£º

ÆäÖУ¬Õû¿Ã B-Tree Óɶà×é KV ¶Ô×é³É£¬°´ÕÕ¹ØÏµ¿ÉÒÔ·ÖΪÈýÖÖÊý¾Ý£º
¸ù½Úµã£º¸ù½Úµã±¾ÖÊÊÇÒ»¸ö KV ϵͳÖеÄÒ»¸ö key£¬Æä±àÂ뷽ʽºÍÒ»¼¶´æ´¢ÖÐµÄ key Ïàͬ
Meta Êý¾Ý£º
Meta Êý¾Ý±¾ÖÊÊÇÒ»¸ö KV ÖÐµÄ value£¬ºÍ¸ù½Úµã×é³ÉÁË KV ¶Ô£»
Meta ÄÚ²¿´æ´¢Á˶à¸ö PartKey£¬ÆäÖÐÿ¸ö PartKey ¶¼ÊÇÒ»¸ö KV ¶ÔÖÐµÄ key£¬Æä¶ÔÓ¦µÄ
value Êý¾Ý¾ÍÊÇÏÂÃæ½éÉÜµÄ Part Êý¾Ý£»
Part Êý¾Ý
¶ÔÓÚ¶þ¼¶´æ´¢¸ñʽ£¬´æÔÚ¶à¸ö Part£¬Ã¿¸ö Part ´æ´¢²¿·Ö³ö±ßµÄÊôÐÔºÍÖÕµã ID
ÿ¸ö Part ¶¼ÊÇÒ»¸ö KV ¶ÔµÄ value£¬Æä¶ÔÓ¦µÄ key ´æ´¢ÔÚ Meta ÖС£
´ÓÉÏÊöÃèÊö¿ÉÒÔ¿´³ö£¬¶ÔÓÚÒ»¸ö³ö¶ÈºÜ¶àµÄµãºÍÆä±ßµÄÊý¾Ý£¨±ÈÈç´ó V ºÍÆä·ÛË¿£©£¬ÔÚ ByteGraph
ÖУ¬ÊǴ洢Ϊ¶à¸ö KV µÄ£¬Ãæ¶ÔÔöɾ²é¸ÄµÄÐèÇ󣬶¼ÐèÒªÔÚ B-Tree ÉÏ×ö¶þ·Ö²éÕÒ¡£Ïà±ÈÓÚÒ»Ìõ±ßÒ»¸ö
KV ¶Ô»òÕßËùÓбߴ洢³ÉÒ»¸ö KV ¶ÔµÄ·½Ê½£¬B-Tree µÄ×éÖ¯·½Ê½Äܹ»ÓÐЧµÄÔÚ¶Á·Å´óºÍд·Å´óÖ®¼ä×öһЩ¶¯Ì¬µ÷Õû¡£
µ«ÔÚʵ¼ÊÒµÎñ³¡¾°Ï£¬·ÛË¿»á´¦ÓÚ¶¯Ì¬±ä»¯Ö®ÖУºÐµ®ÉúµÄ´ó V »á¿ìËÙÐÂÔö·ÛË¿£¬ÓÐЩ´ó V »á³ÖÐøµô·Û£»Òò´Ë£¬´æ´¢·½Ê½»áÔÚÒ»¼¶´æ´¢ºÍ¶þ¼¶´æ´¢Ö®¼äת»»£¬²¢ÇÒ
B-Tree »á³ÖÐøµÄ·ÖÁÑ»òÕߺϲ¢£»Õâ¾Í»áÒý·¢·Ö²¼Ê½µÄ²¢·¢Ôöɾ²é¸ÄÒÔ¼°·ÖÁѺϲ¢µÈ¸´ÔÓµÄÎÊÌ⣬Óлú»á¿ÉÒÔÔÙµ¥¶À·ÖÏíÏÂÕâ¸öÓÐȤµÄÉè¼Æ¡£
ByteGraph ºÍ KV store µÄ¹ØÏµ£¬ÀàËÆÎļþϵͳºÍ¿éÉ豸µÄ¹ØÏµ£¬¿éÉ豸¸ºÔ𽫴洢×ÊÔ´³Ø»¯²¢Ìṩ
Low Level µÄ¶Áд½Ó¿Ú£¬ÎļþϵͳÔÚ¿éÉ豸ÉϰÑÔªÊý¾ÝºÍÊý¾Ý×éÖ¯³É¸÷ÖÖÊ÷µÄË÷Òý½á¹¹£¬²¢·â×°·á¸»µÄ
POSIX ½Ó¿Ú£¬±ãÓÚÍⲿʹÓá£
2.4 һЩÎÊÌâÉîÈë̽ÌÖ
µÚÈý½Ú½éÉÜÁË ByteGraph µÄÄÚÔڼܹ¹£¬ÏÖÔÚÎÒÃǸü½øÒ»²½£¬À´¿´¿´Ò»¸ö·Ö²¼Ê½´æ´¢ÏµÍ³£¬ÔÚÃæ¶Ô×Ö½ÚÌø¶¯ÍòÒÚÊý¾ÝÉÏÒÚ²¢·¢µÄÒµÎñ³¡¾°ÏÂÁ½¸öÎÊÌâµÄ·ÖÎö¡£
ÈȵãÊý¾Ý¶Áд½â¾ö
ÈȵãÊý¾ÝÔÚ×Ö½ÚÌø¶¯µÄÏßÉÏÒµÎñÖй㷺´æÔÚ£ºÈȵãÊÓÆµ¡¢ÈȵãÎÄÕ¡¢´ó V Óû§¡¢Èȵã¹ã¸æµÈµÈ£»ÈȵãÊý¾Ý¿ÉÄÜ»á³öÏÖ˲ʱ³öÏÖ´óÁ¿¶Áд¡£ByteGraph
ÔÚÏßÉÏÒµÎñµÄʵ¼ùÖУ¬´òÄ¥³öÒ»ÕûÌ×Ó¦¶ÔÐÔ·½°¸¡£
Èȵã¶Á
Èȵã¶ÁµÄ³¡¾°Ëæ´¦¿É¼û£¬±ÈÈçÏßÉÏʵ¼Ê³¡¾°£ºÄ³¸öÈȵãÊÓÆµ±»Æµ·±Ë¢Ð£¬²é¿´µãÔÞÊýÁ¿µÈ¡£ÔÚÕâÖÖ³¡¾°Ï£¬Òâζ×Å·ÃÎÊÓкÜÇ¿µÄÊý¾Ý¾Ö²¿ÐÔ£¬»º´æÃüÖÐÂÊ»áºÜ¸ß£¬Òò´Ë£¬ÎÒÃÇÉè¼ÆÊµÏÖÁ˶༶µÄ
Query Cache »úÖÆÒÔ¼°ÈȵãÇëÇóת·¢»úÖÆ£»ÔÚ bgdb ²éѯ²ã»º´æ²éѯ½á¹û£¬ bgdb µ¥½Úµã»º´æÃüÖжÁÐÔÄÜ
20w QPS ÒÔÉÏ£¬¶øÇÒ¶à¸ö bgdb ¿ÉÒÔ²¢·¢´¦Àíͬһ¸öÈȵãµÄ¶ÁÇëÇó£¬ÔòϵͳÕûÌåÓ¦¶ÔÈȵã¶ÈµÄ¡°µ¯ÐÔ¡±ÊǷdz£³ä×ãµÄ¡£
Èȵãд
Èȵã¶ÁºÍÈȵãдͨ³£ÊÇÏà°é¶øÉúµÄ£¬ÈȵãдµÄÀý×ÓÒ²ÊÇËæ´¦¿É¼û£¬±ÈÈ磺ÈȵãÐÂÎű»·è¿ñת·¢£¬ ÈȵãÊÓÆµ±»·è¿ñµãÔ޵ȵȡ£¶ÔÓÚÊý¾Ý¿â¶øÑÔ£¬ÈȵãдÈëµ¼ÖµÄÐÔÄÜÍË»¯µÄ±³ºóÔÒòͨ³£ÓÐÁ½¸ö£ºÐÐËø³åÍ»¸ß»òÕß´ÅÅÌдÈë
IOPS ±»´òÂú£¬ÎÒÃÇ·Ö±ðÀ´·ÖÎö£º
ÐÐËø³åÍ»¸ß£ºÄ¿Ç° ByteGraph Êǵ¥ÐÐÊÂÎñÄ£ÐÍ£¬Ö»ÓÐÄÚ´æ½á¹¹Ëø£¬Õâ¸öËøµÄ²¢·¢Á¿ÊÇÿÃëǧÍò¼¶£¬»ù±¾²»»á¹¹³ÉдÈëÆ¿¾±£»
´ÅÅÌ IOPS ±»´òÂú£º
IOPS£¨I/O Count Per Second£©µÄ¸ÅÄ´ÅÅÌÿÃëµÄдÈëÇëÇóÊýÁ¿ÊÇÓÐÉÏÏ޵쬲»Í¬ÐͺŵĹÌ̬ӲÅ̵Ä
IOPS ¸÷Ò죬µ«¶¼ÓÐÒ»¸öÉÏÏÞ£¬µ±ÉÏÓÎдÈëÁ÷Á¿³¬¹ýÕâ¸öãÐֵʱºò£¬ÇëÇó¾Í»áÅŶӣ¬Ôì³ÉÕû¸öÊý¾Ýͨ·¶ÂÈû£¬Ñӳپͻá³ÊÏÖÖ¸ÊýÉÏÕÇ×îÖÕ·þÎñ±ä³É²»¿ÉÓá£
Group Commit ½â¾ö·½°¸£ºGroup Commit ÊÇÊý¾Ý¿âÖеÄÒ»¸ö³ÉÊìµÄ¼¼Êõ·½°¸£¬¼òµ¥À´½²£¬¾ÍÊǶà¸öдÇëÇóÔÚ
bgkv ÄÚ´æÖлã¾ÛÆðÀ´£¬¾Û³ÉÒ»¸ö Batch дÈë KV store£¬Ôò¶ÔÍâÌåÏÖµÄдÈëËÙÂʾÍÊÇ BatchSize
* IOPS¡£

¶ÔÓÚij¸ö¶ÀÁ¢Êý¾ÝÔ´À´Ëµ£¬Ò»°ãÈȵãдµÄÇëÇó±ÈÈȵã¶Á»áÉٺܶ࣬һ°ã²»»á³¬¹ý 10K QPS£¬Ä¿Ç° ByteGraph
ÏßÉÏ»¹Ã»ÓгöÏÖ¹ýÈȵãдÎÊÌâÎÊÌâ¡£
ͼµÄË÷Òý
¾ÍÏñ¹ØÏµÐÍÊý¾Ý¿âÒ»Ñù£¬Í¼Êý¾Ý¿âÒ²¿ÉÒÔ¹¹½¨Ë÷Òý¡£Ä¬ÈÏÇé¿öÏ£¬¶ÔÓÚͬһ¸öÆðµã£¬ÎÒÃÇ»á²ÉÓñßÉϵÄÊôÐÔ£¨Ê±¼ä´Á£©×÷ΪÖ÷¼üË÷Òý£»µ«ÎªÁ˼ÓËÙ²éѯ£¬ÎÒÃÇÒ²Ö§³ÖÆäËûÔªËØ£¨Öյ㡢ÆäËûÊôÐÔ£©À´¹¹½¨¶þ¼¶µÄ¾Û´ØË÷Òý£¬ÕâÑùºÜ¶à²éÕҾʹÓÈ«²¿±éÀúÓÅ»¯³ÉÁ˶þ·Ö²éÕÒ£¬Ê¹µÃ²éѯËÙ¶È´ó·ùÌáÉý¡£
ByteGraph ĬÈϰ´ÕÕ±ßÉϵÄʱ¼ä´Á£¨ts£©À´ÅÅÐò´æ´¢£¬Òò´Ë¶ÔÓÚÒÔÏÂÇëÇ󣬲éѯЧÂʺܸߣº
²éѯ×î½üµÄÈô¸É¸öµãÔÞ
²éѯij¸öÖ¸¶¨Ê±¼ä·¶Î§´°¿ÚÄڼӵĺÃÓÑ
·½ÏòµÄË÷Òý¿ÉÄÜÓÐЩ·Ñ½â£¬¾Ù¸öÀý×Ó˵Ã÷Ï£º¸ø¶¨Á½¸öÓû§À´²éѯÊÇ·ñ´æÔÚ·ÛË¿¹ØÏµ£¬ÆäÖÐÒ»¸öÓû§ÊÇ´ó V£¬ÁíÒ»¸öÊÇÆÕͨÓû§£¬´ó
V µÄ·ÛË¿¿É´ïǧÍò£¬µ«ÆÕͨÓû§µÄ¹Ø×¢ÕßÒ»°ã²»»áºÜ¶à£»Òò´Ë£¬Èç¹ûÓÃÆÕͨÓû§×÷ΪÆðµã´ó V ×÷ΪÖյ㣬²éѯ´ú¼Û¾Í»áµÍºÜ¶à¡£Æäʵ£¬ºÜ¶à³¡¾°Ï£¬ÎÒÃÇ»¹ÐèÒªÓû§Äܹ»¸ù¾ÝÈÎÒâÒ»¸öÊôÐÔÀ´¹¹½¨Ë÷Òý£¬Õâ¸öÒ²ÊÇÎÒÃÇÕýÔÚÖ§³ÖµÄÖØÒª¹¦ÄÜÖ®Ò»¡£
2.5 δÀ´Ì½Ë÷
¹ýÈ¥µÄÒ»Äê°ëʱ¼äÀByteGraph ¶¼ÊÇÔÚÓÐÏÞµÄÈËÁ¦Çé¿öÏ£¬ÓÅÏÈÂú×ãÒµÎñÐèÇó£¬ÔÚϵͳÄÜÁ¦¹¹½¨·½Ã滹ÊÇÓÐЩ±¡ÈõµÄ£¬ÓдóÁ¿ÎÊÌâ¶¼ÐèÒªÔÚδÀ´Í»ÆÆ½â¾ö£º
´Óͼ´æ´¢µ½Í¼Êý¾Ý¿â£º¶ÔÓÚÒ»¸öÊý¾Ý¿âϵͳ£¬ÊÇ·ñÖ§³Ö ACID µÄÊÂÎñ£¬ÊÇÒ»¸öºËÐÄÎÊÌ⣬Ŀǰ ByteGraph
Ö»½â¾öÁËÔ×ÓÐÔºÍÒ»ÖÂÐÔ£¬¶ÔÓÚ×ÔӵĸôÀëÐÔ»¹ÍêȫûÓд¥Åö£¬ÕâÊÇÒ»¸ö·Ç³£¸´ÔÓµÄÎÊÌ⣻ÁíÍ⣬ÖйúÐÅͨԺ·¢²¼Á˹úÄÚͼÊý¾Ý¿â¹¦Äܰׯ¤Ê飬ÒԴ˱ê×¼£¬Èç¹ûÏë×öºÃÒ»¸ö¹¦ÄÜÍ걸µÄ¡°Êý¾Ý¿â¡±ÏµÍ³£¬ÎÒÃÇÃæ¶ÔµÄ»¹ÊÇÐdz½´óº££»
±ê×¼µÄͼ²éѯÓïÑÔ£ºÄ¿Ç°£¬Í¼Êý¾Ý¿âµÄ²éѯÓïÑÔÒµ½ç»¹Î´Ðγɱê×¼£¨GQL ¼´½«ÔÚ 2020 Äê·¢²¼£©£¬ByteGraph
Ñ¡Ôñ Apache¡¢AWS ¡¢°¢ÀïÔÆµÄ Gremlin ÓïÑÔÌåϵ£¬µ«Ä¿Ç°Ò²Ö»ÊÇÖ§³ÖÁËÒ»¸ö×Ó¼¯£¬¸ü¶àµÄÓï·¨Ö§³Ö¡¢¸üÉîÈëµÄ²éѯÓÅ»¯»¹Î´¿ªÕ¹£»
Cloud Native ´æ´¢¼Ü¹¹Ñݽø£ºÏÖÔÚ ByteGraph »¹Êǹ¹½¨Óë KV ´æ´¢Ö®ÉÏ£¬¶ÀÕ¼ÎïÀí»úÈ«²¿×ÊÔ´£»´Ó×ÊÔ´µ¯ÐÔ²¿Êð¡¢ÔËάÍйܵȽǶÈÊÇ·ñÓÐÆäËû¼Ü¹¹ÑݽøµÄ̽Ë÷¿ÉÄÜ£¬´Ó²éѯµ½ÊÂÎñÔÙµ½´ÅÅÌ´æ´¢ÊÇ·ñÓÐÉî¶È´¹Ö±ÕûºÏÓÅ»¯µÄ¿Õ¼ä£¬Ò²ÊÇÒ»¸öûÓб»»Ø´ðµÄÎÊÌ⣻
ÏÖÔÚ ByteGraph ÊÇÔÚ OLTP ³¡¾°Ï³ÐÔØÁË´óÁ¿ÏßÉÏÊý¾Ý£¬ÕâЩÊý¾ÝͬʱҲ»áÓ¦Óõ½ÍƼö¡¢·ç¿ØµÈ¸´ÔÓ·ÖÎöºÍͼ¼ÆË㳡¾°£¬ÈçºÎ°Ñ
TP ºÍÇáÁ¿ AP ²éѯÈÚºÏÔÚÒ»Æð£¬¾ß±¸²¿·Ö HTAP ÄÜÁ¦£¬Ò²ÊÇÒ»¸ö¿Õ¼ä¹ãÀ«µÄÀ¶º£ÁìÓò¡£
3. ͼ¼ÆËãϵͳ½éÉÜÓëʵ¼ù
3.1 ͼ¼ÆËã¼¼Êõ±³¾°
ͼ¼ÆËã¼ò½é
ͼÊý¾Ý¿âÖØµãÃæ¶Ô OLTP ³¡¾°£¬ÒÔÊÂÎñΪºËÐÄ£¬Ç¿µ÷Ôöɾ²é¸Ä²¢ÖØ£¬²¢ÇÒÒ»¸ö²éѯÍùÍùÖ»ÊÇÉæ¼°µ½Í¼ÖеÄÉÙÁ¿Êý¾Ý£»¶øÍ¼¼ÆËãÓëÖ®²»Í¬£¬Êǽâ¾ö´ó¹æÄ£Í¼Êý¾Ý´¦ÀíµÄ·½·¨£¬Ãæ¶Ô
OLAP ³¡¾°£¬ÊǶÔÕû¸öͼ×ö·ÖÎö¼ÆË㣬ÏÂͼ£¨ÒýÓÃ×Ô VLDB 2019 keynote ¡¶Graph
Processing: A Panaromic View and Some Open Problems¡·£©ÃèÊöÁËͼ¼ÆËãºÍͼÊý¾Ý¿âµÄһЩÁìÓòÇø·Ö¡£ 
¾Ù¸öͼ¼ÆËãµÄ¼òµ¥Àý×Ó£¬ÔÚÎÒÃDZȽÏÊìϤµÄ Google µÄËÑË÷³¡¾°ÖУ¬ÐèÒª»ùÓÚÍøÒ³Á´½Ó¹ØÏµ¼ÆËãÿ¸öÍøÒ³µÄ
PageRank Öµ£¬ÓÃÀ´¶ÔÍøÒ³½øÐÐÅÅÐò¡£ÍøÒ³Á´½Ó¹ØÏµÆäʵ¾ÍÊÇÒ»ÕÅͼ£¬¶ø»ùÓÚÍøÒ³Á´½Ó¹ØÏµµÄ PageRank
¼ÆË㣬Æäʵ¾ÍÊÇÔÚÕâÕÅͼÉÏÔËÐÐͼËã·¨£¬Ò²¾ÍÊÇͼ¼ÆËã¡£
¶ÔÓÚС¹æÄ£µÄͼ£¬ÎÒÃÇ¿ÉÒÔÓõ¥»úÀ´½øÐмÆËã¡£µ«Ëæ×ÅÊý¾ÝÁ¿µÄÔö´ó£¬Ò»°ãÐèÒªÒýÈë·Ö²¼Ê½µÄ¼ÆËãϵͳÀ´½â¾ö£¬²¢ÇÒÒªÄܹ»¸ßЧµØÔËÐи÷ÖÖÀàÐ͵ÄͼËã·¨¡£
Åú´¦Àíϵͳ
´ó¹æÄ£Êý¾Ý´¦ÀíÎÒÃÇÖ±½ÓÏëµ½µÄ¾ÍÊÇʹÓà MapReduce / Spark µÈÅú´¦Àíϵͳ£¬×Ö½ÚÌø¶¯ÔÚ³õÆÚÒ²Óв»ÉÙÒµÎñʹÓÃ
MapReduce / Spark À´ÊµÏÖͼËã·¨¡£µÃÒæÓÚÅú´¦ÀíϵͳµÄ¹ã·ºÊ¹Óã¬ÒµÎñͬѧÄܹ»¿ìËÙʵÏÖ²¢ÉÏÏß×Ô¼ºµÄËã·¨Âß¼¡£
Åú´¦Àíϵͳ±¾ÉíÊÇΪÁË´¦ÀíÐÐʽÊý¾Ý¶øÉè¼ÆµÄ£¬ÆäÄܹ»ÇáÒ׵ؽ«¹¤×÷¸ºÔØ·ÖÉ¢ÔÚ²»Í¬µÄ»úÆ÷ÉÏ£¬²¢Ðеش¦Àí´óÁ¿µÄÊý¾Ý¡£²»¹ýͼÊý¾Ý±È½ÏÌØÊ⣬ÌìÈ»¾ßÓйØÁªÐÔ£¬ÎÞ·¨ÏñÐÐʽÊý¾ÝÒ»ÑùÖ±½ÓÇиÈç¹ûÓÃÅú´¦ÀíϵͳÀ´ÔËÐÐͼËã·¨£¬¾Í¿ÉÄÜ»áÒýÈë´óÁ¿µÄ
Shuffle À´ÊµÏÖ¹ØÏµµÄÁ¬½Ó£¬¶ø Shuffle ÊÇÒ»ÏîºÜÖØµÄ²Ù×÷£¬²»½ö»áµ¼ÖÂÈÎÎñÔËÐÐʱ¼ä³¤£¬²¢ÇÒ»áÀË·ÑºÜ¶à¼ÆËã×ÊÔ´¡£
ͼ¼ÆËãϵͳ
ͼ¼ÆËãϵͳÊÇÕë¶ÔͼËã·¨µÄÌØµã¶øÑÜÉú³öµÄרÓüÆËãÉèÊ©£¬Äܹ»¸ßЧµØÔËÐÐͼËã·¨¡£Òò´ËËæ×ÅÒµÎñµÄ·¢Õ¹£¬ÎÒÃÇÆÈÇÐÐèÒªÒýÈëͼ¼ÆËãϵͳÀ´½â¾öͼÊý¾Ý´¦ÀíµÄÎÊÌ⡣ͼ¼ÆËãÒ²ÊDZȽϳÉÊìµÄÁìÓò£¬ÔÚѧÊõ½çºÍ¹¤Òµ½çÒÑÓдóÁ¿µÄϵͳ£¬ÕâЩϵͳÔÚ²»Í¬³¡¾°£¬Ò²¸÷ÓÐÓÅÁÓÊÆ¡£
ÓÉÓÚÃæÏò²»Í¬µÄÊý¾ÝÌØÕ÷¡¢²»Í¬µÄËã·¨ÌØÐԵȣ¬Í¼¼ÆËãϵͳÔÚÆ½Ì¨¼Ü¹¹¡¢¼ÆËãÄ£ÐÍ¡¢Í¼»®·Ö¡¢Ö´ÐÐÄ£ÐÍ¡¢Í¨ÐÅÄ£Ð͵ȷ½Ãæ¸÷ÓÐÈ¡Éá¡£ÏÂÃæ£¬ÎÒÃÇ´Ó²»Í¬½Ç¶È¶Ôͼ¼ÆËãµÄһЩÏÖÓм¼Êõ×öЩ·ÖÀà·ÖÎö¡£
·Ö²¼¼Ü¹¹
°´ÕÕ·Ö²¼¼Ü¹¹£¬Í¼¼ÆËã¿ÉÒÔ·ÖΪµ¥»ú»ò·Ö²¼Ê½¡¢È«ÄÚ´æ»òʹÓÃÍâ´æ¼¸ÖÖ£¬³£¼ûµÄ¸÷ÖÖͼ¼ÆËãϵͳÈçÏÂͼËùʾ¡£µ¥»ú¼Ü¹¹µÄÓÅÊÆÔÚÓÚÎÞÐ迼ÂÇ·Ö²¼Ê½µÄͨÐÅ¿ªÏú£¬µ«Í¨³£ÄÑÒÔ¿ìËÙ´¦Àí´ó¹æÄ£µÄͼÊý¾Ý£»·Ö²¼Ê½Ôòͨ¹ýͨÐÅ»ò·Ö²¼Ê½¹²ÏíÄڴ潫¿É´¦ÀíµÄÊý¾Ý¹æÄ£À©´ó£¬µ«Í¨³£Ò²»áÒýÈë¾Þ´óµÄ¶îÍ⿪Ïú¡£

¼ÆËãÄ£ÐÍ
°´ÕÕ¼ÆËã¶ÔÏó£¬Í¼Êý¾Ý¼ÆËãÄ£ÐÍ¿ÉÒÔ·ÖΪ½ÚµãÖÐÐļÆËãÄ£ÐÍ¡¢±ßÖÐÐļÆËãÄ£ÐÍ¡¢×ÓͼÖÐÐļÆËãÄ£Ð͵ȡ£
´ó²¿·Öͼ¼ÆËãϵͳ¶¼²ÉÓÃÁ˽ڵãÖÐÐļÆËãÄ£ÐÍ£¨ÕâÀïµÄ½ÚµãָͼÉϵÄÒ»¸öµã£©£¬¸ÃÄ£ÐÍÀ´×Ô Google µÄ
Pregel£¬ºËÐÄ˼ÏëÊÇÓû§±à³Ì¹ý³ÌÖУ¬ÒÔͼÖÐÒ»¸ö½Úµã¼°ÆäÁÚ±ß×÷ΪÊäÈëÀ´½øÐÐÔËË㣬¾ßÓбà³Ì¼òµ¥µÄÓÅÊÆ¡£µäÐ͵ĽڵãÖÐÐļÆËãÄ£ÐͰüÀ¨
Pregel Ìá³öµÄ Pregel API ¡¢ PowerGraph Ìá³öµÄ GAS API ÒÔ¼°ÆäËûһЩ
API¡£
Pregel ´´ÐÂÐÔµØÌá³öÁË "think like a vertex" µÄ˼Ï룬Óû§Ö»Ðè±àд´¦ÀíÒ»¸ö½ÚµãµÄÂß¼£¬¼´¿É±»ÍØÕ¹µ½ÕûÕÅͼ½øÐеü´úÔËË㣬ʹÓÃ
Pregel ÃèÊöµÄ PageRank ÈçÏÂͼËùʾ£º
def pagerank(vertex_id,
msgs):
// ¼ÆËãÊÕµ½ÏûÏ¢µÄÖµÖ®ºÍ
msg_sum = sum(msgs)
// ¸üе±Ç°PRÖµ
pr = 0.15 + 0.85 * msg_sum
// ÓÃмÆËãµÄPRÖµ·¢ËÍÏûÏ¢
for nr in out_neighbor(vertex_id):
msg = pr / out_degree(vertex_id)
send_msg(nr, msg)
// ¼ì²éÊÇ·ñÊÕÁ²
if converged(pr):
vote_halt(vertex_id) |
GAS API ÔòÊÇ PowerGraph ΪÁ˽â¾öÃÝÂÉͼ£¨Ò»Ð¡²¿·Ö½ÚµãµÄ¶ÈÊý·Ç³£¸ß£©µÄÎÊÌ⣬½«¶ÔÒ»¸ö½ÚµãµÄ´¦ÀíÂß¼£¬²ð·ÖΪÁË
Gather¡¢Apply¡¢Scatter Èý½×¶Î¡£ÔÚ¼ÆËãÂú×ã½»»»ÂɺͽáºÏÂɵÄÇé¿öÏ£¬Í¨¹ýʹÓà GAS
Ä£ÐÍ£¬Í¨Ðųɱ¾´Ó |E| ½µµÍµ½ÁË |V|£¬Ê¹Óà GAS ÃèÊöµÄ PageRank ÈçÏÂͼËùʾ£º
def gather(msg_a,
msg_b):
// »ã¾ÛÏûÏ¢
return msg_a + msg_b
def apply(vertex_id, msg_sum):
// ¸üÐÂPRÖµ
pr = 0.15 + 0.85 * msg_sum
// ÅжÏÊÇ·ñÊÕÁ²
if converged(pr):
vote_halt(vertex_id)
def scatter(vertex_id, nr):
// ·¢ËÍÏûÏ¢
return pr / out_degree(vertex_id) |
ͼ»®·Ö
¶ÔÓÚµ¥»úÎÞ·¨´¦ÀíµÄ³¬¼¶´óͼ£¬ÔòÐèÒª½«Í¼Êý¾Ý»®·Ö³É¼¸¸ö×Óͼ£¬²ÉÓ÷ֲ¼Ê½¼ÆË㷽ʽ£¬Òò´Ë£¬»áÉæ¼°µ½Í¼»®·ÖµÄÎÊÌ⣬¼´ÈçºÎ½«Ò»ÕûÕÅͼÇиî³É×Óͼ£¬²¢·ÖÅ䏸²»Í¬µÄ»úÆ÷½øÐзֲ¼Ê½µØ¼ÆËã¡£³£¼ûµÄͼ»®·Ö·½Ê½ÓÐÇб߷¨£¨Edge-Cut£©ºÍÇе㷨£¨Vertex-Cut£©£¬ÆäʾÒâͼÈçÏÂËùʾ£º

Çб߷¨¹ËÃû˼Ò壬»á´ÓÒ»Ìõ±ßÖмäÇпª£¬Á½±ßµÄ½Úµã»á·Ö²¼ÔÚ²»Í¬µÄͼ·ÖÇø£¬Ã¿¸ö½ÚµãÈ«¾ÖÖ»»á³öÏÖÒ»´Î£¬µ«Çб߷¨¿ÉÄܻᵼÖÂÒ»Ìõ±ßÔÚÈ«¾Ö³öÏÖÁ½´Î¡£ÈçÉÏ×óͼËùʾ£¬½Úµã
A Óë½Úµã B Ö®¼äÓÐÒ»Ìõ±ß£¬Çб߷¨»áÔÚ A ºÍ B ÖмäÇпª£¬A ÊôÓÚͼ·ÖÇø 1£¬B ÊôÓÚͼ·ÖÇø
2¡£
Çе㷨ÔòÊǽ«Ò»¸ö½ÚµãÇпª£¬¸Ã½ÚµãÉϲ»Í¬µÄ±ß»á·Ö²¼ÔÚ²»Í¬µÄͼ·ÖÇø£¬Ã¿Ìõ±ßÈ«¾ÖÖ»»á³öÏÖÒ»´Î£¬µ«Çе㷨»áµ¼ÖÂÒ»¸ö½ÚµãÔÚÈ«¾Ö³öÏÖ¶à´Î¡£ÈçÉÏͼÓÒͼËùʾ£¬½Úµã
A ±»ÇзÖΪ 3 ·Ý£¬ÆäÖÐ±ß AB ÊôÓÚ·ÖÇø 2£¬±ß AD ÊôÓÚͼ·ÖÇø 3¡£
ͼ»®·Ö»¹»áÉæ¼°µ½·Öͼ²ßÂÔ£¬±ÈÈçÇе㷨»áÓи÷ÖÖ²ßÂÔµÄÇз¨£º°´±ßËæ»ú¹þÏ£¡¢Edge1D¡¢Edge2D µÈµÈ¡£ÓÐЩ²ßÂÔÊÇ¿ÉÈ«¾Ö²¢ÐÐÖ´ÐзÖͼµÄ£¬Ëٶȿ죬µ«¸ºÔؾùºâºÍ¼ÆËãʱµÄͨÐÅЧÂʲ»ÀíÏ룻ÓÐЩÊÇÐèÒª´®ÐÐÖ´Ðеĵ«¸ºÔؾùºâ¡¢Í¨ÐÅЧÂÊ»á¸üºÃ£¬¸÷ÖÖ²ßÂÔÐèÒª¸ù¾Ý²»Í¬µÄÒµÎñ³¡¾°½øÐÐÑ¡Ôñ¡£
Ö´ÐÐÄ£ÐÍ
Ö´ÐÐÄ£Ðͽâ¾öµÄÊDz»Í¬µÄ½ÚµãÔÚµü´ú¹ý³ÌÖУ¬ÈçºÎе÷µü´ú½ø¶ÈµÄÎÊÌ⡣ͼ¼ÆËãͨ³£ÊÇȫͼ¶àÂÖµü´úµÄ¼ÆË㣬±ÈÈç
PageRank Ëã·¨£¬ÐèÒª³ÖÐøµü´úÖ±ÖÁȫͼËùÓнڵãÊÕÁ²²Å»á½áÊø¡£
ÔÚͼ»®·ÖÍê³Éºó£¬Ã¿¸ö×Óͼ»á±»·ÖÅäµ½¶ÔÓ¦µÄ»úÆ÷½øÐд¦Àí£¬ÓÉÓÚ²»Í¬»úÆ÷¼äÔËËã»·¾³¡¢¼ÆËã¸ºÔØµÄ²»Í¬£¬²»Í¬»úÆ÷µÄÔËËãËÙ¶ÈÊDz»Í¬µÄ£¬µ¼ÖÂͼÉϲ»Í¬½Úµã¼äµÄµü´úËÙ¶ÈÒ²ÊDz»Í¬µÄ¡£ÎªÁËÓ¦¶Ô²»Í¬½Úµã¼äµü´úËٶȵIJ»Í¬£¬ÓÐͬ²½¼ÆËã¡¢Òì²½¼ÆËã¡¢ÒÔ¼°°ëͬ²½¼ÆËãÈýÖÖÖ´ÐÐÄ£ÐÍ¡£
ͬ²½¼ÆËãÊÇȫͼËùÓнڵãÍê³ÉÒ»ÂÖµü´úÖ®ºó£¬²Å¿ªÆôÏÂÒ»ÂÖµü´ú£¬ÒòΪͨ³£Ã¿¸ö½Úµã¶¼»áÒÀÀµÆäËû½ÚµãÔÚÉÏÒ»ÂÖµü´ú²úÉúµÄ½á¹û£¬Òò´Ëͬ²½¼ÆËãµÄ½á¹ûÊÇÕýÈ·µÄ¡£
Òì²½¼ÆËãÔòÊÇÿ¸ö½Úµã²»µÈ´ýÆäËû½ÚµãµÄµü´ú½ø¶È£¬ÔÚ×Ô¼º¼ÆËãÍêÒ»ÂÖµü´úºóÖ±½Ó¿ªÆôÏÂÒ»ÂÖµü´ú£¬ËùÒԾͻᵼÖºܶà½Úµã»¹Ã»ÓÐÍêÈ«Äõ½ÉÏÒ»ÂֵĽá¹û¾Í¿ªÊ¼ÁËÏÂÒ»ÂÖ¼ÆËã¡£
°ëͬ²½¼ÆËãÊÇÁ½ÕßµÄ×ۺϣ¬Æä˼ÏëÊÇÔÊÐíÒ»¶¨µÄ²»Í¬²½£¬µ«µ±¼ÆËã×î¿ìµÄ½ÚµãÓë¼ÆËã×îÂýµÄ½ÚµãÏà²îÒ»¶¨µü´úÂÖÊýʱ£¬×î¿ìµÄ½Úµã»á½øÐеȴý¡£Í¬²½¼ÆËãºÍÒì²½¼ÆËãµÄʾÒâͼÈçÏÂͼ£º

ͬ²½¼ÆËãºÍÒì²½¼ÆËã¸÷ÓÐÓÅÁÓ£¬Æä¶Ô±ÈÈçϱíËùʾ£¬°ëͬ²½ÊÇÁ½ÕßÕÛÖС£¶àÊýͼ¼ÆËãϵͳ¶¼²ÉÓÃÁËͬ²½¼ÆËãÄ£ÐÍ£¬ËäÈ»¼ÆËãЧÂʱÈÒì²½¼ÆËãÈõһЩ£¬µ«Ëü¾ßÓÐÒ×ÓÚÀí½â¡¢¼ÆËãÎȶ¨¡¢½á¹û׼ȷ¡¢¿É½âÊÍÐÔÇ¿µÈ¶à¸öÖØÒªµÄÓŵ㡣

ͨÐÅÄ£ÐÍ
ΪÁËʵÏÖÍØÕ¹ÐÔ£¬Í¼¼ÆËã²ÉÓÃÁ˲»Í¬µÄͨÐÅÄ£ÐÍ£¬´óÖ¿ɷÖΪ·Ö²¼Ê½¹²ÏíÄÚ´æ¡¢Push ÒÔ¼° Pull¡£·Ö²¼Ê½¹²ÏíÄڴ潫Êý¾Ý´æ´¢ÔÚ¹²ÏíÄÚ´æÖУ¬Í¨¹ýÖ±½Ó²Ù×÷¹²ÏíÄÚ´æÍê³ÉÐÅÏ¢½»»¥£»Push
Ä£ÐÍÊÇÑØ×ųö±ß·½ÏòÖ÷¶¯ÍÆËÍÏûÏ¢£»Pull ÔòÊÇÑØ×ÅÈë±ß·½ÏòÖ÷¶¯ÊÕÏûÏ¢¡£ÈýÕßÓÅÁÓ¶Ô±ÈÈçϱí¸ñËùʾ£º

3.2 ¼¼ÊõÑ¡ÐÍ
ÓÉÓÚ×Ö½ÚÌø¶¯Òª´¦ÀíµÄÊÇÊÀ½ç¼¶µÄ³¬´ó¹æÄ£Í¼£¬Í¬Ê±»¹¶Ô¼ÆËãÈÎÎñÔËÐÐʱ³¤ÓÐÒªÇó£¬Òò´ËÖ÷Òª¿¼ÂǸßÐÔÄÜ¡¢¿ÉÍØÕ¹ÐÔÇ¿µÄͼ¼ÆËãϵͳ¡£¹¤Òµ½çʹÓñȽ϶àµÄϵͳÖ÷ÒªÓÐÒÔϼ¸Àࣺ
Pregel & Giraph
Google Ìá³öÁË Pregel À´½â¾öͼËã·¨ÔÚ MapReduce ÉÏÔËÐеÍЧµÄÎÊÌ⣬µ«Ã»ÓпªÔ´¡£Facebook
¸ù¾Ý Pregel µÄ˼··¢Õ¹ÁË¿ªÔ´ÏµÍ³ Giraph£¬µ« Giraph ÓÐÁ½¸öÎÊÌ⣺һÊÇ Giraph
µÄÉçÇø²»ÊǺܻîÔ¾£»¶þÊÇÏÖʵÉú»îÖеÄͼ¶¼ÊÇ·ûºÏÃÝÂÉ·Ö²¼µÄͼ£¬¼´ÓÐһС²¿·ÖµãµÄ±ßÊý·Ç³£¶à£¬ÕâЩµãÔÚ Pregel
µÄ¼ÆËãģʽϺÜÈÝÒ×ÍÏÂýÕû¸ö¼ÆËãÈÎÎñ¡£
GraphX
GraphX ÊÇ»ùÓÚ Spark ¹¹½¨µÄͼ¼ÆËãϵͳ£¬ÈÚºÏÁ˺ܶà PowerGraph µÄ˼Ï룬²¢¶Ô
Spark ÔÚÔËÐÐͼËã·¨¹ý³ÌÖеĶàÓà Shuffle ½øÐÐÁËÓÅ»¯¡£GraphX ¶Ô±ÈÔÉú Spark
ÔÚÐÔÄÜ·½ÃæÓкܴóÓÅÊÆ£¬µ« GraphX ·Ç³£·ÑÄڴ棬Shuffle ЧÂÊÒ²²»ÊǺܸߣ¬µ¼ÖÂÔËÐÐʱ¼äÒ²±È½Ï³¤¡£
Gemini
Gemini ÊÇ 16 Äê·¢±íÔÙÔÚ OSDI µÄһƪͼ¼ÆËãϵͳÂÛÎÄ£¬½áºÏÁ˶àÖÖͼ¼ÆËãϵͳµÄÓÅÊÆ£¬²¢ÇÒÓпªÔ´ÊµÏÖ£¬×÷Ϊ×î¿ìµÄͼ¼ÆËãÒýÇæÖ®Ò»£¬µÃµ½ÁËÒµ½çµÄÆÕ±éÈϿɡ£
ÕýÈç¡¶Scalability! But at what COST? ¡·Ò»ÎÄÖ¸³ö£¬¶àÊýµÄͼ¼ÆËãϵͳΪÁËÍØÕ¹ÐÔ£¬ºöÊÓÁ˵¥»úµÄÐÔÄÜ£¬¼ÓÖ®·Ö²¼Ê½´øÀ´µÄ¾Þ´óͨÐÅ¿ªÏú£¬µ¼Ö¶à»ú»·¾³ÏµļÆËãÐÔÄÜÓÐʱÉõÖÁ·´¶ø²»Èçµ¥»ú»·¾³¡£Õë¶ÔÕâЩÎÊÌ⣬Gemini
µÄ×öÁËÕë¶ÔÐÔÓÅ»¯Éè¼Æ£¬¼òµ¥×ܽáΪ£º
ͼ´æ´¢¸ñʽÓÅ»¯Äڴ濪Ïú£º²ÉÓà CSC ºÍ CSR µÄ·½Ê½´æ´¢Í¼£¬²¢¶Ô CSC/CSR ½øÒ»²½½¨Á¢Ë÷Òý½µµÍÄÚ´æÕ¼Óã»
Hierarchical Chunk-Based Partitioning£ºÍ¨¹ýÔÚ Node¡¢Numa¡¢Socket
¶à¸öά¶È×öÇøÓò¸ÐÖªµÄͼÇз֣¬¼õÉÙͨÐÅ¿ªÏú£»
×ÔÊÊÓ¦µÄ Push / Pull ¼ÆË㣺²ÉÓÃÁË˫ģʽͨÐŲßÂÔ£¬Äܸù¾Ýµ±Ç°»îÔ¾½ÚµãµÄÊýÁ¿¶¯Ì¬µØÇл»µ½³íÃÜ»òÏ¡Êèģʽ¡£
¼æ¹Ëµ¥»úÐÔÄܺÍÀ©Õ¹ÐÔ£¬Ê¹µÃ Gemini ´¦ÓÚͼ¼ÆËãÐÔÄÜ×îÇ°ÑØ£¬Í¬Ê±£¬Gemini ÍŶÓÒ²³ÉÁ¢ÁËÉÌÒµ¹«Ë¾×¨×¢Í¼Êý¾ÝµÄ´¦Àí¡£
3.3 »ùÓÚ¿ªÔ´µÄʵ¼ù
Tencent Plato ÊÇ»ùÓÚ Gemini ˼ÏëµÄ¿ªÔ´Í¼¼ÆËãϵͳ£¬²ÉÓÃÁË Gemini µÄºËÐÄÉè¼ÆË¼Â·£¬µ«Ïà±È
Gemini µÄ¿ªÔ´°æ±¾Óиü¼ÓÍêÉÆµÄ¹¤³ÌʵÏÖ£¬ÎÒÃÇ»ùÓÚ´Ë£¬×öÁË´óÁ¿Öع¹ºÍ¶þ´Î¿ª·¢£¬½«ÆäÓ¦Óõ½Éú³É»·¾³ÖУ¬ÕâÀï·ÖÏíÏÂÎÒÃǵÄʵ¼ù¡£
¸ü´óÊý¾Ý¹æÄ£µÄ̽Ë÷
¿ªÔ´ÊµÏÖÖÐÓиö·Ç³£¹Ø¼üµÄ¼ÙÉ裺һÕÅͼÖеĵãµÄÊýÁ¿²»Äܳ¬¹ý 40 ÒÚ¸ö£»µ«×Ö½ÚÌø¶¯²¿·ÖÒµÎñ³¡¾°µÄÊý¾Ý¹æÄ£Ô¶³¬³öÁËÕâ¸öÊý¶î¡£ÎªÁËÖ§³ÖǧÒÚÍòÒÚµãµÄ¹æÄ££¬ÎÒÃǽ«²úÉúÄÚ´æÆ¿¾±µÄµ¥»ú´¦ÀíÄ£¿é£¬Öع¹Îª·Ö²¼Ê½ÊµÏÖ¡£
µã ID µÄ±àÂë
Gemini µÄÒ»¸öÖØÒª´´Ð¾ÍÊÇÌá³öÁË»ùÓÚ Chunk µÄͼ·ÖÇø·½·¨¡£ÕâÖÖͼ·ÖÇø·½·¨ÐèÒª½«µã id
´Ó 0 ¿ªÊ¼Á¬ÐøµÝÔö±àÂ룬µ«ÊäÈëµÄͼÊý¾ÝÖУ¬µã id ÊÇËæ»úÉú³ÉµÄ£¬Òò´ËÐèÒª¶Ôµã id ½øÐÐÒ»´ÎÓ³É䣬±£Ö¤ÆäÁ¬ÐøµÝÔö¡£¾ßÌåʵÏÖ·½·¨ÊÇ£¬ÔÚ¼ÆËãÈÎÎñ¿ªÊ¼Ö®Ç°½«ÔʼµÄÒµÎñ
id ת»»Îª´ÓÁ㿪ʼµÄµÝÔö id£¬¼ÆËã½áÊøºóÔÙ½« id Ó³Éä»ØÈ¥£¬ÈçÏÂͼËùʾ£º

ÔÚ¿ªÔ´ÊµÏÖÖУ¬ÊǼÙÉèͼÖеãµÄÊýÁ¿²»¿É³¬¹ý 40 ÒÚ£¬40 ÒÚµÄ id Êý¾ÝÊÇ¿ÉÒÔ´æ´¢ÔÚµ¥»úÄÚ´æÖУ¬Òò´Ë²ÉÓñȽϼòµ¥µÄʵÏÖ·½Ê½£º·Ö²¼Ê½¼ÆË㼯ȺÖеÄÿ̨»úÆ÷ÈßÓà´æ´¢ÁËËùÓеã
id µÄÓ³Éä¹ØÏµ¡£È»¶ø£¬µ±µãµÄÊýÁ¿´Ó 40 ÒÚµ½Ç§ÒÚ¼¶±ð£¬Ã¿Ì¨»úÆ÷½ö id Ó³Éä±í¾ÍÐèÒªÊý°Ù GB
µÄÄڴ棬µ¥»ú´æ´¢·½°¸¾Í±äµÃ²»ÔÙ¿ÉÐУ¬Òò´ËÐèÒª½«Ó³Éä±í·Ö³É shard ·Ö²¼Ê½µØ´æ´¢£¬¾ßÌåʵÏÖ·½Ê½ÈçÏ£º
ÎÒÃÇͨ¹ý¹þÏ£½«ÔʼҵÎñµã id ´òÉ¢ÔÚ²»Í¬µÄ»úÆ÷£¬²¢ÐеطÖÅäÈ«¾Ö´Ó 0 ¿ªÊ¼Á¬ÐøµÝÔöµÄ id¡£Éú³É
id Ó³Éä¹ØÏµºó£¬Ã¿Ì¨»úÆ÷¶¼»á´æÓÐ id Ó³Éä±íµÄÒ»²¿·Ö¡£ËæºóÔÙ½«±ßÊý¾Ý·Ö±ð°´ÆðµãºÍÖÕµã¹þÏ££¬·¢Ë͵½¶ÔÓ¦µÄ»úÆ÷½øÐбàÂ룬×îÖյõ½µÄÊý¾Ý¼´Îª¿ÉÓÃÓÚ¼ÆËãµÄÊý¾Ý¡£µ±¼ÆËãÔËÐнáÊøºó£¬ÐèÒªÊý¾ÝÐèÒªÓ³Éä»ØÒµÎñ
id£¬Æä¹ý³ÌºÍÉÏÊöÒ²ÊÇÀàËÆµÄ¡£
ÉÏÃæÃèÊöµÄ½ö½öÊÇͼ±àÂ벿·Ö£¬40 ÒÚµãµÄÖµÓòÏÞÖÆ»¹¹ã·º´æÔÚÓÚ¹¹Í¼ºÍʵ¼Ê¼ÆËã¹ý³ÌÖУ¬ÎÒÃǶ¼¶Ô´Ë×öÁËÖØ¹¹¡£ÁíÍâÔÚÎÒÃǵĹæÄ£Ï£¬Ò²Åöµ½ÁËһЩÈÎÎñ¸ºÔز»¾ù£¬²»¹»Îȶ¨£¬¼ÆËãЧÂʲ»¸ßµÈÎÊÌ⣬ÎÒÃǶԴ˶¼×öÁ˲¿·ÖÓÅ»¯ºÍÖØ¹¹¡£
ͨ¹ý¶Ô¿ªÔ´ÊµÏֵĸÄÔ죬×Ö½ÚÌø¶¯µÄͼ¼ÆËãϵͳÒѾÔÚÏßÉÏÖ§³ÅÁ˶àÌõ²úÆ·ÏߵļÆËãÈÎÎñ£¬×î´ó¹æÄ£´ïµ½ÊýÍòÒڱߡ¢ÊýǧÒÚµãµÄÊÀ½ç¼¶³¬´óͼ£¬ÕâÊÇÒµÄÚº±¼ûµÄ¡£Í¬Ê±£¬Ãæ¶Ô²»¶ÏÔö³¤µÄÒµÎñ£¬²¢ÇÒÎÒÃÇ»¹ÔÚ³ÖÐøÀ©´óϵͳµÄ±ß½ç£¬À´Ó¦¶Ô¸ü´ó¹æÄ£µÄÌôÕ½¡£
×Ô¶¨ÒåË㷨ʵÏÖ
ÔÚ³£¼ûͼ¼ÆËãËã·¨Ö®Í⣬×Ö½ÚÌø¶¯¶àÔªµÄÒµÎñÖУ¬ÓдóÁ¿µÄÆäËûͼËã·¨ÐèÇóÒÔ¼°ÏÖÓÐËã·¨µÄ¸ÄÔìÐèÇ󣬱ÈÈçÐèҪʵÏÖ¸üÊʺ϶þ·ÖͼµÄ
LPA Ëã·¨£¬ÐèÒª¸ÄÔì PageRank Ë㷨ʹ֮¸üÈÝÒ×ÊÕÁ²¡£
ÓÉÓÚµ±Ç°Í¼¼ÆËãϵͳ±©Â¶µÄ API »¹Ã»Óзdz£ºÃµÄ·â×°£¬Ê¹µÃ±àдËã·¨µÄÓû§»áÖ±½Ó¸ÐÖªµ½µ×²ãµÄÄÚ²¿»úÖÆ£¬±ÈÈ粻ͬµÄͨÐÅģʽ¡¢Í¼±íʾ·½Ê½µÈ£¬Õâ¹ÌÈ»·½±ãÁË×öͼ¼ÆËãË㷨ʵÏֵĵ÷ÓÅ£¬µ«Ò²µ¼ÖÂÒµÎñͬѧÓÐÒ»¶¨³É±¾£»ÁíÍ⣬ÒòÎªÉæ¼°³¬´ó¹æÄ£Êý¾ÝµÄ¸ßÐÔÄܼÆË㣬һ¸öϸ½Ú£¨±ÈÈç
hotpath ÉϵÄÒ»¸öÐ麯Êýµ÷Óã¬Ò»´ÎÏß³Ìͬ²½£©¿ÉÄܾͶÔÐÔÄÜÓÐÖÁ¹ØÖØÒªµÄÓ°Ï죬ÐèÒªÒµÎñͬѧ¶Ô¼ÆËã»úÌåϵ½á¹¹ÓÐÒ»¶¨Á˽⡣»ùÓÚÉÏÊöÁ½¸öÔÒò£¬Ä¿Ç°Ëã·¨ÊÇͼ¼ÆËãÒýÇæÍ¬Ñ§ºÍͼ¼ÆËãÓû§Ò»Æð¿ª·¢£¬µ«³¤ÆÚÀ´¿´£¬ÎÒÃÇ»á·â×°³£ÓüÆËãËã×Ó²¢±©Â¶
Python Binding £¬»òÕßÒýÈë DSL À´½µµÍÒµÎñµÄѧϰ³É±¾¡£
3.4 δÀ´Õ¹Íû
Ãæ¶Ô×Ö½ÚÌø¶¯µÄ³¬´ó¹æÄ£Í¼´¦Àí³¡¾°£¬ÎÒÃÇÔÚ°ëÄêÄÚ¿ìËÙ¿ªÆôÁËͼ¼ÆËã·½Ïò£¬Ö§³ÖÁËËÑË÷¡¢·ç¿ØµÈ¶à¸öÒµÎñµÄ´ó¹æÄ£Í¼¼ÆËãÐèÇó£¬È¡µÃÁ˲»´íµÄ½øÕ¹£¬µ«»¹ÓÐÖÚ¶àÐèÒªÎÒÃÇ̽Ë÷µÄÎÊÌ⣺
´ÓÈ«ÄÚ´æ¼ÆËãµ½»ìºÏ´æ´¢¼ÆË㣺ΪÁËÖ§³Ö¸ü´ó¹æÄ£µÄÊý¾ÝÁ¿£¬Ìṩ¸ü¼ÓµÍ³É±¾µÄ¼ÆËãÄÜÁ¦£¬ÎÒÃǽ«Ì½Ë÷ÐÂÐÍ´æ´¢Ó²¼þ£¬°üÀ¨
AEP / NVMe µÈÄÚ´æ»òÍâ´æÉ豸£¬À©´óϵͳÄÜÁ¦£»
¶¯Ì¬Í¼¼ÆË㣺ĿǰµÄϵͳֻ֧³Ö¾²Ì¬Í¼¼ÆË㣬¼´¶ÔÍêÕûͼµÄÈ«Á¿Êý¾Ý½øÐмÆË㡣ʵ¼ÊÒµÎñÖеÄͼÿʱÿ¿Ì¶¼ÊÇÔڱ仯µÄ£¬Òò´ËʹÓÃÏÖÓÐϵͳ±ØÐëÔÚÿ´Î¼ÆËã¶¼ÌṩÕûÕÅͼ¡£¶ø¶¯Ì¬Í¼¼ÆËãÄܹ»±È½ÏºÃµØ´¦ÀíÔöÁ¿µÄÊý¾Ý£¬ÎÞÐè¶ÔÒѾ´¦Àí¹ýµÄÊý¾Ý½øÐÐÖØ¸´¼ÆË㣬Òò´ËÎÒÃǽ«ÔÚһЩ³¡¾°Ì½Ë÷¶¯Ì¬Í¼¼ÆË㣻
Òì¹¹¼ÆË㣺ͼ¼ÆËãϵͳÊôÓÚ¼ÆËãÃܼ¯ÐÍϵͳ£¬ÔÚ²¿·Ö³¡¾°¶Ô¼ÆËãÐÔÄÜÓм«¸ßµÄÒªÇó¡£Òò´ËÎÒÃǻ᳢ÊÔÒì¹¹¼ÆË㣬°üÀ¨Ê¹ÓÃ
GPU / FPGA µÈÓ²¼þ¶Ô¼ÆËã½øÐмÓËÙ£¬ÒÔ×·Çó׿ԽµÄ¼ÆËãÐÔÄÜ£»
ͼ¼ÆËãÓïÑÔ£ºÒµÎñÖ±½Ó½Ó´¥µ×²ã¼ÆËãÒýÇæÓкܶà±×¶Ë£¬±ÈÈçÒµÎñÂß¼Óë¼ÆËãÒýÇæÇ¿ñîºÏ£¬ÎÞ·¨¸üÁé»îµØ¶Ô²»Í¬Ëã·¨½øÐÐÐÔÄÜÓÅ»¯¡£¶øÍ¨¹ýͼ¼ÆËãÓïÑÔ¶ÔËã·¨½øÐÐÃèÊö£¬ÔÙ¶ÔÆä±àÒëÉú³É¼ÆËãÒýÇæµÄÖ´ÐдúÂ룬¿ÉÒÔ½«ÒµÎñÂß¼Óë¼ÆËãÒýÇæ½âñÄܸüºÃµØ¶Ô²»Í¬Ëã·¨½øÐÐ×Ô¶¯µØµ÷ÓÅ£¬½«ÐÔÄÜ·¢»Óµ½¼«Ö¡£
4. ×ܽá
Ëæ×Å×Ö½ÚÌø¶¯ÒµÎñÁ¿¼¶µÄ·ÉËÙÔö³¤ºÍÒµÎñÐèÇóµÄ²»¶Ï·á¸»£¬ÎÒÃÇÔÚ¶Ìʱ¼äÄÚ¹¹½¨ÁËͼ´æ´¢ÏµÍ³ºÍͼ¼ÆËãϵͳ£¬ÔÚʵ¼ÊÉú²úϵͳÖнâ¾öÁË´óÁ¿µÄÎÊÌ⣬µ«Í¬Ê±ÈÔÃæÁÙמ޴óµÄ¼¼ÊõÌôÕ½£¬ÎÒÃǽ«³ÖÐøÑݽø£¬´òÔìÒµ½ç¶¥¼âµÄһջʽͼ½â¾ö·½°¸¡£Î´À´ÒÑÀ´£¬¿Õ¼ä¹ãÀ«£¬Ï£Íû¸ü¶àÓÐÐËȤµÄͬѧ¼ÓÈë½øÀ´£¬ÓÃÓÐȤµÄ·Ö²¼Ê½¼¼ÊõÀ´Ó°Ï켸ÒÚÈ˵Ļ¥ÁªÍøÉú»î¡£
|