知识库

容量规划示例

以下是一个关于针对以下需求列表的 Neo4j 工作负载的容量规划的简要示例

需求

需求

总用户数

100-200(最终用户,最有可能通过前端应用程序访问)

每个用户每天的访问次数(读取/查询)

5

节点数

50-75 MM

关系数

100-150 MM

每个节点的属性数

最小 1,最大 50,平均 5

每个关系的属性数

最小 0,最大: 20,平均: 2

平均请求时间

500 毫秒

峰值查询每秒

200/秒

批量插入和更新的频率

每天 4-5 次

假设批量大小为提供量的 10%

~ 每天 20 GB,500 万个节点

增量数据量的最大处理/摄取

一小时

RR

在美国 + EU AWS 中

DR

在 2 个美国可用区中进行 DR

分析

1) 估计初始数据库大小约为 38GB(见下表) - 假设

  • 索引的 20%

  • 节点和关系的最大数量,以及每个节点和关系的平均属性数

数量

每个对象的字节数

空间(GB)

属性小计

节点

75000000

15

1.048

关系

150000000

34

4.750

每个节点的属性

5

41

14.319

每个关系的属性

2

41

11.455

25.774

索引(百分比)

20

6.314

总计

37.886

2) 假设每天负载为 500 万个节点(或 10% - 并且假设我们为了未来一年的增长而需要再增加 50% 的容量。)

3) 然后我们估计每个实例大约需要 100GB 的总内存 [ 5 GB(OS) + 60 GB(数据 + 索引 + 50% 增长) + 30GB(堆) ~ 100GB 的总内存]

4) 最后,我们估计我们需要大约 10 个 CPU 内核(或 20 个 vCPU 内核)来满足峰值需求(每秒 200 个查询,响应时间为 500 毫秒),在具有 3 个内核和 2 个 RR 的集群中(见下文)

  • 每秒的并发请求数 200/秒

  • 工作负载/查询处理时间 (w=0.50 秒)

  • CPU 负载系数 0.5 (c=.5 ; 也就是说 CPU 平均将占用 50% 的负载)

  • 需要为之设计的实例故障数 F=1

  • 内核数 = r x w / c = 200 x .5 / .5 = 200

  • 集群大小 = 3 个内核 + 2 个 RR

  • 每台机器的内核数 = 200/5 = 40 (或 80 个 vCPU 内核)

  • 估计

    • 集群配置 (5 个实例) x (每个实例 80 个 vCPU 内核,内存 100GB)