种类多的存储过程,它们是否仍将整个群集锁定在VoltDB 9中?

问题描述 投票:0回答:1

我试图了解VoltDB 9.x中多分区事务的影响。我知道它是为单部分交易设计的,但是我想知道如果我无法避免它会花多少钱。总而言之,我的问题是VoltDB中的多分区事务是否仍始终锁定整个集群,并且不同种类的多分区事务在执行性能方面如何相互关联?

来自H-Store-FAQ

[...]这允许H-Store支持其他优化,例如推测执行和任意多分区事务。例如,在VoltDB中,每个事务都是单分区或全分区。也就是说,任何需要触摸多个分区的事务都将导致VoltDB的事务协调器锁定群集中的所有分区,即使该事务仅需要触摸两个分区上的数据也是如此。 [...] VoltDB将来可能会支持这些功能[...

论文The VoltDB Main Memory DBMSHow VoltDB does Transactions声称它在VoltDB中至少存在一个多分区事务拆分:一次性读取和通用2PC事务。

在类MpTransactionTaskQueue中有一个区别,是将事务路由到MPI的多分区站点(计数1)还是只读站点池(默认计数最多20),它们可以不会交错执行。

所以这是我的子问题:

  • 一站式读取是否总是在RO站点上执行?
  • RO-Site是否还执行只读且非一阶段的多分区事务?
  • 如果它是多分区事务中的至少一个写片段,它将在RW站点上执行,并由2PC进行原子提交?
  • 在两种情况下,我都不必触摸群集中的所有分区。非相关分区是否已锁定或它们是否可以同时执行单分区事务(如果其他分区上正在运行多个“一次读取”或一个“ 2PC事务”)。如果它们被锁定,怎么办?例如,他们是否获得带有空或虚拟计划片段的FragmentTaskMessage?
  • SystemProcedureCatalog类定义了一个“每个标志”,除了只读和单分区标志外,还将在代码中进行检查。此标志与一次读取或Run-Everywhere-Pattern有何关系?
database stored-procedures distributed-transactions voltdb
1个回答
0
投票
MP事务最终仍涉及发送要在所有分区上完成的任务。您注意到的一个例外是特殊的两分区事务,该事务仅在弹性添加或收缩期间用于重新平衡数据。

分区由一个或多个站点(在单独的服务器上)组成,具体取决于kfactor。这些站点通过确定性过程在没有2PC的情况下保持同步。分区在队列中的待办事项中以最快的速度处理时间(或本地执行时间)。所有站点都可以读取和写入。

发送到那些分区队列的MP任务必须等待所有未决项目完成。这就是为什么有20个(默认)线程池用于MP读取的原因。这允许一次发送20个任务,因此下一次MP读取通常不必等待2个网络跃点+最大队列等待时间+处理时间才可以排队。

不是“一次性”的MP读取将是具有多个voltExecuteSQL()调用的Java过程,例如后续SQL查询依赖于先前查询结果的过程。当这些事务将任务发送到分区时,分区必须等待最大队列等待时间+处理时间+ 2个网络跃点,然后才能进行事务的下一部分。

MP写操作还可以有多个voltExecuteSQL()调用,另外它们还必须等待最终的提交信号,因此,所有这些操作都会延迟分区的进度。

肯定有MP事务的示例不需要涉及所有分区,并且可以从未来的优化中受益,但是它并不像在必须支持磁盘持久性和k安全性的数据库中看起来那样容易,弹性添加和收缩,多集群主动-主动复制以及VoltDB从H-Store项目中诞生以来多年来已添加的许多其他功能。

披露:我在VoltDB工作

© www.soinside.com 2019 - 2024. All rights reserved.