新手学习NebulaGraph的过程和疑问

作为菜鸟,一直在跟着大佬们的指导在学习和理解NebulaGraph。想着做一个学习记录,也请各位大佬们指导和帮助。

  1. 源码编译安装

    一开始,我就是根据官网的源码编译安装在本地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


  1. 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无法跟踪的问题。
  1. 查看日志

    我便按照自己的理解和认识,通过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: 测试更新顶点的功能。

后面我打算继续通过日志来追踪这些测试文件,不知道各位大佬有没有什么想法,欢迎各位大佬和小白留言,我们一起学习。

2 个赞