在持续耐用的数据时,有四种方法可以做到:撤消日志,重做日志,镜像和影子数据。
嗯,耐用的意思是你尝试保存的任何数据,都以发声方式到达了您的存储设备。这意味着当您写入存储时,您希望它成为"永久和#34;那里是该存储设备是USB密钥,CD ROM,ANHARD驱动器和SSD,还是像英特尔&#的非易失性存储器DIMM 39; S Optane DC PM。
对于任何历程设备,算法始终相同:您必须使用上面提到的其中一个。
请记住,如果数据需要保持一致,即您希望在存储之前或没有数据之前看到窗口数据。我的意思是,如果我们还可以使用乱码的数据,我们为什么要在永久存储中幸免于它?制作数据的整个点是因为它具有重要信息,因此它意味着一致性。
我将在交易的背景下重点融合这些,但他们不必如此。
undo log iStechnique在我们写入持久存储的位置,每次写入的日志条目是doneto存储。它允许多个独立的(非原子)写入以全面或无线方式可获得,如事务或检查站。
在逻辑内存中的上下文中,PMDK中的LibpMemobj是事务系统的示例,它使用撤消日志。
在Redo日志中,我们在编写实际数据之前,请在使用多个条目的日志中编写日志。重做和撤消之间的目的是,撤消日志在日志ATA时间内执行一个条目,然后是一个修改,而重做日志在一个拍摄中在Thelog中的所有条目,然后一次拍摄的所有修改。
暗影副本,有时称为编写写作(COW)创建一个新的数据副本,并在交换某种指针之前,将新数据与未改变的内容一起与耐用存储一起,以指示这是newObject /数据和数据旧的人可以被丢弃。 COW CAN' t真的是在多个对象上进行的交易,但它可以与REDOOL结合,使其更有效。
阴影数据cansmimes与牛混淆,但它不是一回事。在阴影数据中,整个数据的两种(或更多)副本保存在耐用的存储中,并且一次将其进行了一次修改。第一个副本,然后是可动性的指针,然后是第二个副本。在下一组原子译文上,最近更新的副本是第一个更新的副本。
我们虽然长时间的虽然在这四种算法之间的相似之处和差异,但我们发现它们具有四个共同特征,无论它们的底层存储介质如何。
对象中的每一个都揭示了对耐用性概念的重要洞察力,我们认为这些是所有持久技术遵守的经验规则。这些规则是:
关于持久事务的第一个keyInsight是数据必须始终存在的一致和持久的副本。此副本可能是TheData的完整副本,例如在阴影数据上,或者它可能是逻辑副本,例如未经删除和重做日志。
直观地,有一个是数据的一致副本,因此在发生故障时有一种方法可以在其原始一致状态下恢复到其原始的一致状态。 Shadow Datakeeps的全部复制品,因此,凸起的媒体(空间放大)的高永久性使用,而撤消日志和重做日志接近以写入耐用存储,而不仅仅是新数据,还有,还有关于位置和大小的编码信息修改(Writeamplification)。
这里有明显的动漫折衷:基于日志的算法将增加(摊销)编写池,但基于阴影数据的算法将增加间隔展。
第二个empiricalrule意味着算法必须确保,无论发生遗迹,都有一种方法,恢复过程确定哪些复制品是一致的。
影子数据likeromulus使用两位变量来确定两个副本中的哪一个,而重做日志和撤消日志可以使用日志(零ornon-onony)的大小来指示日志是否一致。
本身,任何方法都没有显着差异,但是精确的力学将影响算法中的排序约束的数量。
这导致我们才能识别,只有通过订购写作的订购,可以实现数据一致性。
对于卷影复制,必须在Pointer交换之前对新块的修改持续,否则在指针交换后发生故障,将使指针引用不一致的块。这意味着除了块分配和解除分配细节之外,影子复制Hasa单个订购约束,还是换句话说,单个订购围栏。
影子数据likeromulus使用双位状态(虽然一点就足够)来指示两个副本是一致的一个,或者两者是一致的。如果指示哪个副本的状态变量是在副本的修改之前或之后的一致性的状态变量,则在恢复时,可以参考不一致的副本。对于本发明算法,存在三个排序约束:一个以防止状态从主副本aredone的修改之前从复制到复制;另一种防止在状态更改复制之前从后退副本中的修改;而另一个可以防止在反复复制品的更改之前阻止变为空闲。
undo logtechnique每个修改的对象/范围有两个约束:日志条目必须在输入到日志之前的旧值;在TheData上完成修改之前,必须将Entry添加到日志中。 undo log每个事务具有一个额外的约束,要求在重置日志之前持久进行持久。
Redo Logtechnique每次交易有三个约束:在设置日志大小之前,所有日志条目必须耐用;必须在对数据上进行修改之前设置日志大小;在重置日志之前,数据的修改必须持久。
第四个和FinalLule解决了对脚轮域的往返同步机制的需要,使得硬件可以保证它包含,可稳定的耐用存储,所有先前写入的数据。这种情况的成本通常是存储设备的顺序'延迟。
像PMIMPLEMENT这样的快速设备此往返围栏的数量级比较慢的设备更快,如硬盘驱动器。
如果没有这样的机狱,即使设置了OrderingConstraints,也不可能具有持久的操作:如果发生故障,则在发生故障时,将持久的持久性序列的排序限制是持久的,但是耐久性的诺斯坦假设。
所有算法都需要一个且只有一个这样的栅栏,战略性地围栏。
请注意,由于性能的分枝,并且实际上,许多存储系统在两者中没有区分,因此可以通过这种同步围栏代替。通常通过异步栅栏实现订购,并且涉及某些写入将在特定介质中进行耐用的顺序。
在持久存储器(PM)中,可以通过刷新(CLWB)和文件(SFENCE)的组合或通过写入同一缓存行来实现订购。耐久性的往返保障是由同步栅栏,fsync()/ fdatasync()上的块存储,或在PM存储上的Sfence。
如果您没有#39;这一事实,所有算法都需要一个往返围栏的事实,而是可能需要多个订购围栏(PFENCE)具有性能的HASIMPLIMICS。考虑到Psync具有具有物理影响:没有Psync的Psync,这是特别的,这是特别的真实的,没有Psync,它物理地对Thestorage设备(或至少存储域)进行往返,因此延迟成本单一往返旅行是不可避免的。
是的,FSYNC()用于块设备上的同步和排序,并且SFENCE指令在PM中都有陈旧,但是,有技巧。在PM中,保证对同一个高速缓冲线的写入是订购的,因此,只要使用Memory_Order_Releaseease的存储,orderthem即可不需要Sf等。
由于这些往返通常是对PM进行随机写入时的瓶颈,因此我们可以创建一个具有较小PSYNC的算法意味着我们可以获得与宇宙数量的减少成比例的性能增益。
Trinity是一种不需要的技术,只需每次交易中只需要两个围栏,并且在随机写入时减少了冲洗的模糊。它比以前的技术人员消耗更多的内存,但它具有显着的性能。
此外,使用我们自己的TL2变体讨论了高度可扩展的耐麸屈得可巧的事务,我们使用它来制作K / V商店,这是一个具有完整事务的星球上最快的K / V商店(虽然您是您的Optane持久存储器能够运行它)。
https://youtu.be/vdinrf_kk1w