使用 Nebula Graph 部署 10 亿节点,100 亿边的配置建议

硬盘方面

  • 点的数据量: 比如 1 亿个点,每个点的属性为 1k,需要 100 G 存储数据空间(属性会做压缩,但是压缩比是不定的,会根据你的数据类型不同的变化,假如是无属性的点,就不会压缩)
  • 边的数据量: 比如 10 亿条边,每条边的属性为 1k,需要 1t 存储数据空间,插入的时候时候正反向都会插入,所以这里是 2t
  • 副本数量: 副本数据为 3 的话
    假如是 3 副本的集群,那么存完这么多数据,每副本需要的硬盘空间为 2.1t ,导入过程假如 wal 没能及时删除,可能需要增加大于2.1t 的空间存 wal 文件(现在默认是 4 个小时之后开始删除,所以 wal 能否在导入数据过程部分被删除,看导入速度)。

cpu 方面

目前 query engine 是会将所在机子的所有线程使用上,storage 用的 cpu 数最大是 16 个, 参数是 num_io_threads, 每个线程的 work 数为 num_worker_threads

内存方面:

  • storage
    • rocksdb: 一个 rocksdb 实例 rocksdb_block_cache 为 1024 m,即 1G,write_buffer_size 为 67108864*4,即 256 M,所以一个 rocksdb 实例需要 1.25 G,如果你使用多个硬盘,需将硬盘数乘以 1.25
    • vertex cache: 默认最大缓存这么多个点 16 * 1000 * 1000 ( vertex_cache_num ), 假如按照上面每个点为 1k,这里需要 16 G
    • wal_buffer_size: 8 * 1024 * 1024 *2 = 16 M,再乘以 partition 数量 100,为 1.6G

所以最少需要 18.85 G, 加上程序运行需要的其他内存,用户根据自己的业务应用进行预留。最好 50G 以上,但是根据业务应用调整。

  • graph:根据业务配置,假如会查询大量的数据,需要配置大点的内存

综上所述,一个要导入 1 亿个点(每个点的属性为 1k ),10 亿条边,(每条边的属性为 1k ),创建的 space 为 3 副本,100 个 partion,最大需要硬盘容量为 4.2t * 3 = 12.6t (没压缩的情况,4.2t 为 2.1t 原始文件 + 2.1t wal 文件)。稳定后的,需要的硬盘容量为 2.1 * 3 = 6.3t (按压缩比 5 ~ 20 ),按最小的压缩比可以到 1.26 t,这里需要补充一句:数据导入完成后,过期的 wal 会被删除。

内存是,存储服务器,最好配置 50G 以上,query engine 根据业务应用,最好可以配置大点内存。

上面为 1 亿节点、10 亿条边的的配置计算方法,针对 10 亿节点,100 亿边场景,在硬盘方面根据上述公式,最大硬盘容量为 126t,稳定之后为 63t,按照 5~20 的压缩比,硬盘容量最小 12.6t。内存方面同上,最好为 50G 以上,在一个硬盘存储所有数据的情况下,最小内存 18.85G

5 个赞

请问下按照这个配置存储10亿个节点 100亿边的性能如何 比如查询响应时间 tps之类的

1 个赞