美文网首页
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