±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜ
Nebula Graph µÄÊý¾ÝÄ£ÐͺÍϵͳ¼Ü¹¹Éè¼Æ ¡£
±¾ÎÄÀ´×ÔÂë¶´£¬ÓÉ»ðÁú¹ûÈí¼þLinda±à¼¡¢ÍƼö¡£ |
|
Nebula Graph ÊÇĿǰΨһÄܹ»´æ´¢ÍòÒÚ¸ö´øÊôÐԵĽڵãºÍ±ßµÄÔÚÏßͼÊý¾Ý¿â¡£Nebula
Graph ²»½öÄܹ»Ôڸ߲¢·¢³¡¾°ÏÂÂú×ãºÁÃë¼¶µÄµÍʱÑÓ²éѯҪÇ󣬶øÇÒÄܹ»Ìṩ¼«¸ßµÄ·þÎñ¿ÉÓÃÐÔºÍÊý¾Ý°²È«ÐÔ¡£NebulaGraph
Ò²ÊÇÒ»¸ö¿ªÔ´µÄ²úÆ·£¬Äã¿ÉÒÔÔÚ GitHub Éϲ鿴¡¢·Ö·¢ºÍ¹±Ï×´úÂë¡£
±¾ÆªÖ÷Òª½éÉÜ Nebula Graph µÄÊý¾ÝÄ£ÐͺÍϵͳ¼Ü¹¹Éè¼Æ¡£
ÓÐÏòÊôÐÔͼ DirectedPropertyGraph
Nebula Graph ²ÉÓÃÒ×Àí½âµÄÓÐÏòÊôÐÔͼÀ´½¨Ä££¬Ò²¾ÍÊÇ˵£¬ÔÚÂß¼ÉÏ£¬Í¼ÓÉÁ½ÖÖÍ¼ÔªËØ¹¹³É£º¶¥µãºÍ±ß¡£

¶¥µã Vertex
ÔÚ Nebula Graph Öж¥µãÓɱêÇ© tag ºÍ¶ÔÓ¦ tag µÄÊôÐÔ×é¹¹³É£¬ tag ´ú±í¶¥µãµÄÀàÐÍ£¬ÊôÐÔ×é´ú±í
tag ÓµÓеÄÒ»ÖÖ»ò¶àÖÖÊôÐÔ¡£Ò»¸ö¶¥µã±ØÐëÖÁÉÙÓÐÒ»ÖÖÀàÐÍ£¬¼´±êÇ©£¬Ò²¿ÉÒÔÓжàÖÖÀàÐÍ¡£Ã¿ÖÖ±êÇ©ÓÐÒ»×éÏà¶ÔÓ¦µÄÊôÐÔ£¬ÎÒÃdzÆÖ®Îª
schema ¡£
ÈçÉÏͼËùʾ£¬ÓÐÁ½ÖÖ tag ¶¥µã£ºplayer ºÍ team¡£player µÄ schema ÓÐÈýÖÖÊôÐÔ
ID £¨vid£©£¬Name £¨sting£©ºÍ Age £¨int£©£»team µÄ schema ÓÐÁ½ÖÖÊôÐÔ
ID £¨vid£©ºÍ Name £¨string£©¡£
ºÍ Mysql Ò»Ñù£¬Nebula Graph ÊÇÒ»ÖÖÇ¿ schema µÄÊý¾Ý¿â£¬ÊôÐÔµÄÃû³ÆºÍÊý¾ÝÀàÐͶ¼ÊÇÔÚÊý¾ÝдÈëǰȷ¶¨µÄ¡£
±ß Edge
ÔÚ Nebula Graph ÖбßÓÉÀàÐͺͱßÊôÐÔ¹¹³É£¬¶ø Nebula Graph Öб߾ùÊÇÓÐÏò±ß£¬ÓÐÏò±ß±íÃ÷Ò»¸ö¶¥µã£¨
Æðµã src £©Ö¸ÏòÁíÒ»¸ö¶¥µã£¨ ÖÕµã dst £©µÄ¹ØÁª¹ØÏµ¡£´ËÍ⣬ÔÚ Nebula Graph ÖÐÎÒÃǽ«±ßÀàÐͳÆÎª
edgetype £¬Ã¿Ò»Ìõ±ßÖ»ÓÐÒ»ÖÖ edgetype £¬Ã¿ÖÖ edgetype ÏàÓ¦¶¨ÒåÁËÕâÖÖ±ßÉÏÊôÐÔµÄ
schema ¡£
»Øµ½ÉÏÃæµÄͼÀý£¬Í¼ÖÐÓÐÁ½ÖÖÀàÐ͵ıߣ¬Ò»ÖÖΪ player Ö¸Ïò player µÄ like ¹ØÏµ£¬ÊôÐÔΪ
likeness (double)£»ÁíÒ»ÖÖΪ player Ö¸Ïò team µÄ serve ¹ØÏµ£¬Á½¸öÊôÐÔ·Ö±ðΪ
start_year (int) ºÍ end_year (int)¡£
×¢£ºÐèҪ˵Ã÷µÄÊÇ£¬Æðµã1 ºÍÖÕµã2 Ö®¼ä£¬¿ÉÒÔͬʱ´æÔÚ¶àÌõÏàͬ»òÕß²»Í¬ÀàÐ͵ıߡ£
ͼ·Ö¸î GraphPartition
ÓÉÓÚ³¬´ó¹æÄ£¹ØÏµÍøÂçµÄ½ÚµãÊýÁ¿¸ß´ï°ÙÒÚµ½Ç§ÒÚ£¬¶ø±ßµÄÊýÁ¿¸ü»á¸ß´ïÍòÒÚ£¬¼´Ê¹½ö´æ´¢µãºÍ±ßÁ½ÕßÒ²Ô¶´óÓÚÒ»°ã·þÎñÆ÷µÄÈÝÁ¿¡£Òò´ËÐèÒªÓз½·¨½«Í¼ÔªËØÇи²¢´æ´¢ÔÚ²»Í¬Âß¼·ÖƬ
partition ÉÏ¡£Nebula Graph ²ÉÓñ߷ָîµÄ·½Ê½£¬Ä¬È쵀ᅮ¬²ßÂÔΪ¹þϣɢÁУ¬partition
ÊýÁ¿Îª¾²Ì¬ÉèÖò¢²»¿É¸ü¸Ä¡£

Êý¾ÝÄ£ÐÍ DataModel
ÔÚ Nebula Graph ÖУ¬Ã¿¸ö¶¥µã±»½¨Ä£ÎªÒ»¸ö key-value £¬¸ù¾ÝÆä vertexID£¨»ò¼ò³Æ
vid£©¹þϣɢÁк󣬴洢µ½¶ÔÓ¦µÄ partition ÉÏ¡£

Ò»ÌõÂß¼ÒâÒåÉϵıߣ¬ÔÚ Nebula Graph Öн«»á±»½¨Ä£ÎªÁ½¸ö¶ÀÁ¢µÄ key-value £¬·Ö±ð³ÆÎª
out-key ºÍ in-key ¡£out-key ÓëÕâÌõ±ßËù¶ÔÓ¦µÄÆðµã´æ´¢ÔÚͬһ¸ö partition
ÉÏ£¬in-key ÓëÕâÌõ±ßËù¶ÔÓ¦µÄÖÕµã´æ´¢ÔÚͬһ¸ö partition ÉÏ¡£

¹ØÓÚÊý¾ÝÄ£Ð͵ÄÏêϸÉè¼Æ»áÔÚºóÐøµÄϵÁÐÎÄÕÂÖнéÉÜ¡£
ϵͳ¼Ü¹¹Architecture
Nebula Graph °üÀ¨ËĸöÖ÷ÒªµÄ¹¦ÄÜÄ£¿é£¬·Ö±ðÊÇ´æ´¢²ã¡¢ÔªÊý¾Ý·þÎñ¡¢¼ÆËã²ãºÍ¿Í»§¶Ë¡£

´æ´¢²ã Storage
ÔÚ Nebula Graph Öд洢²ã¶ÔÓ¦½ø³ÌÊÇ nebula-storaged £¬ÆäºËÐÄΪ»ùÓÚ Raft£¨ÓÃÀ´¹ÜÀíÈÕÖ¾¸´ÖƵÄÒ»ÖÂÐÔËã·¨£©
ÐÒéµÄ·Ö²¼Ê½ Key-valueStorage ¡£
Ŀǰ֧³ÖµÄÖ÷Òª´æ´¢ÒýÇæÎª¡¸Rocksdb¡¹ºÍ¡¸HBase¡¹¡£
Raft ÐÒéͨ¹ý leader/follower µÄ·½Ê½£¬À´±£³ÖÊý¾ÝÖ®¼äµÄÒ»ÖÂÐÔ¡£Nebula
Storage Ö÷ÒªÔö¼ÓÁËÒÔϹ¦ÄܺÍÓÅ»¯£º
Parallel Raft£ºÔÊÐí¶ą̀»úÆ÷ÉϵÄÏàͬ partiton-id ×é³ÉÒ»¸ö Raft group
¡£Í¨¹ý¶à×é Raft group ʵÏÖ²¢·¢²Ù×÷¡£
Write Path & batch£ºRaft ÐÒéµÄ¶à»úÆ÷¼äͬ²½ÒÀÀµÓÚÈÕÖ¾ id ˳ÐòÐÔ£¬ÕâÑùµÄÍÌÍÂÁ¿
throughput ½ÏµÍ¡£Í¨¹ýÅúÁ¿ºÍÂÒÐòÌá½»µÄ·½Ê½¿ÉÒÔʵÏÖ¸ü¸ßµÄÍÌÍÂÁ¿¡£
Learner£º»ùÓÚÒì²½¸´ÖÆµÄ learner¡£µ±¼¯ÈºÖÐÔö¼ÓеĻúÆ÷ʱ£¬¿ÉÒÔ½«ÆäÏȱê¼ÇΪ learner£¬²¢Òì²½´Ó
leader/follower ÀÈ¡Êý¾Ý¡£µ±¸Ã learner ×·ÉÏ leader ºó£¬ÔÙ±ê¼ÇΪ follower£¬²ÎÓë
Raft ÐÒé¡£
Load-balance£º¶ÔÓÚ²¿·Ö·ÃÎÊѹÁ¦½Ï´óµÄ»úÆ÷£¬½«ÆäËù·þÎñµÄ partition Ç¨ÒÆµ½½ÏÀäµÄ»úÆ÷ÉÏ£¬ÒÔʵÏÖ¸üºÃµÄ¸ºÔؾùºâ¡£

ÔªÊý¾Ý·þÎñ²ã Metaservice
Metaservice ¶ÔÓ¦µÄ½ø³ÌÊÇ nebula-metad £¬ÆäÖ÷ÒªµÄ¹¦ÄÜÓУº
Óû§¹ÜÀí£ºNebula Graph µÄÓû§Ìåϵ°üÀ¨ Goduser £¬ Admin £¬ User
£¬ Guest ËÄÖÖ¡£Ã¿ÖÖÓû§µÄ²Ù×÷ȨÏÞ²»Ò»¡£
¼¯ÈºÅäÖùÜÀí£ºÖ§³ÖÉÏÏß¡¢ÏÂÏßеķþÎñÆ÷¡£
ͼ¿Õ¼ä¹ÜÀí£ºÔö³ÖÔö¼Ó¡¢É¾³ýͼ¿Õ¼ä£¬ÐÞ¸Äͼ¿Õ¼äÅäÖã¨Raft¸±±¾Êý£©
Schema ¹ÜÀí£ºNebula Graph Ϊǿ schema Éè¼Æ¡£
ͨ¹ý Metaservice ¼Ç¼ Tag ºÍ Edge µÄÊôÐԵĸ÷×ֶεÄÀàÐÍ¡£Ö§³ÖµÄÀàÐÍÓУºÕûÐÍ
int, Ë«¾«¶ÈÀàÐÍ double, ʱ¼äÊý¾ÝÀàÐÍ timestamp, ÁбíÀàÐÍ listµÈ£»
¶à°æ±¾¹ÜÀí£¬Ö§³ÖÔö¼Ó¡¢Ð޸ĺÍɾ³ý schema£¬²¢¼Ç¼Æä°æ±¾ºÅ
TTL ¹ÜÀí£¬Í¨¹ý±êʶµ½ÆÚ»ØÊÕ time-to-live ×ֶΣ¬Ö§³ÖÊý¾ÝµÄ×Ô¶¯É¾³ýºÍ¿Õ¼ä»ØÊÕ
MetaService ²ãΪÓÐ״̬µÄ·þÎñ£¬Æä״̬³Ö¾Ã»¯·½·¨Óë Storage ²ãÒ»Ñùͨ¹ý KVStore
·½Ê½´æ´¢¡£

¼ÆËã²ã Query Engine & Query Language(nGQL)
¼ÆËã²ã¶ÔÓ¦µÄ½ø³ÌÊÇ nebula-graphd £¬ËüÓÉÍêÈ«¶ÔµÈÎÞ״̬ÎÞ¹ØÁªµÄ¼ÆËã½Úµã×é³É£¬¼ÆËã½ÚµãÖ®¼äÏ໥ÎÞͨÐÅ¡£
Query Engine ²ãµÄÖ÷Òª¹¦ÄÜ£¬ÊǽâÎö¿Í»§¶Ë·¢ËÍ nGQL Îı¾£¬Í¨¹ý´Ê·¨½âÎö Lexer
ºÍÓï·¨½âÎö Parser Éú³ÉÖ´Ðмƻ®£¬²¢Í¨¹ýÓÅ»¯ºó½«Ö´Ðмƻ®½»ÓÉÖ´ÐÐÒýÇæ£¬Ö´ÐÐÒýÇæÍ¨¹ý MetaService
»ñȡͼµãºÍ±ßµÄ schema£¬²¢Í¨¹ý´æ´¢ÒýÇæ²ã»ñÈ¡µãºÍ±ßµÄÊý¾Ý¡£
Query Engine ²ãµÄÖ÷ÒªÓÅ»¯ÓУº
Òì²½ºÍ²¢·¢Ö´ÐУºÓÉÓÚ IO ºÍÍøÂç¾ùΪ³¤Ê±ÑÓ²Ù×÷£¬Ðè²ÉÓÃÒì²½¼°²¢·¢²Ù×÷¡£´ËÍ⣬Ϊ±ÜÃâµ¥¸ö³¤ query
Ó°ÏìºóÐø query£¬Query Engine Ϊÿ¸ö query ÉèÖõ¥¶ÀµÄ×ÊÔ´³ØÒÔ±£Ö¤·þÎñÖÊÁ¿
QoS¡£
¼ÆËãϳÁ£ºÎª±ÜÃâ´æ´¢²ã½«¹ý¶àÊý¾Ý»Ø´«µ½¼ÆËã²ãÕ¼Óñ¦¹óµÄ´ø¿í£¬Ìõ¼þ¹ýÂË where µÈËã×Ó»áËæ²éѯÌõ¼þһͬÏ·¢µ½´æ´¢²ã½Úµã¡£
Ö´Ðмƻ®ÓÅ»¯£ºËäÈ»ÔÚ¹ØÏµÊý¾Ý¿â SQL ÖÐÖ´Ðмƻ®ÓÅ»¯ÒѾ¾ÀúÁ˳¤Ê±¼äµÄ·¢Õ¹£¬µ«Òµ½ç¶Ôͼ²éѯÓïÑÔµÄÓÅ»¯Ñо¿½ÏÉÙ¡£Nebula
Graph ¶Ôͼ²éѯµÄÖ´Ðмƻ®ÓÅ»¯½øÐÐÁËÒ»¶¨µÄ̽Ë÷£¬°üÀ¨Ö´Ðмƻ®»º´æºÍÉÏÏÂÎÄÎÞ¹ØÓï¾ä²¢·¢Ö´ÐС£

¿Í»§¶Ë API & Console
Nebula Graph Ìṩ C++¡¢Java¡¢Golang ÈýÖÖÓïÑԵĿͻ§¶Ë£¬Óë·þÎñÆ÷Ö®¼äµÄͨÐÅ·½Ê½Îª
RPC£¬²ÉÓõÄͨÐÅÐÒéΪ Facebook-Thrift¡£Óû§Ò²¿Éͨ¹ý Linux ÉÏ console
ʵÏÖ¶Ô Nebula Graph ²Ù×÷¡£Web ·ÃÎÊ·½Ê½Ä¿Ç°ÔÚ¿ª·¢¹ý³ÌÖС£
|