我试图了解VoltDB 9.x中多分区事务的影响。我知道它是为单部分交易设计的,但是我想知道如果我无法避免它会花多少钱。总而言之,我的问题是VoltDB中的多分区事务是否仍始终锁定整个集群,并且不同种类的多分区事务在执行性能方面如何相互关联?
来自H-Store-FAQ:
[...]这允许H-Store支持其他优化,例如推测执行和任意多分区事务。例如,在VoltDB中,每个事务都是单分区或全分区。也就是说,任何需要触摸多个分区的事务都将导致VoltDB的事务协调器锁定群集中的所有分区,即使该事务仅需要触摸两个分区上的数据也是如此。 [...] VoltDB将来可能会支持这些功能[...
论文The VoltDB Main Memory DBMS和How VoltDB does Transactions声称它在VoltDB中至少存在一个多分区事务拆分:一次性读取和通用2PC事务。
在类MpTransactionTaskQueue中有一个区别,是将事务路由到MPI的多分区站点(计数1)还是只读站点池(默认计数最多20),它们可以不会交错执行。
所以这是我的子问题:
分区由一个或多个站点(在单独的服务器上)组成,具体取决于kfactor。这些站点通过确定性过程在没有2PC的情况下保持同步。分区在队列中的待办事项中以最快的速度处理时间(或本地执行时间)。所有站点都可以读取和写入。
发送到那些分区队列的MP任务必须等待所有未决项目完成。这就是为什么有20个(默认)线程池用于MP读取的原因。这允许一次发送20个任务,因此下一次MP读取通常不必等待2个网络跃点+最大队列等待时间+处理时间才可以排队。
不是“一次性”的MP读取将是具有多个voltExecuteSQL()调用的Java过程,例如后续SQL查询依赖于先前查询结果的过程。当这些事务将任务发送到分区时,分区必须等待最大队列等待时间+处理时间+ 2个网络跃点,然后才能进行事务的下一部分。
MP写操作还可以有多个voltExecuteSQL()调用,另外它们还必须等待最终的提交信号,因此,所有这些操作都会延迟分区的进度。
肯定有MP事务的示例不需要涉及所有分区,并且可以从未来的优化中受益,但是它并不像在必须支持磁盘持久性和k安全性的数据库中看起来那样容易,弹性添加和收缩,多集群主动-主动复制以及VoltDB从H-Store项目中诞生以来多年来已添加的许多其他功能。
披露:我在VoltDB工作