1、什么是对象存储?
描述: 对象存储(Object Storage)是一种存储数据的计算机体系结构,它以对象的形式存储和管理数据。与传统的文件系统和块存储不同,对象存储将数据作为对象存储在分布式的存储集群中,每个对象都有一个唯一的标识符(通常是一个URL),并且可以通过这个标识符来访问和检索数据。
「对象存储特点」:
弹性扩展:对象存储可以轻松地扩展存储容量,无需中断服务或重新配置硬件。通过添加更多的存储节点,可以实现无限的存储能力。
高可靠性:对象存储采用分布式存储架构,数据在多个存储节点上进行冗余备份,以保证数据的可靠性和持久性。
高性能:对象存储可以提供高并发的数据读写操作,通过并行处理和负载均衡技术,实现快速的数据访问。
数据管理:对象存储可以对数据进行元数据管理,可以为每个对象添加自定义的元数据信息,方便对数据进行分类、搜索和管理。
访问控制:对象存储可以实现灵活的访问控制策略,可以根据需要设置不同的权限和访问策略,确保数据的安全性和隐私性。
对象存储广泛用于云存储、大数据分析、备份和恢复、多媒体内容存储等场景,它提供了高度可靠、高性能、可扩展和经济高效的数据存储解决方案。
2、为什么需要对象存储?
描述:在互联网越来越普及的当下,各种 APP 如雨后春笋。用户通过 APP 可以进行远程办公、查看新闻咨询、理财、社交、教育等等。在上面这些场景中,避免不了需要查看图片、音频、视频。那么问题来了?这些图片、视频、音频是怎样的存储的呢?
传统开发中,我们可以使用 tomcat 类似的服务器进行映射目录实现资源访问(在 server.xml 文件中进行配置)
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
<!-- 增加的静态资源映射配置 -->
<Context path="/static" docBase="/usr/local/app/html/" reloadable="true" crossContext="true"></Context>
</Host>
也可以使用 nginx 对静态资源进行代理
server {
listen 8080;
server_name localhost;
# charset koi8-r;
# access_log logs/host.access.log main;
location / {
root html; # 代理 html 目录
index index.html index.htm;
}
}
随着 APP 用户量的增加,服务器需要存储海量的图片、音频和视频。此时,再使用上面方式就显得不足了。当然,如果资金充足,可以购买成熟对象存储服务产品,例如:阿里云对象存储 OSS(Object Storage Service)。如果不想购买存储服务产品,则可以自己搭建对象存储服务,MinIO 就是你当下最好的选择。
3、什么是 MinIO 对象存储?
描述: Minio 是由 GlusterFS 创始人之一的 Anand Babu Periasamy 发布新的开源项目, MinIO 是一种对象存储解决方案,它是一个基于 Go 语言 (跨平台运行)的开源的对象存储系统,专门设计用于云原生和容器化环境,或者部署在任何地方而构建 公共云或私有云、裸机基础架构、编排环境和边缘基础架构。
Minio 提供与亚马逊云科技 S3 兼容的 API,并支持所有核心 S3 功能, 所以也可以看做是S3的开源版本;它允许用户通过简单的 API 接口进行数据的存储和检索,同时提供高度可扩展性和强大的数据保护机制。
MinIo主要是在微服务系统中使用,非常适合于存储大容量非结构化的数据,例如 图片、视频、日志文件、备份数据和容器/虚拟机 镜像等,而一个对象文件可以是任意大小,从几 kb 到最大 5T 不等,并且其安装配置简单,单行命令可以运行起来; 也可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。
【相关概念】:
❝存储桶(Bucket)是对象的载体,可理解为存放对象的 “容器”,且该 “容器” 无容量上限,对象以扁平化结构存放在存储桶中,无文件夹和目录的概念,用户可选择将对象存放到单个或多个存储桶中不能单独存在。❞
❝对象(Object)是对象存储的基本单元,可理解为任何格式类型的数据,例如图片、文档和音视频文件等。存储桶(Bucket)是对象的载体,每个存储桶可容纳任意数量的对象。❞
# 每个对象都由对象键(ObjectKey)、对象值(Value)、和对象元数据(Metadata)组成。
* 对象键(ObjectKey):对象键是对象在存储桶中的唯一标识,可以通俗的理解为文件路径。
* 对象值(Value):即上传的对象本身,可以通俗的理解为文件内容(Object Content)。
* 对象元数据(Metadata):是一组键值对,可以通俗的理解为文件的属性,例如:文件的修改时间、存储类型等,您可以在上传对象后对其进行查询。
4、MinIO 对象存储有何特点 ?
描述:MinIO 对象存储特点如下所示:
高可用性:MinIO 支持分布式部署,可以在多个节点上实现数据冗余和负载均衡,从而提供高可用性和容错能力。
高性能:MinIO 的设计目标是提供快速的数据访问速度。它采用了高度优化的底层存储引擎,并且支持并行读写操作,以满足大规模数据访问的需求。
可扩展性:MinIO 可以根据实际需求进行水平扩展,用户可以根据数据量的增长来增加节点数量,从而实现存储容量和性能的扩展。
数据保护:MinIO 提供了多种数据保护机制,包括数据加密、数据完整性校验和故障恢复等。用户可以根据需要选择适当的保护机制来保障数据的安全性和可靠性。
兼容性:MinIO 兼容 Amazon S3 云存储服务(AWS Signature v2 和 v4) API,这意味着用户可以直接使用现有的 S3 工具和应用程序与 MinIO 进行集成,而无需进行修改。
总之,MinIO 是一个功能强大且易于使用的对象存储系统,适用于各种规模的数据存储和访问需求, 它的开源性质使得用户可以自由地定制和扩展系统,满足特定的业务需求。
5、Minio 安装配置
描述: 下述部署操作都是基于单节点Minio且由于处于演示的目录,只采用了一块网络存储卷,若要在中大型的生产环境中,请准备至少4块存储硬盘
Docker 方式部署
首先,创建持久化的目录,打开 Shell 执行 mkdir -vp /app/minio/{data,config} 即可。
$ mount -l
# 挂载 NFS 时关键参数 vers=4
192.168.1.94:/volume1/storage/ on /app type nfs (rw,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,nolock,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.1.94,mountvers=4,mountport=892,mountproto=udp,local_lock=all,addr=192.168.1.94)
docker run -d -p 9000:9000 -p 9001:9001 --name minio-server \
-e "MINIO_ROOT_USER=minioadmin" -e "MINIO_ROOT_PASSWORD=weiyigeek.top" \
-v /app/minio/data:/data -v /app/minio/config:/config \
--restart=always \
quay.io/minio/minio:RELEASE.2023-10-07T15-07-38Z server /data --config-dir=/config --console-address ":9001" --address ":9090"
通过 Docker-compose 方式, 首先创建 docker-compose.yml 文件
tee docker-compose.yml <<'EOF'
version: '3'
services:
minio:
container_name: minio
image: quay.io/minio/minio:RELEASE.2023-10-07T15-07-38Z
restart: always
command: server /data --config-dir=/config --console-address ":9001" --address ":9090"
ports:
- 9000:9000
- 9001:9001
volumes:
- /app/minio/data:/data
- /app/minio/config:/root/.minio
environment:
- MINIO_ROOT_USER: admin
- MINIO_ROOT_PASSWORD: weiyigeek.top
- MINIO_SERVER_URL: https://minio.weiyigeek.top
- MINIO_BROWSER_REDIRECT_URL: https://minio.weiyigeek.top/admin/
- MINIO_BROWSER_SESSION_DURATION: 30m
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
EOF
# 参数&环境变量浅析
--address :指定 minio 监控地址
--console-address :指定 minio console 监控地址
MINIO_ROOT_USER:Minio Console 管理账号
MINIO_ROOT_PASSWORD : Minio Console 管理密码
MINIO_SERVER_URL : 存储桶资源访问路径
MINIO_BROWSER_REDIRECT_URL :Minio Console 管理域名地址
MINIO_BROWSER_SESSION_DURATION :Minio Console 管理页面认证失效时间
# 启动与创建容器
docker-compose up -d
温馨提示: MinIO 可使用纠删码(erasure code)和校验和(check sum)来保护数据免受硬件故障和无声数据损坏, 即便您丢失一半数量(N/2)的硬盘,您仍然可以恢复数据,但是你可能需要准备4块以上的硬盘,分别挂载到minio server服务器中。
# 纠删码限制 (多块硬盘 / 服务)
最大驱动器数量 Unlimited
最小驱动器数量 Unlimited
读仲裁 N / 2
写仲裁 N / 2+1
# 示例演示
$ mkfs.xfs /dev/sdb -L DISK1
$ mkfs.xfs /dev/sdc -L DISK2
$ mkfs.xfs /dev/sdd -L DISK3
$ mkfs.xfs /dev/sde -L DISK4
$ nano /etc/fstab
# <file system> <mount point> <type> <options> <dump> <pass>
LABEL=DISK1 /mnt/disk1 xfs defaults,noatime 0 2
LABEL=DISK2 /mnt/disk2 xfs defaults,noatime 0 2
LABEL=DISK3 /mnt/disk3 xfs defaults,noatime 0 2
LABEL=DISK4 /mnt/disk4 xfs defaults,noatime 0 2
docker run -p 9000:9000 -p 9001:9001 --name minio \
-v /mnt/disk1:/disk1 \
-v /mnt/disk2:/disk2 \
-v /mnt/disk3:/disk3 \
-v /mnt/disk4:/disk4 \
minio/minio server /disk1 /disk2 /disk3 /disk4 --console-address ":9001" --address ":9090"