MinIO文件数量限制 是多少?
前言
很多中国地区的“攻城狮”们和运维专家们有各种担心向我们提问。
MinIO有没有文件数量限制呀?
还有这么问我们的?
为了赚钱,MinIO会不会进行文件数量的限制呀?
先直接回答上面所提的问题:
- MinIO没有文件数量限制。
- MinIO的商业版本和社区版本都没有数量限制。
- 数量没有限制,我们对单文件有容量有限制,单文件可高达5TB(绝大多数场景均够用了吧?)。
MinIO的文件上限我总是担心怎么办?
首先,你有这样的担心很正常。因为,您没有了解过MinIO内核的实现。
在MinIO推荐的配置中有两样非常先进的技术:
- MinIO推荐使用XFS文件系统,并且要求在生产环境必须使用XFS文件系统;
- 分布式EC机制,将文件分散于整个集群;
- key采用无限配额的一致性哈希(Consistent Hashing)算法,保障多服务器key一致。
MinIO为什么推荐使用XFS文件系统?
XFS文件系统的全称是"eXtended File System",它最初由Silicon Graphics公司为IRIX操作系统开发,XFS文件系统在分布式存储中有以下优点:
- 高性能:XFS可以处理大容量数据和大型文件,具有出色的I/O性能,适用于高负载环境。
- 可扩展性:XFS支持动态调整文件系统大小,并可以有效地管理成千上万个文件,适合大规模分布式存储场景。
- 异步IO支持:XFS对异步输入/输出(IO)操作提供了广泛支持,可以在高并发读写访问时提高文件系统的性能。
- 文件系统日志:XFS使用write-ahead logging(WAL)技术,记录文件系统的元数据,可以最小化数据丢失和文件损坏的风险,在故障恢复时加快速度。
- 可靠性:XFS采用许多先进技术保证数据完整性,例如CRC校验,有助于确保数据不会因磁盘或网络错误而受到破坏。
所以,当整个服务器并行连接起来一起为客户提供服务的时候,实际总容量的公式是:
N台服务器的空间总容量 x EC使用率 = 实际使用率
MinIO的分布式EC机制是什么原理?
根据MinIO中国官网的工程师的回复是这样说的: 在MinIO的内核设计中,采用的是里德所罗门矩阵。而任何一个数据上传数据都会被分割成固定大小的块并存储在多个节点上,每个节点负责其中的一部分数据。 因此,单个桶和其中的文件可以非常大,数量也没有限制。
所以,我们使用网页、客户端、SDK或者API上传文件至MinIO时,MinIO将文件切割成固定大小的块,并使用纠删码(Erasure Code)或复制(Replication)机制在集群的不同节点之间进行分布式存储。因此,无论文件的大小如何,都可以方便地存储和管理。
解释如下:
里德-所罗门(Reed-Solomon)码是一种基于矩阵运算的纠删码技术,它可以通过将原始数据编码为多个数据块并添加冗余数据块来实现数据的可靠性和恢复性。
里德-所罗门矩阵是一个MxN的矩阵,其中M表示数据块和冗余块的总数,N表示数据块的数量。矩阵中的每个元素都是一个有限域上的数值,通常使用二进制、GF(2^8)等方式进行表示。在里德-所罗门编码中,这个矩阵用来将原始数据块转换为一组多项式,并计算出相应的冗余块,以提供容错和纠错能力。
一致性哈希(Consistent Hashing)算法
MinIO内部生成唯一的key使用的一致性hash算法。在MinIO源代码目录的cmd/object-api-utils.go 文件中,有关于objectName验证的代码
// additionally minio does not support object names with trailing SlashSeparator.
func IsValidObjectName(object string) bool {
if len(object) == 0 {
return false
}
if HasSuffix(object, SlashSeparator) {
return false
}
return IsValidObjectPrefix(object)
}
// IsValidObjectPrefix verifies whether the prefix is a valid object name.
// Its valid to have a empty prefix.
func IsValidObjectPrefix(object string) bool {
if hasBadPathComponent(object) {
return false
}
if !utf8.ValidString(object) {
return false
}
if strings.Contains(object, `//`) {
return false
}
// This is valid for AWS S3 but it will never
// work with file systems, we will reject here
// to return object name invalid rather than
// a cryptic error from the file system.
return !strings.ContainsRune(object, 0)
}
我们可以看到,他内部使用的是:
// getSHA256Hash returns SHA-256 hash in hex encoding of given data.
func getSHA256Hash(data []byte) string {
return hex.EncodeToString(getSHA256Sum(data))
}
通过上述代码可以判断出,MinIO的文件的key的数量几乎是无限的,可以轻松达到千亿级别。
总结
通过这个文章,深入原理,让我们知道了MinIO的文件是没有数量限制的。单个MinIO Bucket可以轻松达到千亿级别的文件数量。
你也可以向MinIO中国 https://www.minio.org.cn/提出更多的技术问题,我们很乐意在中国地区为大家解答。