Minio原理分析

1 Minio分布式存储原理

MinIO是一款自称是高性能,分布式对象存储服务器的软件,在MinIO的设计中,每个MinIO服务器都是相互独立的节点,共同存储对象数据,MinIO采用分布式架构,并将这些节点联合起来形成一个集群,以便更好的负载均衡,提高性能和可伸缩性,是一个去中心化的设计。

MinIO在分布式存储实现中引入了一种可扩展哈希表数据结构,其具有很好的可扩展性和动态伸缩性,同时还能够支持高并发读取和写入操作。当一个新对象存储到MinIO集群中时,MinIO节点会根据哈希函数计算出该对象的存储地址,对该对象进行切分和编码,然后将切分片段和冗余因子存储在不同的MinIO节点上。

MinIO集群中的所有节点通过一致性哈希(Consistent Hashing)算法实现数据的负载均衡与故障恢复。一致性哈希算法是一种用于动态增删节点的分布式哈希算法,它能保证极高的数据迁移效率。

具体的处理流程如下:

  1. 通过哈希函数计算出对象的存储节点。

  2. 将对象切分为多个数据块,并通过Reed-Solomon纠删码技术编码,生成校验块。

  3. 将数据块和校验块按块组合的方式存储在各个节点中。

  4. 在对象读取时,根据哈希函数计算出对象对应的节点地址,到该节点地址所在的MinIO节点上读取数据。

  5. 如果某个MinIO节点出现故障,那么它上面的数据就会自动迁移到其他存储节点上,从而保证数据的高可用性和冗余机制。

通过以上的数据分片和分散,保证了数据安全、高可用性、高负载均衡和高读写性能等多方面的需求。

Minio数据一致性问题,是通过dsync分布式锁管理器解决的:

  • 任何一个节点的锁请求都会广播给集群内的所有在线节点
  • 如果收到N/2+1个节点的同意,则获取所成功
  • 通过stale lock检测机制,判断节点的状态及持有锁情况

2 Minio对象存储和元数据

MinIO是一款对象存储服务器,主要用于存储非结构化的数据,例如各种类型的文件等。在存储对象的同时,MinIO还会生成对象的元数据,用于描述对象的基本信息。

在MinIO中,每个对象都有一个唯一的对象名(Object Name),类似于文件系统中的文件名。而Bucket则用于组织和管理对象,相当于文件系统中的目录。

除了Object Name和Bucket,每个对象还有一些其他的元数据,包括对象大小、对象的创建和修改时间、对象的MIME type等。这些元数据可以在创建对象时一并设置,也可以通过修改元数据接口进行修改。另外MinIO还支持自定义元数据,用户可以通过配置存储策略来自动添加自定义元数据。

MinIO的元数据存储采用了键-值(key-value)的存储方式,并且将元数据存储在一个扁平的键值对集合中,其中键值对可以表示出对象所属的Bucket和Object。元数据存储使用了etcd这样的轻量级分布式键值存储系统,确保元数据的高可靠性和实时更新,同时也保证了元数据的高效读写。

除了以上的元数据,MinIO还支持用户在使用过程中自定义一些额外的元数据,例如某个对象的归属者、某个对象的使用权限等等。这些元数据分别对应不同的系统配置,有利于实现更加复杂的对象访问控制、元数据管理以及其他高级功能,如利用元数据来实现搜索等功能。

综上所述,MinIO提供了完善的对象存储和元数据管理机制,帮助用户高效存储和管理大量的非结构化数据,并支持自定义元数据来实现更加复杂的业务需求。

3 Minio纠删码

MinIO是一个基于对象存储的开源云存储服务。纠删码是MinIO用于数据容错的关键技术之一。

纠删码是一种冗余数据存储技术,可以将原始数据切分成多个片段,并计算出若干冗余数据进行存储。当部分数据片段损坏或者丢失时,通过计算冗余数据,可以恢复出原始数据。

MinIO的纠删码实现采用了Reed-Solomon纠删码算法。Reed-Solomon算法通过布洛赫乘法(Blomberger Multiplication)在有限域上进行计算,将原始数据切分成若干个数据块(Data Block),并计算出若干个校验块(Parity Block)进行冗余存储。具体步骤如下:

  1. 将原始数据划分为多个数据块。

  2. 计算出若干校验块。

  3. 将所有数据块和校验块按顺序拼接成一个大的数据块,并对其进行编码。

  4. 对编码后的数据块进行切分,得到多个“条带”(Stripe)。

  5. 在实际存储时,将每个条带拆分为若干数据块和校验块,并在不同的存储节点上进行存储。具体方式可以采用多个存储节点进行副本存储、通过容错码实现块的冗余存储等。

  6. 当数据损坏或丢失时,通过计算校验块进行数据恢复。

MinIO中的Reed-Solomon实现比较高效,通常情况下只需要4-6个校验块就可以实现数据冗余,极大提高了数据的容错能力。同时,在存储大文件时,MinIO会自动将文件切分成若干个条带,可以充分利用存储节点的存储带宽和磁盘读写能力。

4 Minio权限控制策略

MinIO提供了细粒度的权限控制策略,方便管理员根据需要对存储桶、对象和目录设置各项权限。

MinIO权限控制采用AWS S3的访问策略来设置权限。一个访问策略是一个JSON格式的文本,描述了用户或者群组能够对MinIO上的哪些资源进行哪些操作。

下面是一个权限控制示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":["s3:ListBucket"],
"Resource":["arn:aws:s3:::mybucket"]
},
{
"Effect":"Allow",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::mybucket/myfolder/*"]
}
]
}

本示例中,权限控制规则包括两项:允许用户列出 mybucket 里面的内容;允许用户读取 mybucket/myfolder 文件夹下的所有对象。

下面是一个常见的权限控制策略的代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::my-bucket"
],
"Principal": "*",
"Condition": {}
},
{
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::my-bucket/my-folder/*"
],
"Principal": {
"AWS": [
"arn:aws:iam::123456789012:user/username",
"arn:aws:iam::123456789012:role/rolename"
]
},
"Condition": {}
}
]
}

本策略允许任何人进行 my-bucket 存储桶的读和列出操作,允许指定的用户或角色进行 my-bucket/my-folder 存储桶下文件夹中的对象的读和写操作。

除了上述的简单设置外,MinIO还支持更加复杂的权限控制规则,例如基于 IP 地址、时间戳、Requester、Referer 来限制访问等等。

总之,MinIO提供了完善而细致的权限控制策略,可以根据业务需要灵活设置,同时也支持更加高级的权限控制方式的实现。


Minio原理分析
http://www.zivjie.cn/2023/05/14/中间件/minio/Minio原理分析/
作者
Francis
发布于
2023年5月14日
许可协议