AI解码:开源图数据库Nebula Graph解析

打印 上一主题 下一主题

主题 837|帖子 837|积分 2526

随着知识图谱、GraphRAG 等 AI 技术的发展,图数据库也受到日益增多的关注。

本日,我们来“揭秘”一个开源图数据库项目 Nebula Graph,它的 GitHub 地点是: 
https://github.com/vesoft-inc/nebula

在解析项目中,我们通常需要借助 AI 软件来解析,这次我用到的这款软件是 Eagle DevAgent(简称Eagle)





使用网址:https://eagle.capitalren.com/


Nebula Graph项目介绍
Nebula Graph 是一款开源的、分布式的、易扩展的原生图数据库,能够承载包罗数千亿个点和数万亿条边的超大规模数据集,并且提供毫秒级查询。
 




关于图数据库
图数据库是专门存储巨大的图形网络并从中检索信息的数据库。它可以将图中的数据高效存储为点(Vertex)和边(Edge),还可以将属性(Property)附加到点和边上。

图数据库适合存储大多数从实际抽象出的数据类型。世界上险些全部范畴的事物都有内在联系,像关系型数据库如许的建模体系会提取实体之间的关系,并将关系单独存储到表和列中,而实体的类型和属性存储在其他列乃至其他表中,这使得数据管理费时费力。

Nebula Graph 作为一个典型的图数据库,可以将丰富的关系通过边及其类型和属性天然地出现。 
 


用 Eagle 解读 Nebula Graph
我们把 Nebula Graph 这个开源项目的 GitHub 网址发送给 Eagle。 Eagle 很清晰的把项目概况、重要特性、重要目录和文件、使用的模式或框架等开端的分析结果列了出来。

I 对项目团体解读
Q:解读一下这个项目:https://github.com/vesoft-inc/nebula


 


Eagle 对整个项目做了概述

I 对技术架构解读
Q:此项目的架构是什么?


 


联合图示,及笔墨说明把Nebula Graph的详细架构和交互流程做了摆列

I 对某技术点解读
通过上面的架构图,我们知道 Nebula Graph 在数据及元数据存储中都用到了Raft 算法。
Raft 算法是分布式体系中包管数据存储可靠性和同等性的重要算法,但差异的体系对 Raft 的具体实现迥异,这也是导致体系可用性和性能差异的关键所在,Nebula Graph 是怎样实现 Raft 算法的呢?我们把这个题目抛给了 Eagle,下面就来看看TA的精彩回答吧:
Q:解释一下:https://github.com/vesoft-inc/nebula的Raft算法实现


在代码库中定位到关键技术点的实现

Eagle还会列出关键实现代码,例如领导者推举:
  1. folly::Future<bool> RaftPart::leaderElection(bool isPreVote) {
  2.   using namespace folly;
  3.   bool expected = false;
  4.   if (!inElection_.compare_exchange_strong(expected, true)) {
  5.     return false;
  6.   }
  7.   cpp2::AskForVoteRequest voteReq;
  8.   decltype(hosts_) hosts;
  9.   if (!prepareElectionRequest(voteReq, hosts, isPreVote)) {
  10.     std::lock_guard<std::mutex> g(raftLock_);
  11.     role_ = Role::FOLLOWER;
  12.     leader_ = HostAddr("", 0);
  13.     inElection_ = false;
  14.     return false;
  15.   }
  16.   auto proposedTerm = voteReq.get_term();
  17.   auto resps = ElectionResponses();
  18.   stats::StatsManager::addValue(kNumStartElect);
  19.   if (hosts.empty()) {
  20.     auto ret = handleElectionResponses(resps, hosts, proposedTerm, isPreVote);
  21.     inElection_ = false;
  22.     return ret;
  23.   } else {
  24.     folly::Promise<bool> promise;
  25.     auto future = promise.getFuture();
  26.     auto eb = ioThreadPool_->getEventBase();
  27.     collectNSucceeded(
  28.         gen::from(hosts) |
  29.             gen::map([eb, self = shared_from_this(), voteReq](std::shared_ptr<Host> host) {
  30.               return via(eb, [voteReq, host, eb]() -> Future<cpp2::AskForVoteResponse> {
  31.                 return host->askForVote(voteReq, eb);
  32.               });
  33.             }) |
  34.             gen::as<std::vector>(),
  35.         quorum_,
  36.         [hosts](size_t idx, cpp2::AskForVoteResponse& resp) {
  37.           return resp.get_error_code() == nebula::cpp2::ErrorCode::SUCCEEDED &&
  38.                  !hosts[idx]->isLearner();
  39.         })
  40.         .via(executor_.get())
  41.         .then([self = shared_from_this(), pro = std::move(promise), hosts, proposedTerm, isPreVote](
  42.                   auto&& t) mutable {
  43.           pro.setValue(
  44.               self->handleElectionResponses(t.value(), std::move(hosts), proposedTerm, isPreVote));
  45.         });
  46.     return future;
  47.   }
  48. }
复制代码
Eagle:“这个方法发起领导者推举。它起首准备推举哀求,然后发送哀求并等待响应。如果获得多数票,它将成为领导者。”
关键实现细节也以代码出现的形式进行了解读

Q:Nebula Graph 的 Raft 算法实现中的领导者(leader),是集群中的某个节点吗?还是说对数据进行分片,每个分片会以多个副本存在几个节点上,每个节点都有大概成为差异数据分片的leader?


Eagle 对 Nebula Graph 中的数据分片机制及其与 Raft 算法的关系做了详细解释,回答了用户的疑问。



Eagle 还对要点进行了简明扼要的总结,让用户一目了然。
 



Eagle 按照用户提示,给出了关键代码。

小tips
Eagle 除了可以直接提交 GitHub 开源项目地点外,也可通过上传开源项目 Zip 压缩包的形式进行提问,欢迎大家进行试用。

有更多想要了解的也可以关凝视频号:码力一哥。十一期间还有直播,可以和老师 1V1 交换 AI 大模子编程的相关题目,助力职场提升!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连全瓷种植牙齿制作中心

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表