MinIo跟对象存储服务
# MinIo跟对象存储服务
# 存储服务的类型
我们进行数据存储的时候,主要有三种不同的技术选型,分别对应了文件存储、块存储和对象存储。他们有独立的应用场景以及所构建出来的上层的应用。
文件存储,它是一个统称的概念。因为从使用者的角度来说,无论是对象存储还是块存储,它们最终展现出来的其实都是一个一个的文件。虽然我们看到的展现的样式是一样的,但是底层的逻辑却非常的不同。
说起文件式的存储,其实最著名的产品就是我们常说的FTP,NFS或者是NAS。
# 文件存储
文件存储:它是站在使用者角度来说,我们构建的是一个文件。在咱们进行数据保存的时候,你传一个文件在咱们的硬盘上,它就有一个这样的文件的存储单位。所以文件是在咱们进行数据存储时的一个基本的单位,它主要面对的是,比如说常见的FTP文件传输协议,还有NFS我们的网络文件系统。
# 块存储
块存储咱们相对就比较陌生了。其实块存储它是一种相对底层的存储的机制
。要知道无论是我们的硬盘也好,还是SSD也好,它在进行数据保存的时候,我们都是块儿一块的,以固定块来进行的存储。那你比如说在咱们机械硬盘上有扇区,对吧?这不就是1块1块的吗?每一块都有固定的大小,那么这个块存储更多的是表达咱们这个存储的方式。
我们创建了文件系统以后,在将一个文件通过操作系统写入到磁盘上的时候,它实际上是被打散到了
多个不同的数据块
来进行保存的,这就是我们说到的块存储,你可以把它看成是一个更为基础的存储单元。有些人也说,其实块存储也是一种文件存储。
# mysql中的存储是哪种
MySQL的数据存储本质上属于文件存储,但其具体实现依赖于存储引擎(如InnoDB、MyISAM)。以下是关键点:
- 文件系统存储:
- MySQL将数据、索引和日志存储在文件系统中。例如:
- InnoDB:数据存储在
.ibd
文件中,索引与数据一起存储(聚簇索引)。 - MyISAM:数据存储在
.MYD
文件中,索引存储在.MYI
文件中(非聚簇索引)。
- InnoDB:数据存储在
- 数据库文件(如
.frm
)保存表的元数据(结构定义)。
- MySQL将数据、索引和日志存储在文件系统中。例如:
- 存储引擎的作用:
- 存储引擎决定了数据在文件系统中的组织方式(如B+树索引、事务日志等),但最终数据仍以文件形式存储在磁盘上。
那它为什么不是块存储呢?
- 块存储是底层存储技术,直接操作磁盘块(如硬盘分区),通常用于虚拟机磁盘(VMDK)、数据库裸设备等场景。
- MySQL不直接使用块存储,而是通过文件系统(如ext4、NTFS)管理数据文件。即使使用块存储作为底层介质,MySQL仍然以文件形式组织数据。
# 对象存储
对象存储是这几年在云原生和大规模的这种互联网应用下的一个主流的软件产品。这个对象存储,它的一个含义是你在使用的时候,你既不需要关心文件是长什么样子的,也不需要关心数据是存在哪些块上面的。
我们只需要安装这一个叫做对象存储的软件,你把你的文件或者数据,通过咱们对应的相应的软件上传到到这个对象存储上。至于底层怎么存的,存在哪儿,这些细节你都不需要去关心。所以作为这个对象存储,是特别适合大规模的海量数据保存和处理的底层数据如何存储的。
不同的对象存储的软件系统,他们有着自己的规则。其中比较有代表性的就是咱们常说的MinIO。
# 对象存储的特点
- 扁平化结构:数据以“对象”为单位存储,每个对象包含数据、元数据(如名称、大小、时间戳)和唯一标识符(如UUID),没有传统的目录树结构。
- 访问方式:通过RESTful API或专有协议访问,适合大规模分布式存储(如AWS S3、阿里云OSS)。
- 适用场景:海量非结构化数据(图片、视频、日志)和需要高扩展性的场景(如云计算、大数据分析)。
# 存储的核心
对象存储本质上仍然是以字节流的方式进行数据存储的,但它在字节流之上提供了一层更高级别的抽象和管理方式。
其实,无论是哪种存储类型(对象存储、文件存储、块存储),最终数据在磁盘或SSD上保存的形式都是字节流(byte stream)
。
# 对象存储的流程
虽然对象存储底层使用的是字节流,但它不是简单地将字节写入文件系统,而是:
- 封装为对象
一个对象(Object)通常包含三个核心部分:
组成部分 | 描述 |
---|---|
Data(数据) | 实际内容,即字节流(如图片、视频等) |
Metadata(元数据) | 自定义或系统元数据(如Content-Type、标签、权限等) |
Key(唯一标识符) | 对象名称或路径(如 photos/2025/photo1.jpg ) |
例如,当你上传一张图片到 MinIO 或 AWS S3,你实际上是在创建一个对象,它包括:
- 字节流形式的图像内容
- 元数据(如 MIME 类型是 image/jpeg)
- 唯一标识 Key(如 bucket/object-key)
才外,它还有一个特点,那就是对象存储不使用传统的目录树结构(如 /home/user/file.txt
),而是通过唯一的 Key 来定位对象,这使得它可以轻松扩展到 EB 级别数据。
最后总结下,对象存储确实是通过一个系统,将每个数据封装为一个“对象”进行存储。这种存储方式与传统的文件存储和块存储有显著区别。
# 为什么说对象存储比文件存储更高级?
因为对象存储:
- 把字节流封装成对象(Object)
- 提供了统一的访问接口(RESTful API)
- 支持大规模分布式架构
- 支持丰富的元数据管理
- 更容易实现高可用、高并发、跨地域同步
# 安装MinIO
MinIO只是对象存储的一种方案,市面上还有很多方法,除了私人部署的方法,各大互联网厂商还提供了很多云服务,如阿里的对象存储OSS等。
下面展示的只是MinIO的Linux系统中的单机安装方式。它的安装方式还有docker,分布式安装,这里就不展示了。
MinIO的官网 (opens new window)地址如下:
- https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-single-node-single-drive.html#create-the-systemd-service-file
# 安装软件
使用wget
下载最新版本的MinIO(替换为官网 (opens new window)的最新链接):
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/
2
3
在下载时,你可能会发现,他有以下几个版本,RPM (RHEL)、DEB (Debian/Ubuntu)、Binary,其中Binary是编译后的二进制文件,可以直接启动,那RPM和DEB呢,它们是安装文件,安装后,会在系统中创建对应服务。但它们两个该选哪个版本呢?
在下载软件安装包时,选择 RPM(适用于 Red Hat 系列发行版)或 DEB(适用于 Debian/Ubuntu 系列发行版)的格式,主要取决于你使用的 Linux 发行版。
那如何判断你系统是哪种格式呢?
# ERP和DEB
如果你使用的是 Red Hat、CentOS、Fedora 等基于 Red Hat 的发行版,系统默认支持 RPM 格式。验证方法如下:
rpm --version
如果输出版本号(例如 RPM version 4.14.3
),则说明系统支持 RPM。
如果你使用的是 Debian、Ubuntu、Linux Mint 等基于 Debian 的发行版,系统默认支持 DEB 格式。验证方法如下:
dpkg --version
如果输出版本号(例如 dpkg-deb 1.21.9
),则说明系统支持 DEB。
以下是一个帮助快速辨别的表格:
系统类型 | 推荐格式 | 验证命令 | 包管理器 |
---|---|---|---|
Red Hat/CentOS/Fedora | RPM | rpm --version | yum 或 dnf |
Debian/Ubuntu/Linux Mint | DEB | dpkg --version | apt 或 apt-get |
下载完成后,运行安装命令
sudo dnf install minio.rpm
// 或者 以下命令
sudo yum install minio.rpm
2
3
4
# 创建数据存储目录
MinIO的配置文件通常位于 /etc/default/minio
,你需要编辑或创建它:
# 管理员账号和密码(建议设置强密码)
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=minioadmin
# 数据存储目录(确保目录存在且有权限)
MINIO_VOLUMES="/data/minio"
# 监听地址和端口
MINIO_OPTS="--address :9000 --console-address :9001"
2
3
4
5
6
7
8
9
MINIO_VOLUMES
:指定MinIO存储数据的目录(例如/data/minio
),需要提前创建并设置权限。--address :9000
:MinIO服务的API端口。--console-address :9001
:MinIO控制台的Web界面端口。
# 创建服务
创建或编辑MinIO的Systemd服务文件:
在官网的描述中,服务配置文件位于,/usr/lib/systemd/system/minio.service
路径。
[Unit]
Description=MinIO
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
WorkingDirectory=/usr/local
User=minio-user
Group=minio-user
ProtectProc=invisible
EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
# MinIO RELEASE.2023-05-04T21-44-30Z adds support for Type=notify (https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=)
# This may improve systemctl setups where other services use `After=minio.server`
# Uncomment the line to enable the functionality
# Type=notify
# Let systemd restart this service always
Restart=always
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536
# Specifies the maximum number of threads this process can create
TasksMax=infinity
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
# Built for ${project.name}-${project.version} (${project.name})
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
35
36
37
38
39
40
虽然服务文件已自动生成在 /usr/lib/systemd/system/minio.service
路径中了,但建议将其换到/etc/systemd/system/
下。
因为它,优先级更高,systemd
在加载服务时,优先使用 /etc/systemd/system/
下的配置,会覆盖 /usr/lib/
中的默认配置。
sudo cp /usr/lib/systemd/system/minio.service /etc/systemd/system/
sudo systemctl daemon-reload
2
# 重新加载配置
sudo systemctl daemon-reload
# 启动服务
# 启动服务
sudo systemctl start minio
# 检查服务状态
sudo systemctl status minio
2
3
4
如果看到如下输出,恭喜你成功了
● minio.service - MinIO
Loaded: loaded (/etc/systemd/system/minio.service; enabled; vendor preset: disabled)
Active: active (running) since ...
2
3