使用OrientDB进行扩展时的性能问题

使用OrientDB进行扩展时的性能问题,orientdb,orientdb2.2,Orientdb,Orientdb2.2,我们正试图在分布式模式下扩展OrientDB,但却面临性能瓶颈 我们的用例 数据模型和处理方法: 我们从卡夫卡读取子图消息,并将其持久化/附加到数据库中的图中。子图消息可以包含要在图中保存/更新的多个顶点/边。这些顶点/边可能存在于数据库中,也可能不存在于数据库中,因此我们必须首先查询数据库中是否存在这些顶点/边。如果它们存在,我们必须检查是否有任何属性被更改,并且必须相应地执行更新操作顶点分为两种类型并具有大约10到15个属性,而边分为两种类型,仅具有3个属性。服务并行使用来自16个kafka

我们正试图在分布式模式下扩展OrientDB,但却面临性能瓶颈

我们的用例

数据模型和处理方法:

我们从卡夫卡读取子图消息,并将其持久化/附加到数据库中的图中。子图消息可以包含要在图中保存/更新的多个顶点/边。这些顶点/边可能存在于数据库中,也可能不存在于数据库中,因此我们必须首先查询数据库中是否存在这些顶点/边。如果它们存在,我们必须检查是否有任何属性被更改,并且必须相应地执行更新操作<代码>顶点分为两种类型并具有大约10到15个属性,而
分为两种类型,仅具有
3个属性
。服务并行使用来自
16个kafka线程的子图消息
,并同时执行读取/更新/创建操作

我们正在使用
图形API
(orient Graph的蓝图实现)。目前,为了处理一个子图,我们使用池中的一个图
事务图
实例。
大约有250个实例
与数据库远程连接。在处理更新/创建所需的所有操作后,
事务只提交一次

性能瓶颈

目前,我们在分布式模式下运行
16个线程和
OrientDB v2.2.35
时,每分钟只能处理大约15K
子图消息

  • 并发导致的性能损失: 在单线程上处理子图消息时,大约需要10毫秒(大约35次读取、15次更新和20次创建操作),但同时处理到20-45毫秒时,子图消息的速度会呈指数级增长

  • 水平向上扩展orient数据库: A.由于此错误,无法在分布式模式下运行OrientDB v3.0.3: B.尝试使用
    OrientDB 2.2.35
    。但对于独立的
  • OrientDB和并发调用,处理子图大约需要20-45毫秒。然而,在
    分布式模式下
    平均需要
    100-110 ms
    ,两个服务器节点都作为主节点运行。虽然由于
    writekrom
    设置为
    多数
    ,这可能需要更多的时间,但是有什么办法可以在一定程度上减少它

  • 慢速边缘创建: 我们注意到,使用Graph API创建边是一项繁重的操作,因为它需要引用两个顶点,因此需要读取这些顶点,以便在活动事务中获取引用

  • 我们迄今为止尝试过的事情:

    调整图形API

  • 查找顶点和边的
    索引
  • 声明
    massive insertion intent
    在写操作上有所改进,但在读操作上性能有所提高,因为它禁用了本地缓存
  • 使用定义良好的
    模式
  • 关闭数据验证
  • :无明显改善
  • 禁用
    客户端级缓存
    虽然可以减少JVM消耗,但对性能很重要
  • 禁用
    事务日志
    :没有明显的改进
  • 优化分布式数据库群集:

  • 使用
    主副本
    型号没有明显的改进
  • 负载平衡
    :由于对数据库的并发调用和负载平衡策略设置为
    循环
    ,导致大量并发修改异常,从而导致重试次数增加
  • 开箱即用
    sharding
    box进行探索,但由于其无法维护唯一索引的局限性,在我们的用例中无法使用它
  • 向上插入以创建边

  • 我们尝试使用带边缘的upsert,但它似乎已损坏,此时需要修复。( ).
    您正在运行的实际查询是什么?