SingleWrite 与 TripleWrite

SingleWrite vs TripleWrite

我非常清楚何时何地使用 SingleWrite 作为 MQ 中的日志算法是有利的。它有利于高吞吐量、低并发工作负载。当工作负载更多并发时,TripleWrite 的开销不是一个因素。

我不明白并且正在努力寻找有关 TripleWrite(自 v6 以来 Websphere MQ 的默认设置)的任何信息实际上是如何实现的。我知道它实际上并没有将每个事务都写入日志 3 次,而且它只是在涉及部分页面时与 SingleWrite 的行为不同。但是它有什么不同呢?它会调用 fsync 三次吗?

我没有任何真正的实际目的或问题要解决,这比什么都好奇。我已经使用 Websphere MQ 工作了几年,并且想更好地理解这一点。

有没有人能解释一下?

编辑:

我仔细考虑了一下,其中一个选项是它类似于 InnoDB 的 DoubleWrite。 InnoDB 有一个双写缓冲区,在将更新写入数据文件之前,所有更改首先按顺序写入。在恢复时,要么您有一个完整的成功写入的双写缓冲区可以从中恢复,要么 table 数据从未被修改过。

我不确定这是否与 MQ 的 TripleWrite 类似,因为在几个不同的实例中已经断言 TripleWrite 不会重复写入所有页面,并且 TripleWrite 仅在应用于部分页面时与 SingleWrite 的行为不同。

非常粗略地说,它类似于以下内容(请记住,问题仅与部分页面有关,随着 MQ 版本的升级,这种情况越来越不可能 - 这就是为什么单次写入的好处大多非常小)

假设 MQ 将 10 个字节写入一个页面,因此日志页面中还剩下很多 space(固定大小)。当 MQ 然后想要写入更多字节时(现在记录器已经移动的页面的其余部分,或者可能(不太可能)更多的少量数据),它不能只覆盖该页面,因为磁盘可能会在写入和写入过程中崩溃可能会破坏已经需要保留以保持完整性的内容(前 10 个字节)。因此,第二次写入(包含更多数据)发生在其他地方,然后是遍历原始页面的第三次写入。因为它总是知道哪些写入是成功的,所以它知道在恢复步骤中应该使用原始页面还是 'elsewhere' 页面。