文章目录
1. 概述
1.1 背景
文件存储服务主要用于管理和存储大量文件资源,具有以下功能和特点:
- 存储管理:文件存储服务系统提供高效的存储管理功能,能够安全地存储和组织各种类型的文件。用户可以轻松上传、下载和删除文件,并能通过文件夹和标签等方式进行分类和组织。
- 数据同步和备份:该系统支持数据同步和备份功能,确保用户的数据在多个存储节点之间保持一致性,并提供数据冗余和备份策略,以防止数据丢失或损坏。
- 访问控制和权限管理:文件存储服务系统提供灵活的访问控制和权限管理机制,使用户能够控制文件的访问权限。管理员可以设置不同的权限级别,并为特定用户或用户组分配适当的访问权限,从而确保文件的安全性和机密性。
- 文件分享和协作:用户可以方便地共享文件给他人,实现团队内外的协作和文件交流。该系统提供链接共享和访问密码等方式,确保文件在被授权的范围内被访问和编辑。
- 扩展性和可靠性:该系统通常具备良好的扩展性和可靠性,能够应对大规模数据存储和高并发访问的需求。
1.2 分类
分类维度 | 类型一 | 类型二 | 类型三 |
---|---|---|---|
存储形态 | 块存储:以物理块为单位进行存储,如windows系统的c盘。 优点:适用于需要高性能的场景,如数据库。 缺点:太过于底层,不利扩展,不可以被共享。 | 文件存储:以文件为单位进行存储,如D:\Users\Desktop\1.txt 优点:适用于需要共享文件和对数据进行一定的高级管理的场景 缺点:读写速度比较慢 | 对象存储:以对象为单位进行存储 优点:适用于需要海量数据的存储、管理和访问的场景,如海量视频、图像、文件等。 |
存储架构 | DAS(Direct AttachSTorage):直联式存储,指将存储设备通过SCSI接口或光纤通道直接连接到一台计算机上。 | SAN(Storage Area Network):存储区域网络,独立于数据网络的单独的存储网络,SAN可以将存储和服务器隔离,简化了存储管理。 | NAS(Network Attached Storage):网络附属存储系统,就是连接在网络上,具备资料存储功能的文件服务器。它以数据为中心,将存储设备与服务器彻底分离,集中管理数据。 |
2. MinIO-高性能分布式云存储
2.1 简介
MinIO是为海量数据存储、人工智能、大数据分析而设计的高性能对象存储系统,单个对象最大可达5TB,适合存储海量图片、视频、日志文件、备份数据等。MinIO主要采用Golang语言实现,整个系统都运行在操作系统的用户态空间,客户端与存储服务器之间采用HTTP/HTTPS通信协议。
https://www.minio.org.cn/
PS:对于中小型企业,如果不选择存储上云,Minio是个不错的选择,麻雀虽小,五脏俱全。在国内,阿里巴巴、腾讯、百度、中国联通、华为、中国移动等9000多家企业都在使用MinIO产品。
2.2 设计原则
性能 | 高度重视性能,MinIO对象存储可作为云原生应用的第一存储。 |
---|---|
扩展性 | MinIO带来了一个简单的扩展模型。通过联盟模式,可以无穷扩展。 |
分散性 | 想要超扩展的核心是存储与计算相分离这个概念,这种架构可带来更高的性能、容量、I/0。 |
简单性 | 极简主义是MinIO设计的指导原则。 |
Amazon S3兼容 | Amazon S3 API是对象存储世界的事实标准。从诞生的早期,MinIO就是支持S3API,并且是最早支持S3 Select的。 |
2.3 基础概念
- Object:存储到Minio的基本对象,如文件、图片、字节流,Anything…
- Bucket:用来存储Object的逻辑空间,每个Bucket之间的数据是是相互隔离的,对于客户端而
言,就相当于一个存放文件的顶层文件夹。
- Drive: Drive可以被理解为一块磁盘,用于存储数据。在Minio启动时,可以以参数的方式指定Drive,所有在Minio中的对象都会存储在Drive里。
# 启动minio server服务,指定数据存储目录/mnt/data
./minio server /mnt/data
- Set:Set是一组Drive的集合,在分布式部署Minio时,系统会根据集群规模自动划分一个或多个Set,每个Set中的Drive分布在不同的位置。例如,如果集群规模为1到64,它会划分为4个Set,每个Set的大小为16。
一个对象存储在一个Set上;
一个集群划分为多个Set;
一个Set包含的Drive数量是固定的,默认由系统根据集群规模自动计算得出;
Set和Drive的关系可以理解为:
一个集群被划分为多个Set,每个Set又包含了若干块Drive,而对象则被存储在这些Drive中。这种设计使得Minio能够适应大规模的存储需求,同时也提高了数据的可靠性和冗余性。
2.4 技术架构
2.4.1 数据组织结构
传统NAS(网络附属文件存储系统)将整个存储资源组织为目录树的形式,如下图1:
与此不同,对象存储系统把存储资源组织为租户-桶-对象的形式,数据结构组织见下图2:
租户:用于隔离存储资源。在租户之下可以建立桶、存储对象。
桶:是若干个对象的逻辑抽象,是盛装对象的容器。
对象:类似于hash表中的表项:它的名字相当于关键字,它的内容相当于“值”。
用户:在租户下面创建的用于访问不同桶的账号,可以使用MinIO提供的mc命令设置不用用户访问各个桶的权限。
2.4.2 数据存储方案
-
A:去中心化架构
MinIO采用去中心化的无共享架构,对象数据被打散存放在不同节点的多块硬盘,对外提供统一命名空间访问。 一方面,提高系统可靠性和可用性,因为数据分布在多个节点上,即使某个节点出现故障,也不会影响整个系统的运行。另一方面,通过Nginx在各服务器之间实现负载均衡,可以确保所有节点的负载相对均衡,避免了部分节点过载的情况发生。
-
B:统一命名空间
MinIO对象存储服务主要有两种部署方式,一种是本地分布式集群部署,另一种是联盟模式部署。本地分布式集群部署方式即在多个本地服务器节点部署MinIO服务,将其组件成单套分布式存储集群,并提供统一命名空间和标准S3访问接口。联盟部署模式将不同地理位置或不同数据中心的多个MinIO服务器组合成一个统一的全局命名空间,在逻辑上组成一个联盟,对外以一个整体提供服务,显著提升数据的可用性和容错性。
如下图所示,4个服务器节点组成一个MinIO集群,每个服务器节点中会选择相同数据的硬盘创建一个纠删组,某个桶的数据会根据MinIO的分布式算法,切片分散存储到对应的纠删组中(详见纠删码相关内容)。
2.4.3 纠删码策略
一般上我们如果要保证数据高可用,主流的有两种策略:
多副本(Replication)策略:实打实的复制,常见的是三副本,意味着现实世界有三份一模一样的数据。存储代价较高,但如果一个副本挂了,可以马上切到另外一个,漂移时间非常短,N副本存储效率永远是1/N。
纠删码(Erasure Code)策略:纠删码是一种恢复丢失和损坏数据的数学算法, Minio采用RS-Code将对象拆分成N/2数据块和N/2奇偶校验块。也就是如果有任意小于等于N/2份的数据失效,仍然能通过剩下的数据还原出来。
在同一集群内,MinIO会自动生成若干纠删组,用于存放桶数据。一个纠删组中的一定数量的磁盘发生的故障,通过纠删码算法可以恢复出正确的数据。MinIO存储对象数据时,首先把它生成若干等长的片段(默认按5MB切片),然后每一个片段会纠删算法分成若干分片,包括数据分片与校验分片,每个分片放置在一个纠删组的某个节点上。
2.4.4 部署模式
a、单主机 - 普通模式
在此启动模式下,对于每一份对象数据,minio直接在data下面存储这份数据,不会建立副本,也不会启用纠删码机制。因此,这种模式无论是服务实例还是磁盘都是"单点",无任何高可用保障,磁盘损坏就表示数据丢失。
# 基于二进制
wget -q http://dl.minio.org.cn/server/minio/release/linux-amd64/minio
chmod +x minio
./minio server --console-address ":50000" /mnt/data
# 启动minio server服务,指定数据存储目录/mnt/data,通过--console-address ":port"指定静态端口
# 基于docker
docker run -p 9000:9000 --name minio \
-v /mnt/data:/data \
-v /mnt/config:/root/.minio \
minio/minio server /data
存在问题: 浏览器无法访问minio控制台,因为没有对外暴露控制台端口
对外暴露minio控制台的端口,通过--console-address ":50000"指定控制台端口为静态端口
docker run -d -p 9000:9000 -p 50000:50000 --name minio \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=12345678" \
-v /mnt/data:/data \
-v /mnt/config:/root/.minio \
minio/minio server --console-address ":50000" /data
b、单主机 - 纠删码模式
此模式为minio server实例传入多个本地磁盘参数。一旦多于一个磁盘参数,minioserver会自动启用纠删码模式。该模式对磁盘个数至少为4个,如不满足要求,实例启动将失败。
docker run -d -p 9000:9000 -p 50000:50000 --name minio \
-v /mnt/data1:/data1 \
-v /mnt/data2:/data2 \
-v /mnt/data3:/data3 \
-v /mnt/data4:/data4 \
-v /mnt/data5:/data5 \
-v /mnt/data6:/data6 \
-v /mnt/data7:/data7 \
-v /mnt/data8:/data8 \
minio/minio server /data{1...8} --console-address ":50000"
c、多主机 - 分布式模式
该模式是Minio服务最常用的架构,通过共享一个access_key和secret_key,在多台服务器上搭建服务,且数据分散在多块(大于4块,无上限)磁盘上,提供了较为强大的数据冗余机制(Reed-Solomon纠删码)。
以8个节点,每节点1块盘为例:启动分布式Minio实例,8个节点,每节点1块盘,需要在8个节点上都运行下面的命令:
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=12345678
minio server http://192.168.1.11/export1 http://192.168.1.12/export2 \
http://192.168.1.13/export3 http://192.168.1.14/export4 \
http://192.168.1.15/export5 http://192.168.1.16/export6 \
http://192.168.1.17/export7 http://192.168.1.18/export