磁盘扇区写入primefaces?

澄清的问题:

当操作系统发送命令写扇区到磁盘是primefaces? 即写入新的数据完全成功或旧的数据保持不变,如果电源在写入命令之后立即失败。 我不关心在多个部门写入会发生什么 – 撕裂的页面是可以接受的。

老问题:

假设你在磁盘上有旧的数据X,你在它上面写入新的数据Y,并且在写入过程中树在电源线上。 如果没有花哨的UPS或电池供电的磁盘控制器,那么最终会出现一个破损的页面,其中磁盘上的数据是X部分和Y部分。最后是磁盘上的数据是X部分,Y部分,部分垃圾?

我一直在努力理解像数据库这样的ACID系统的devise,而且对于我的幼稚想法,似乎firebird,它不使用预写日志,依靠给定的写入不会破坏旧数据(X) – 只是不能完全写入新的数据(Y)。 这意味着如果X的一部分被覆盖,只有被覆盖的X的部分可以改变,而不是我们想要保留的X的部分。

为了澄清,这意味着如果你有一个页面大小的缓冲区,比如4096字节,填充了一半Y,我们想要保留的一半X,并且告诉操作系统把这个缓冲区写在X上,没有严重的磁盘在写入期间,我们想要保留的一半X被破坏。

我认为撕裂的页面不是问题。 据我所知,所有驱动器都有足够的电能存储,以便在电源故障时完成当前扇区的写入。

问题是每个人都在说谎。

至less当数据库知道事务已经被提交到磁盘时,每个人都在说谎。 数据库发出一个fsync,操作系统只有在所有未完成的写入都被提交到磁盘时才会返回,对吗? 也许不会。 这是常见的,特别是RAID卡和/或SATA驱动器,因为您的程序被告知所有已经提交(即fsync返回),但尚未有驱动器上的数据。

您可以尝试使用Brad的磁盘检查程序来确定您要用于数据库的平台是否可以在不丢失数据的情况下继续使用该插件。 底线:如果diskchecker失败,该平台对于运行数据库是不安全的。 ACID的数据库依赖于知道什么时候事务已经被提交到后备存储以及什么时候没有。 无论数据库是否使用预写式login(如果数据库没有执行fsync而返回给用户,那么在发生故障时事务可能会丢失,所以它不应该声称它提供了ACID语义)。

Postgresql邮件列表中讨论持久性有很长的篇幅 。 它开始谈论SSD,然后它进入SATA驱动器,SCSI驱动器和文件系统。 你可能会惊讶地发现你的数据如何被丢失。 对于那些需要持久性的数据库的人来说,这不是一个好主意,不仅仅是那些运行Postgresql的人。

似乎没有人同意这个问题。 所以我花了很多时间尝试不同的Google查询,直到我终于find答案。

来自Stephen Tweedie博士,RedHat员工以及linux内核文件系统和虚拟内存开发人员在这里讨论ext3(他开发的) 成绩单 。 如果有人知道,那就是他。

“仅仅把这个东西写到这个杂志上是不够的,因为这个杂志上写着一个标记:这个日志logging实际上是否代表了磁盘的一致性?这样做的方式是通过在磁盘上标记交易完成的一些primefaces操作“[23m,14s]

“现在,磁盘这些日子实际上做出了这些保证,如果你开始写入磁盘的操作,那么即使在扇区中间写入电源失败,磁盘有足够的电力可用,它实际上可以窃取电源主轴的旋转能量,它有足够的能力来完成正在写入的扇区的写入,在任何情况下,磁盘都是这样保证的。 [23m,41s]

不,他们不是。 更糟糕的是,磁盘可能会撒谎,并说数据在实际上在磁盘caching中写入时,默认设置下。 出于性能方面的原因,这可能是可取的(实际耐久性可能会降低一个数量级),但这意味着如果您失去电源并且磁盘caching没有物理写入,那么您的数据就不存在了。

不幸的是,实际的耐久性是艰难缓慢的 ,因为每次写入至less需要进行一次完整的旋转,或者使用日历/撤消进行至less2次。 这限制了您每秒钟几百个数据库事务,并且要求在相当低的级别禁用写入caching。

但实际上,在大多数情况下,这个差别并不大。

看到:

  • 如何(而不是)实现耐久性。
  • FSync()可能不会刷新到磁盘

人们似乎不同意在电力部门的写作过程中发生的事情。 也许是因为它取决于正在使用的硬件,甚至是文件系统。

来自wikipedia( http://en.wikipedia.org/wiki/Journaling_file_system ):

某些磁盘驱动器可确保在电源故障期间写入primefaces性。 但是,其他人可能会在断电后中途停止写一个扇区,使其与错误纠正码不匹配。 这个部门是腐败的,其内容丢失了。 一本物理期刊防止这样的腐败,因为它拥有一个完整的行业副本,可以重播下一次的腐败行为。

似乎表明某些硬盘驱动器不会完成写入扇区,但日志文件系统可以像xlog保护数据库一样防止数据丢失。

从linux内核邮件列表中讨论ext3日志文件系统:

在任何情况下,坏扇区校验和都是硬件错误。 扇区写作应该是primefaces的,不pipe是否发生。

我倾向于相信在维基评论。 实际上,没有xlog的数据库(firebird)的存在意味着扇区写是primefaces的,它不能破坏你不想改变的数据。

这里有很多关于部门写作的primefaces性的讨论,而且还没有达成一致。 但是,那些不同意的人似乎在谈论多部门写作(这在很多现代硬盘上并不是primefaces)。那些说部门写作是primefaces的人似乎更了解他们正在谈论的内容。

你的第一个问题的答案取决于所涉及的硬件。 至less在一些较旧的硬件中,答案是肯定的 – 电源故障可能导致垃圾被写入磁盘。 然而,目前大多数磁盘在磁盘本身内置了一个“UPS” – 一个足够大的电容器足够长的时间将磁盘上的数据写入到磁盘中。 他们还有电路来检测电源是否仍然良好,所以当电源发生故障时,他们将数据写入磁盘,忽略可能收到的垃圾。

就“破损的页面”而言,一个典型的磁盘只接受一次写入整个扇区的命令,所以你得到的结果通常是正确写入的整数个扇区,而其他的则保持不变。 但是,如果您使用的逻辑页面大小超过了单个扇区,那么您最终可能会得到部分写入的页面。

然而,这主要适用于直接连接到普通的移动式硬盘驱动器。 与其他任何事情一样,规则可以而且往往会有所不同。 只是一个明显的例子,如果你正在通过networking进行写作,那么你主要是在使用networking协议的摆布。 如果您通过TCP传输数据,那么与CRC不匹配的数据将被拒绝,但可能会接受通过UDP传输的相同数据(具有相同的损坏)。

我怀疑这个假设是错误的。

现代硬盘驱动器对扇区中的数据进行编码,并使用ECC进行保护。 因此,您最终可以将所有的行业内容都包含在内 – 这对于所使用的编码来说是没有意义的。

对于日益普及的固态硬盘来说,情况更加糟糕 – 在被覆盖之前块被清除,因此,根据所使用的固件和可用空间的大小,完全不相关的扇区会被损坏。

顺便说一下,操作系统崩溃不会导致单个扇区内的数据被破坏。

我期望一个破旧的页面由X部分,Y部分和部分不可读部分组成。 如果在停电时头部正在写扇区,驱动器应立即停止磁头,以使驱动器的其余部分(除了该扇区之外)保持完好无损。

在某些情况下,我会期望几个撕裂的页面由X部分和Y部分组成,但是只有一个撕裂的页面会包含一个不可读的部分。 几页破损的原因是驱动器可以在内部缓冲大量的写入,并且写入的顺序可能交错各个页面中的各个扇区。

我读过了一个矛盾的故事,关于一个新的写入不可读的行业是否会使其再次可读。 即使答案是肯定的,那也是新数据Z,既不是X也不是Y.

当更新磁盘时,驱动器制造商唯一保证的是单个512字节的写入是primefaces的(即,它将完整地完成或者根本不会完成)。 因此,如果发生不合时宜的功率损耗,则只能完成较大写入的一部分(有时称为破坏写入)。