重启后看不到数据。我猜想数据将传递给副本以进行写入,然后将其放入ext4。但是在ext4可以将数据同步到磁盘之前,节点将重新启动,并且数据不会被下推到EBS磁盘。
有没有解决的办法?我在openebs
中使用jiva
。我有我的MySQL -> ext4 (iscsi volume) -> Replica -> ext4 (block disks - say Amazon EBS)
。
有时,我观察到运行副本服务器的节点是否重新启动...
答案 0 :(得分:1)
下面是ext4上的article on lwn.net that discusses potential data loss when a program fails to do adequate syncing(也称为崩溃一致性)(注释讨论也很有启发性)。
ext3在使用data=ordered
时显然可以实现更好的崩溃一致性,因为它在将元数据更改提交到日志之前将数据强制插入磁盘。另外,使用默认的提交时间5秒。在ext4的情况下,要进行性能折衷,它使用延迟的物理块分配模型,从而导致未提交的数据继续在高速缓存中保留一段时间。文章引用:
内核不希望让文件数据处于未写入状态的时间过长,但是刷新该数据仍需要一分钟左右的时间(使用默认设置)-远远长于通常看到的五秒钟。 ext3
因此,从理论上讲,未写入的数据只能在易失性缓存中存在,直到被系统范围的sync
或应用程序对它自己的数据的显式fsync
强制磁盘(如Jeffery指出)为止。 如果应用程序/客户端不这样做,则我们更容易丢失数据。
缓解此问题的一种方法是使用sync
选项挂载所需的文件系统(请参阅此"ext4 and data loss" discussion thread),为此,我们必须在两个地方进行强制授权:
(如果为1,我们可以让目标将所有写入转换为同步,如Jeffery所述)
尽管mount(8)
文档特别声明仅在-o sync
(在扩展的文件系统家族中)之前支持使用ext3
,但接受带有此选项的手动文件系统挂载。为了检查挂载协议是否允许但被ext4忽略,我进行了一个小型的基于fio的随机写性能测试,使用安装了sync选项的磁盘对256M的数据样本大小进行了测试。一个没有它。为了确保写入本身不是SYNC写入,请使用direct=1
和iodepth=4
(异步多线程无缓冲I / O)选择libaio ioengine。结果显示,IOPS大约有300多个差异(当然,非sync
挂载的性能更好)。这个结果表明sync
挂载标志确实起了作用,但我仍在寻找更多证据。