美文网首页
minio的几个issue

minio的几个issue

作者: 倒数第三 | 来源:发表于2019-04-18 11:18 被阅读0次
  1. 单盘为什么比多盘还慢?
    参见https://github.com/minio/minio/issues/7550

在单盘情况下,采用了
f, err := os.OpenFile(path, flag|syscall.O_SYNC, perm)
确保数据落盘,写入磁盘操作比较耗时。
而多盘情况下,虽然多了计算Erasure部分,即使个别盘由于意外未落盘,不影响数据完整性,所以未强制flush(强行解释...我用的是同一张盘上的多个文件夹,假如断电,数据未落盘,很可能就都没有了~~)。

有人建议使用直接IO(O_DIRECT | O_SYNC),参见https://github.com/minio/minio/pull/7479
能解决上面说到的单盘情况下丢失数据问题,但这会增加耗时,而正常情况下分布式应该是多机房多磁盘的,我觉着没必要做这个改动。

  1. 大文件或传输慢的情况下报错
    参见https://github.com/minio/minio/issues/7503

在bitrot writer中

func newStreamingBitrotWriter(disk StorageAPI, volume, filePath string, length int64, algo BitrotAlgorithm, shardSize int64) io.WriteCloser {
    r, w := io.Pipe()
    h := algo.New()
    bw := &streamingBitrotWriter{w, h, shardSize, make(chan struct{}), 0, int(length / shardSize)}
    go func() {
        bitrotSumsTotalSize := ceilFrac(length, shardSize) * int64(h.Size()) // Size used for storing bitrot checksums.
        totalFileSize := bitrotSumsTotalSize + length
        err:= disk.CreateFile(volume, filePath, totalFileSize, r)
        if err != nil {
            logger.LogIf(context.Background(), err)
            r.CloseWithError(err)
        }
        close(bw.canClose)
    }()
    return bw
}

写入文件都会通过这个方法,增加bit rot校验。当disk是storageRESTClient时,若文件较大,RPC调用超时,disk.CreateFile会被关闭,返回io: read/write on closed pipe然后被关闭。这时,writer文件还没有写完,再写入也会报同样的错。

可能的解决办法,RPC调用超时依据最后接收数据的时间,而不是总时间,但这样服务器可能被慢的客户端占满。还是应该在内网上部署,网速不应该是问题,不然随便传个文件也要半天。

相关文章

网友评论

      本文标题:minio的几个issue

      本文链接:https://www.haomeiwen.com/subject/lihufxtx.html