我试图了解VoltDB 9.x中多分区事务的影响。我知道它是为单部分事务设计的,但是我想知道如果我不能避免它,我会付出多少代价。总之,我的问题是,VoltDB中的多分区事务是否总是锁定整个集群,不同类型的多分区事务在其执行行为方面是如何相互关联的?
..。这允许H支持额外的优化,例如投机性执行和任意多分区事务。例如,在VoltDB中,每个事务要么是单个分区,要么是全分区。也就是说,任何需要触摸多个分区的事务都会导致VoltDB的事务协调器锁定集群中的所有分区,即使事务只需要触摸两个分区上的数据。..。将来VoltDB可能会支持这些特性.
论文VoltDB主存数据库管理系统和VoltDB如何处理事务声称,在VoltDB中至少存在一种多分区事务:一击读取和通用-2 2PC事务。
在MpTransactionTaskQueue类中,事务是被路由到MPI的多分区站点(count 1)还是一个只读站点池(默认计数最多为20),并且它们不能被交错执行,这是有区别的。
以下是我的主要问题:
发布于 2020-01-07 21:53:13
为了使开发人员更容易,过程被称为相同的方式,不管它们是什么类型。内部有不同类型的多分区过程,因为它们提供了一些优化,尽管还有更多的工作要做,一些have项目已经在这些领域进行了研究。
MP事务最终仍然涉及发送要在所有分区上执行的任务。您注意到的一个例外是一个特殊的双分区事务,它仅用于弹性添加或收缩期间的数据再平衡。
分区由一个或多个站点(在不同的服务器上)组成,这取决于kfactor。这些站点在没有2PC的情况下保持同步,需要确定的过程。分区以进程时间(或本地执行时间)允许的速度在队列中处理待办事项。所有站点都同时处理读写操作。
发送到这些分区队列的MP任务必须等待所有挂起的项才能完成。这就是为什么MP读取有20个线程池(默认情况下)。这允许一次发送20个任务,这样下一个MP读取通常不需要等待2个网络跳+最大队列等待时间+处理时间之后才能排队。
MP读取的不是“一次性”的是具有多个voltExecuteSQL()调用的Java过程,例如后续的SQL查询依赖于先前查询的结果的过程。当这些事务向分区发送任务时,分区必须等待最大队列等待时间+处理时间+2个网络跳,然后才能完成事务的下一部分。
MP写操作还可以有多个voltExecuteSQL()调用,而且它们必须等待最终提交信号,因此这都会延迟分区的进度。
当然,MP事务的例子不应该涉及所有分区,并且可以从未来的优化中受益,但它并不像在数据库中看起来的那样容易,因为数据库必须支持磁盘的持久性、k安全性、弹性添加和收缩、多集群活动主动复制,以及自features项目发展以来多年来添加到VoltDB中的许多其他特性。
信息披露:我在VoltDB工作
https://stackoverflow.com/questions/59628897
复制相似问题