常见问题

本文档列出了 Nebula Graph 常见问题。如果您没有在文档中找到需要的信息,请尝试在 Nebula Graph 官方论坛中的用户问答分类下进行搜索。

Trouble Shooting

Trouble Shooting 部分列出了 Nebula Graph 操作中的常见错误。

服务器参数配置

在 Nebula console 中运行

  1. nebula> SHOW CONFIGS;

详细参考运行配置要求CONFIGS 语法

配置文件

配置文件默认在 /usr/local/nebula/etc/ 下。

配置参考这里CONFIGS 语法

partition 分布不均

参考这里

日志和更改日志级别

日志文件默认在 /usr/local/nebula/logs/ 下。

参见 graphd 日志storaged 日志

使用多块硬盘

修改 /usr/local/nebula/etc/nebula-storage.conf。例如

  1. --data_path=/disk1/storage/,/disk2/storage/,/disk3/storage/

多块硬盘时可以逗号分隔多个目录,每个目录对应一个 RocksDB 实例,以有更好的并发能力。参考这里

进程异常 crash

  1. 检查硬盘空间 df -h

    没有磁盘空间,导致服务写文件失败,服务 crash,通过以上命令查看当前磁盘的使用情况,服务配置的 --data_path 目录是否是满的目录。

  2. 检查内存是否足够 free -h

    服务使用过多内存,被系统杀掉,通过 dmesg 查看是否有 OOM 的记录,记录是否有 nebula 关键字。

  3. 检查日志

使用 Docker 启动后,执行命令时报错

可能的原因是 Docker 的 IP 地址和默认配置中的监听地址不一致(默认是 172.17.0.2),因此这里需要修改默认配置中的监听地址。

  1. 首先在容器中执行 ifconfig 命令,查看您的容器地址,这里假设您的容器地址是 172.17.0.3,那么就意味着您需要修改默认配置的 IP 地址。
  2. 然后进入配置目录 cd /usr/local/nebula/etc,查找所有 IP 地址配置的位置( grep "172.17.0.2" . -r)。
  3. 修改上一步查到的所有 IP 地址为您的容器地址(172.17.0.3)。
  4. 最后重新启动所有服务(/usr/local/nebula/scripts/nebula.service restart all)。

单机先后加入两个不同集群

同一台主机先后用于单机测试和集群测试,storaged 服务无法正常启动(终端上显示的 storaged 服务的监听端口为红色)。查看 storaged 服务的日志(/usr/local/nebula/nebula-storaged.ERROR),若发现 “wrong cluster” 的报错信息,则可能的出错原因是单机测试和集群测试时的 Nebula Graph 生成的 cluster id 不一致,需要删除 Nebula Graph 安装目录(/usr/local/nebula)下的 cluster.id 文件和 data 目录,然后重启服务。

连接失败

  1. E1121 04:49:34.563858 256 GraphClient.cpp:54] Thrift rpc call failed: AsyncSocketException: connect failed, type = Socket not open, errno = 111 (Connection refused): Connection refused

检查服务是否存在

  1. $ /usr/local/nebula/scripts/nebula.service status all
  2. 或者
  3. nebula> SHOW HOSTS;

Could not create logging file:… Too many open files

  1. 检查硬盘空间 df -h
  2. 检查日志目录 /usr/local/nebula/logs/
  3. 修改允许打开的最大文件数 ulimit -n 65536

如何查看 Nebula Graph 版本信息

使用 curl http://ip:port/status 命令获取 git_info_sha、binary 包的 commitID。

修改配置文件不生效

Nebula Graph 使用如下两种方式获取配置:

  1. 从配置文件中(需要修改配置文件并重启服务);
  2. 从 Meta 服务中。通过 CLI 设置,并持久化保存在 Meta 服务中,详情参考这里

修改了配置文件不生效,是因为默认情况下,Nebula Graph 的配置参数管理采用第二种方式 (Meta),如果希望采用第一种方式,需要在 /usr/local/nebula/etc/ 配置文件 metad.confstoraged.confgraphd.conf 中分别添加 --local_config=true 选项。

修改 RocksDB block cache

更改 storage 的配置文件 storaged.conf(默认路径为 /usr/local/nebula/etc/)并重启,例如:

  1. # Change rocksdb_block_cache to 1024 MB
  2. --rocksdb_block_cache = 1024
  3. # Stop storaged and restart
  4. /usr/local/nebula/scripts/nebula.service stop storaged
  5. /usr/local/nebula/scripts/nebula.service start storaged

参见这里

使用 CentOS 6.5 Nebula 服务失败

在 CentOS 6.5 部署 Nebula Graph 失败,报错信息如下:

  1. # storage 日志
  2. Heartbeat failed, status:RPC failure in MetaClient: N6apache6thrift9transport19TTransportExceptionE: AsyncSocketException: connect failed, type = Socket not open, errno = 111 (Connection refused): Connection refused
  3. # meta 日志
  4. Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
  5. E0415 22:32:38.944437 15532 AsyncServerSocket.cpp:762] failed to set SO_REUSEPORT on async server socket Protocol not available
  6. E0415 22:32:38.945001 15510 ThriftServer.cpp:440] Got an exception while setting up the server: 92failed to bind to async server socket: [::]:0: Protocol not available
  7. E0415 22:32:38.945057 15510 RaftexService.cpp:90] Setup the Raftex Service failed, error: 92failed to bind to async server socket: [::]:0: Protocol not available
  8. E0415 22:32:38.949586 15463 NebulaStore.cpp:47] Start the raft service failed
  9. E0415 22:32:38.949597 15463 MetaDaemon.cpp:88] Nebula store init failed
  10. E0415 22:32:38.949796 15463 MetaDaemon.cpp:215] Init kv failed!

此时服务状态为:

  1. [root@redhat6 scripts]# ./nebula.service status all
  2. [WARN] The maximum files allowed to open might be too few: 1024
  3. [INFO] nebula-metad: Exited
  4. [INFO] nebula-graphd: Exited
  5. [INFO] nebula-storaged: Running as 15547, Listening on 44500

出错原因:CentOS 6.5 系统内核版本为 2.6.32,SO_REUSEPORT 仅支持 Linux 3.9 及以上版本。

将系统升级到 CentOS 7.5 问题可自行解决。

max_edge_returned_per_vertex 和 WHERE 条件执行的优先顺序

如果已设置 max_edge_returned_per_vertex=10,使用 WHERE 进行过滤时,实际边数量大于 10,此时返回 10 条边,还是所有边?

Nebula Graph 先进行 WHERE 条件过滤,如果实际边数量少于 10, 则返回实际边数量。反之,则根据 max_edge_returned_per_vertex 限制返回 10 条边。

General Information

General Information 部分列出了关于 Nebula Graph 的概念性问题。

查询返回时间解释

  1. nebula> GO FROM 101 OVER follow;
  2. ===============
  3. | follow._dst |
  4. ===============
  5. | 100 |
  6. ---------------
  7. | 102 |
  8. ---------------
  9. | 125 |
  10. ---------------
  11. Got 3 rows (Time spent: 7431/10406 us)

以上述查询为例,Time spent 中前一个数字 7431 为数据库本身所花费的时间,即 query engine 从 console 收到这条查询语句,到存储拿到数据,并进行一系列计算所花的时间;后一个数字 10406 是从客户端角度看花费的时间,即 console 从发送请求,到收到响应,并将结果输出到屏幕的时间。