概念

可扩展性是数据库管理的一个关键方面,它允许系统通过添加或移除资源来处理不断变化的需求,从而满足数据库工作负载的要求。Neo4j 支持多种实现可扩展性的策略,使系统能够在不影响性能或可用性(即系统的弹性)的前提下,处理更大的数据集、更多的并发用户以及更高的查询复杂度。主要的三种策略包括:

什么是可扩展性?

可扩展性是指系统在不影响性能的情况下处理不断增加的工作负载的能力。实现可扩展性有两种主要方法:

表 1. 扩展方法
方法 描述 优点 缺点

垂直扩展(向上扩展 / 向下扩展)

通过添加或减少 CPU、内存或存储来增加或减少单台服务器的容量。

易于管理。

  • 存在物理限制。

  • 难以进行在线变更。

水平扩展(向外扩展 / 向内收缩)

通过增加更多服务器来分担工作负载,或通过移除现有服务器来缩减基础设施。

  • 具有更高的可扩展性和容错能力。

  • 更容易进行在线变更。

管理较为复杂。

什么是数据库可扩展性?

数据库可扩展性是指数据库管理系统 (DBMS) 处理不断变化的需求的能力。为了正确地进行扩展,数据库必须应用涵盖所有领域的策略:数据访问、内存中的数据操作以及数据库计算。

策略包括:

  • 垂直扩展

    • 优化使用(例如,细粒度锁、分区)

    • 优化物理资源(多线程、分层存储)

  • 水平扩展(分布式计算架构)

    • 共享一切 (Shared Everything):所有服务器共享数据和内存。灵活,但易产生资源争用。
      在这种模型中,数据在集群中所有服务器的磁盘和内存之间共享。请求可以由任何服务器组合来满足。这种方法引入了复杂性,因为集群必须实现一种机制,以避免当多个服务器同时尝试更新同一数据时发生争用。

    • 无共享 (Shared Nothing):每台服务器管理自己的分区(分片)。容错性更强,消除了单点故障。
      每个更新请求都由单个集群成员处理,这消除了单点故障。单个集群成员上的数据库部分被称为分片 (shard)

horizontal scaling strategies
图 1. 所有服务器共享存储的共享架构与无共享架构(例如,属性分片)的示例对比。

什么是图数据库可扩展性?

图数据库可扩展性是指数据库在不影响性能的情况下处理不同数据量和工作负载的能力。它包括:

  • 数据量 - 涉及确保查询和管理响应时间的一致性 SLA,即使在存储和检索的数据规模不断扩大的情况下。
    数据量取决于数据类型。向量会占用较大的数据空间。

  • 查询量

    • 读取查询 + 写入查询。

    • 查询和用户并发性 — 目标是确保在对同一数据库执行并发查询时,响应时间保持线性。

    • 查询复杂度 — 提供与查询复杂度相匹配的响应时间。查询的复杂度可以通过以下因素的组合来确定:

      • 执行步骤

      • 待检索行数

      • 总数据库命中次数 (DB hits)

      • 总内存分配

      • 总执行时间

  • 管理负载量

    • 数据摄入/提取 — 在扩展数据摄入/提取时,目标是在摄入或提取不断增加的数据集时保持线性响应时间。只要使用相似的数据结构,无论存储的数据量如何,此目标始终成立。

    • 多租户 — 在 SaaS 和 AaaS 环境中,租户的扩展成本应呈现线性关系。对于更通用的服务(如 DBaaS,例如 Aura),考虑到此处提到的所有五个可扩展性因素,其可扩展性也应是线性的。