-
单盘为什么比多盘还慢?
参见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。
能解决上面说到的单盘情况下丢失数据问题,但这会增加耗时,而正常情况下分布式应该是多机房多磁盘的,我觉着没必要做这个改动。
-
大文件或传输慢的情况下报错
参见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调用超时依据最后接收数据的时间,而不是总时间,但这样服务器可能被慢的客户端占满。还是应该在内网上部署,网速不应该是问题,不然随便传个文件也要半天。
网友评论