作为菜鸟,一直在跟着大佬们的指导在学习和理解NebulaGraph。想着做一个学习记录,也请各位大佬们指导和帮助。
-
源码编译安装
一开始,我就是根据官网的源码编译安装在本地Linux系统中安装成功。
配置文件: cd /xxxx/nebula/etc sudo cp nebula-graphd.conf.production nebula-graphd.conf sudo cp nebula-metad.conf.production nebula-metad.conf sudo cp nebula-storaged.conf.production nebula-storaged.conf 启动Nebula Graph: sudo /nebula/scripts/nebula.service start all sudo /home/Test/nebula/scripts/nebula.service start all [INFO] Starting nebula-metad... [INFO] Done [INFO] Starting nebula-graphd... [INFO] Done [INFO] Starting nebula-storaged... [INFO] Done 查看状态时出错: sudo /home/Test/nebula/scripts/nebula.service status all [INFO] nebula-metad(de9b3ed80): Exited [INFO] nebula-graphd(de9b3ed80): Exited [INFO] nebula-storaged(de9b3ed80): Exited
解决方法:
(1)在/nebula/etc打开nebula-metad.conf,把192.168.2.1修改为本机IP: sudo chmod +w nebula-metad.conf sudo vim nebula-metad.conf (2)将etc/nebula-storaged.conf修改IP地址 将--local_ip的192.168.2.1修改成本机的IP 将--meta_server_addrs修改成单机的默认地址:127.0.0.1 sudo chmod +w nebula-storaged.conf sudo vim nebula-storaged.conf (3)将etc/nebula-graphd.conf修改IP地址 sudo vim nebula-graphd.conf
再次查看状态时:
sudo /home/Test/nebula/scripts/nebula.service status all
-
GDB追踪代码
之后,我用GDB追踪代码,参考了新手阅读 NebulaGraph 源码的姿势和你的内核开发指北,新手也能搞 NebulaGraph 内核开发。
开始追踪: sudo scripts/nebula.service start metad sudo scripts/nebula.service start storaged gdb nebula-graphd (gdb) set args --flagfile /home/Test/nebula/etc/nebula-graphd.conf (gdb) set follow-fork-mode child (gdb) b main (gdb) run
但是在logging就失败,通过gdb 启动的话,需要在你启动目录的 logs(目录是需要你自己创建),要在当前目录创建个 logs目录 和 pids 目录:
sudo mkdir logs pids
可是,我在实践中,却发现gdb run被停住了。我查询找到了相似问题的帖子:gdb调试提问:程序运行不下去,顺便问下单元测试,logging失败。
在其中,有答复回答:
- graphd和storaged是两个不同的进程,可能存在gdb无法跟踪的问题。
-
查看日志
我便按照自己的理解和认识,通过logs里的日志来运行,并获得了Storaged、Graphd、Metad这三个调用逻辑链。
(1)Storaged 1.StorageDaemon.cpp:132 -> 初始化 StorageDaemon,设置本地主机地址和端口号。 2.StorageDaemon.cpp:147 -> 设置数据路径。 3.MetaClient.cpp:80 -> 创建 Meta 客户端并连接到指定的地址和端口。 4.MetaClient.cpp:81 -> 设置根路径和数据路径大小。 5.FileBasedClusterIdMan.cpp:53 -> 获取集群ID。 6.MetaClient.cpp:3263 -> 加载指定空间的领导者。 7.MetaClient.cpp:3269 -> 加载领导者成功。 8.MetaClient.cpp:162 -> 注册心跳任务。 9.StorageServer.cpp:250 -> 初始化模式管理器。 10.StorageServer.cpp:253 -> 初始化索引管理器。 11.StorageServer.cpp:256 -> 初始化键值存储。 12.NebulaStore.cpp:48 -> 启动 Raft 服务。 13.NebulaSnapshotManager.cpp:25 -> 设置发送快照的默认速率限制。 14.RaftexService.cpp:46 -> 在端口 9780 上启动 Raft 服务。 15.NebulaStore.cpp:82 -> 扫描本地路径并初始化空间。 16.NebulaStore.cpp:90 -> 扫描路径并初始化。 17.RocksEngineConfig.cpp:371 -> 设置 RocksDB 选项。 18.WebService.cpp:124 -> 启动 Web 服务,监听在端口 19779 上。 19.RocksEngineConfig.cpp:371 -> 置 RocksDB 选项。 20.RocksEngine.cpp:107 -> 在指定路径上打开 RocksDB。 21.AdminTaskManager.cpp:22 -> 设置最大并发子任务数。 22.AdminTaskManager.cpp:40 -> 初始化 AdminTaskManager 并退出。 23.AdminTaskManager.cpp:224 -> 等待传入任务。 24.MemoryUtils.cpp:171 -> 设置内存跟踪器的静态比率。 25.MetaClient.cpp:3263 -> 加载指定空间的领导者。 26.MetaClient.cpp:3269 -> 加载领导者成功。 (2)Graphd 1.GraphDaemon.cpp:122 -> 启动图形 HTTP 服务 2.WebService.cpp:124 -> HTTP[19669] 上启动网络服务 3.GraphDaemon.cpp:136 -> 网络 IO 线程数: 40 4.GraphDaemon.cpp:145 -> 工作线程数: 40 5.MetaClient.cpp:80 -> 创建到 "127.0.0.1":9559 的元客户端 6.MetaClient.cpp:81 -> 根路径: /home/Test/nebula, 数据路径大小: 0 7.MetaClient.cpp:3263 -> 在 1 个空间中加载 "xx.xx.xx.xx":9779 的 leader 8.MetaClient.cpp:3269 -> 加载 leader 成功 9.MetaClient.cpp:162 -> 注册心跳时间任务 10.GraphSessionManager.cpp:337 -> 总共加载了 0 个会话 11.MemoryUtils.cpp:171 -> MemoryTracker 设置静态比例: 0.8 12.Snowflake.cpp:17 -> WorkerId 初始化成功: 1 13.GraphServer.cpp:63 -> 在 xx.xx.xx.xx:9669 上启动 nebula-graphd (3)Metad 1.NebulaSnapshotManager.cpp:25 - 发送快照速率默认限制为10485760字节。 2.RaftexService.cpp:46 - 在端口9560上启动Raft服务。 3.NebulaStore.cpp:82 - 扫描本地路径,并初始化空间。 4.NebulaStore.cpp:90 - 扫描路径"/home/Test/nebula/data/meta/nebula/0"。 5.NebulaStore.cpp:292 - 从PartManager初始化数据。 6.NebulaStore.cpp:417 - 创建数据空间0。 7.RocksEngine.cpp:107 - 在/home/Test/nebula/data/meta/nebula/0/data上打开RocksDB。 8.NebulaStore.cpp:480 - 添加空间0,部分0,非学习者0。 9.NebulaStore.cpp:75 - 注册处理程序。 10.MetaDaemonInit.cpp:106 - 等待选举领导者。 11.MetaDaemonInit.cpp:118 - 领导者未被选举,休眠1秒。 12.MetaDaemonInit.cpp:153 - 获取元版本为4。 13.MetaDaemonInit.cpp:169 - Nebula存储初始化成功,集群ID为7231882061965515526。 14.MetaDaemon.cpp:150 - 启动HTTP服务。 15.MetaDaemonInit.cpp:226 - 启动Meta HTTP服务。 16.WebService.cpp:124 - HTTP[19559]上的Web服务已启动。 17.MetaDaemonInit.cpp:192 - 检查根用户。 18.RootUserMan.h:35 - 神用户存在。 19.MetaDaemon.cpp:193 - Meta守护进程启动在"127.0.0.1":9559上。 20.JobManager.cpp:64 - JobManager初始化。 21.JobManager.cpp:150 - 进入JobManager::scheduleThread。 22.HBProcessor.cpp:33 - 接收来自"xx.xx.xx.xx":9669的心跳,角色为GRAPH。 23.HBProcessor.cpp:89 - 更新主机"xx.xx.xx.xx":9669的目录信息,根路径为/home/Test/nebula,数据路径大小为0。 24.SessionManagerProcessor.cpp:136 - 响应会话大小为0。 25.ListHostsProcessor.cpp:249 - 跳过非活动主机"xx.xx.xx.xx":9779。 26.HBProcessor.cpp:33 - 接收来自"xx.xx.xx.xx":9779的心跳,角色为STORAGE。 27.HBProcessor.cpp:89 - 更新主机"xx.xx.xx.xx":9779的目录信息,根路径为/home/Test/nebula,数据路径大小为1。 28.SessionManagerProcessor.cpp:136 - 响应会话大小为0。 29.HBProcessor.cpp:33 - 接收来自"xx.xx.xx.xx":9779的心跳,角色为STORAGE。
此外,我也根据文章的指导,在build/bin/test寻找Nebula Graph 的测试文件,用于测试 Nebula Graph 中各个模块的功能是否正常,以下是我提取的部分测试文件:
1.add_edges_test: 测试添加边的功能。 2.add_vertices_test: 测试添加顶点的功能。 3.admin_client_test: 测试管理客户端的功能。 4.chain_add_edge_test: 测试链式添加边的功能。 5.chain_update_edge_test: 测试链式更新边的功能。 6.cord_test: 测试 Cord 数据结构的功能。 7.create_backup_test: 测试创建备份的功能。 8.data_set_test: 测试数据集功能。 9.delete_edges_test: 测试删除边的功能。 10.delete_tags_test: 测试删除标签的功能。 11.delete_vertices_test: 测试删除顶点的功能。 12.kv_client_test: 测试 KV 客户端的功能。 13.kv_test: 测试 KV 功能。 14.kvstore_common_test: 测试 KV 存储通用功能。 15.storage_kill_query_test: 测试存储终止查询的功能。 16.structural_value_test: 测试结构值的功能。 17.update_edge_test: 测试更新边的功能。 18.update_vertex_test: 测试更新顶点的功能。
后面我打算继续通过日志来追踪这些测试文件,不知道各位大佬有没有什么想法,欢迎各位大佬和小白留言,我们一起学习。