Minio原理分析
1 Minio分布式存储原理
MinIO是一款自称是高性能,分布式对象存储服务器的软件,在MinIO的设计中,每个MinIO服务器都是相互独立的节点,共同存储对象数据,MinIO采用分布式架构,并将这些节点联合起来形成一个集群,以便更好的负载均衡,提高性能和可伸缩性,是一个去中心化的设计。
MinIO在分布式存储实现中引入了一种可扩展哈希表数据结构,其具有很好的可扩展性和动态伸缩性,同时还能够支持高并发读取和写入操作。当一个新对象存储到MinIO集群中时,MinIO节点会根据哈希函数计算出该对象的存储地址,对该对象进行切分和编码,然后将切分片段和冗余因子存储在不同的MinIO节点上。
MinIO集群中的所有节点通过一致性哈希(Consistent Hashing)算法实现数据的负载均衡与故障恢复。一致性哈希算法是一种用于动态增删节点的分布式哈希算法,它能保证极高的数据迁移效率。
具体的处理流程如下:
通过哈希函数计算出对象的存储节点。
将对象切分为多个数据块,并通过Reed-Solomon纠删码技术编码,生成校验块。
将数据块和校验块按块组合的方式存储在各个节点中。
在对象读取时,根据哈希函数计算出对象对应的节点地址,到该节点地址所在的MinIO节点上读取数据。
如果某个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)进行冗余存储。具体步骤如下:
将原始数据划分为多个数据块。
计算出若干校验块。
将所有数据块和校验块按顺序拼接成一个大的数据块,并对其进行编码。
对编码后的数据块进行切分,得到多个“条带”(Stripe)。
在实际存储时,将每个条带拆分为若干数据块和校验块,并在不同的存储节点上进行存储。具体方式可以采用多个存储节点进行副本存储、通过容错码实现块的冗余存储等。
当数据损坏或丢失时,通过计算校验块进行数据恢复。
MinIO中的Reed-Solomon实现比较高效,通常情况下只需要4-6个校验块就可以实现数据冗余,极大提高了数据的容错能力。同时,在存储大文件时,MinIO会自动将文件切分成若干个条带,可以充分利用存储节点的存储带宽和磁盘读写能力。
4 Minio权限控制策略
MinIO提供了细粒度的权限控制策略,方便管理员根据需要对存储桶、对象和目录设置各项权限。
MinIO权限控制采用AWS S3的访问策略来设置权限。一个访问策略是一个JSON格式的文本,描述了用户或者群组能够对MinIO上的哪些资源进行哪些操作。
下面是一个权限控制示例:
1 | |
本示例中,权限控制规则包括两项:允许用户列出 mybucket 里面的内容;允许用户读取 mybucket/myfolder 文件夹下的所有对象。
下面是一个常见的权限控制策略的代码示例:
1 | |
本策略允许任何人进行 my-bucket 存储桶的读和列出操作,允许指定的用户或角色进行 my-bucket/my-folder 存储桶下文件夹中的对象的读和写操作。
除了上述的简单设置外,MinIO还支持更加复杂的权限控制规则,例如基于 IP 地址、时间戳、Requester、Referer 来限制访问等等。
总之,MinIO提供了完善而细致的权限控制策略,可以根据业务需要灵活设置,同时也支持更加高级的权限控制方式的实现。