PositioningStore可能导致数据丢失
hilaryfrank opened this issue · 1 comments
joyqueue的代码我看的比较早,记得之前store在flush的时候都只是通过write方法将数据写入FileChannel,然后并没有fsync到磁盘。
更新代码之后发现2020年4月,有提交新逻辑,支持在上一个文件写满了,然后第一次写新文件的时候,对上一个文件做一次force将其数据fsync到磁盘上(如下PositioningStore第414行)。
if (!storeFile.isClean()) { // 在文件第一次刷盘之前,需要把上一个文件fsync到磁盘上,避免服务器宕机导致文件不连续 if (flushForce && storeFile.flushPosition() == 0) { Map.Entry<Long, StoreFile<T>> prevEntry = storeFileMap.floorEntry(entry.getKey() - 1); if(null != prevEntry) { prevEntry.getValue().force(); } } storeFile.flush(); }
但是此时似乎还是会存在PositioningStore中数据丢失的问题。即一个Store文件在写入的过程中(没有写满),此时如果宕机,那么这个文件的部分数据会因为没有执行force导致数据没有刷新到磁盘(此时还在内核的page cache中),从而导致数据丢失!!!!
针对这个问题,我参考过其他涉及到WAL方式实现的各类开源项目,其几乎都是每写一次盘,然后force一次数据。
请问joyqueue目前这种实现是出于什么考虑呢?
是以多副本保证数据可靠性,不是以一定写盘保证的,类似kafka