orientdb - 使用 OrientDB 扩展时的性能问题
问题描述
我们正在尝试以分布式模式扩展 OrientDB,但面临性能瓶颈。
我们的用例
数据模型和处理方法:
我们有子图消息,我们正在从 kafka 读取并持久化/附加到数据库中的图。子图消息可以在图中保存/更新多个顶点/边。这些顶点/边可能存在或不存在于数据库中,因此我们必须首先查询数据库它们是否存在。如果它们存在,我们必须检查是否有任何属性被更改,并且必须相应地执行更新操作。Vertices
are of two types
and have around 10 to 15 properties
them,而edges
are of two types
and have only 3 properties
on them。服务并行消费子图消息16 kafka threads
并执行读取/更新/创建操作concurrently
。
我们正在使用Graph API
(方向图的蓝图实现)。目前为了处理一个子图,我们使用transactional graph
池中的一个图实例。远程与数据库连接的pool
有。250 instances
在处理完所有更新/创建所需的操作之后transaction is committed only once
。
性能瓶颈
我们目前只能在分布式模式下15K
每分钟处理大约子图消息16 threads
并运行。OrientDB v2.2.35
并发性造成的性能损失:在单线程上处理子图消息时,大约需要 10 毫秒(大约 35 次读取、15 次更新和 20 次创建操作),但并发处理时它会以指数方式增加至 20-45 毫秒。
横向扩展 orient 数据库:A. 由于此错误,无法在分布式模式下运行 OrientDB v3.0.3:https ://github.com/orientechnologies/orientdb/issues/8427 B. 尝试使用
OrientDB 2.2.35
它。但是对于standalone
OrientDB 和并发调用,它需要20-45ms
处理子图。然而,平均需要 2 个服务器节点都作为主节点运行distributed mode
。100-110 ms
虽然除了要花更多的时间writeQurom
,majority
但有什么可以做的,以减少它。边创建缓慢:我们注意到边创建是使用 Graph API 的繁重操作,因为它需要引用两个顶点,因此还涉及读取这些顶点以在活动事务中获取引用。
到目前为止我们已经尝试过的事情:
调优图 API
- 查找
indexes
顶点和边 - 声明
massive insertion intent
在写入方面有所改进,但在读取方面性能受到影响,因为它禁用了本地缓存。 - 使用定义明确
schema
的 . - 切换
off data validation
:没有明显改善 - 禁用
client level cache
虽然会减少 JVM 消耗,但对性能很重要 - 禁用
transactional logs
: 没有明显改善。
调优分布式数据库集群:
- 使用
Master-Replica
模型没有明显改善。 Load balancing
:对数据库的并发调用和负载平衡策略设置为ROUND_ROBIN
获得大量并发修改异常,从而导致重试次数增加。- 开箱即用,
sharding
但由于其无法维护唯一索引的限制,无法在我们的用例中使用它。
Upsert 创建边缘
- 我们尝试使用带有边缘的 upsert,但它似乎已损坏,此时需要修复。(https://github.com/orientechnologies/orientdb/issues/8424)。
解决方案
推荐阅读
- c# - 如何正确转换布尔值?
- unity3d - Unity UWP Build on Windows Store - 包中支持的语言
- shell - 使用 shell 命令从 CSV 文件中的列数据中删除负数
- redux - 当我们使用 createSlice 时,我们使用 createAsyncThunk() 函数处理 sideEffect,有什么方法可以以 saga 风格实现此功能?
- flutter - android 的 serial_port_flutter 错误> = 8.0
- powerbi - 地图中未包含数据的国家/地区变灰
- javascript - 如何使用 javascript 将 HTML 表单转换为可编辑的 pdf?
- elasticsearch - Elasticsearch pod 就绪探测失败并显示“消息”:“就绪探测失败”、“curl rc”:“7”
- function - 查找与平均值差异最大的数字
- reactjs - 如何使用类组件创建 formik 表单?