MinIO是基于Apache License v2.0开源协议的对象存储服务,它兼容Amazon S3云存储服务的API。其支持部署到公有云或私有云(“混合”云)、裸机基础架构、编排环境和边缘基础架构上。
MinIO是建立在云原生的基础上的高性能对象存储,支持分布式、共享存储、身份和访问管理等功能。旨在多租户环境中以可持续的方式进行扩展的对象存储服务,非常适合存储大容量非结构化数据,如:图片、日志文件、视频、备份数据、容器/虚拟机镜像等。
1、基本介绍
1.1 MinIO原理
MinIO采用去中心化的无共享架构,将对象分片打散之后放在不同节点的多块硬盘上,对外提供统一命名空间访问,实现数据的高可用和容错性;通过负载均衡或者DNS轮询的方式在各节点之间实现负载均衡,各节点之间通过rest和RPC去通信,任何节点宕机都不会影响整个集群节点之间的通信。
1.2 分布式锁管理
MinIO的客户端在读取一个对象时,另一个客户端可能正在修改这个对象,因此也存在数据一致性问题。为了解决这个问题,MinIO专门设计实现了dsync分布式锁管理器,控制数据一致性。
1)任何一个节点的锁请求都会广播给集群内的所有在线的节点
2)如果有N/2+1各节点同意,则获取成功
3)没有主节点,每个节点互相对象,节点之间使用stable lock判断节点的状态及持有锁情况
4)其最多支持32个节点,无法避免锁丢失的场景
1.3 MinIO特点
MioIO特点如下:
(1)MinIO有良好的存储机制
Minio对象存储系统把存储资源组织为租户-桶-对象的形式
- 对象:类似于hash表中的表xiang表项,名字是关键字,内容相当于值
- 桶:是若干个对象的逻辑抽象,是盛装对象的容器
- 租户:用于隔离存储资源。在租户下可以建立桶、存储对象
- 用户:在租户下面创建的用于访问不同桶的账号。可以使用minio提供的mc命令设置不同用户访问各个桶的权限
(2)MinIO有良好的纠删码算法、擦除编码算法,RS code编码数据恢复原理
MinIO使用纠删码和校验和可以容忍部署中多达一半的驱动器或者几点丢失,同时保持对对象的读取访问权限(“读取仲裁”)。Minio采用Reed-solomon code将对象拆分成N/2数据和N/2奇偶检验快,这就意味着如果是12块盘,一个对象将会被分成6个数据块、6个奇偶检验快,可以丢失任意6块盘(不管存放的数据快还是奇偶检验快),让然可以从剩下的盘中的数据恢复。
(3)MinIO提供存储桶级粒度,并支持同步和近同步复制
(4)具有良好的数据安全保护机制
MinIO通过最高级的加密以及广泛的优化提供更多功能,这些优化几乎消除了与存储加密操作相关的开销。MinIO在存储在磁盘上或者网络传输时对数据进行加密,其支持现代行业标准加密算法(例如 AES-256-GCM、ChaCha20-Poly1305 和 AES-CBC)进行粒度对象级加密。
(5)具有自动化数据管理界面
MinIO 控制台提供了一个直观的设计,具有与 API 和 CLI 相同的扩展功能。 MinIO 控制台专为满足 IT 管理员和审计员的需求而设计,提供了一个简单、直观的界面,可用于访问存储套件的最高级功能。 它旨在支持大规模部署,使用户能够提供多租户对象存储即服务、直观地检查系统的健康状况。
(6)MinIO兼容Amason S3
S3兼容云原生应用程序的硬性要求,而MinIO是测试和实施最广泛的AWS S3替代方案。
(7)存储桶和对象不变性
MinIO 支持完整的功能范围,包括对象锁定、保留、法律保留、治理和合规性,存储桶和对象不变性已通过 Veeam 认证和验证。
2、MinIO安装
2.1 Docker
docker run -p port:port \
--name minio1 \
-v /mnt/data:/data \
-e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE" \
-e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \
minio/minio server /data
# 命令详解
# -e MINIO_ROOT_USER 指定用户名
# -e MINIO_ROOT_PASSWORD 指定密码
# -v 挂载目录,持久化minio目录
2.2 Linux
# 下载
wget https://dl.min.io/server/minio/release/linux-amd64/minio
# 加权
chmod +x minio
# 启动 你可以更换后面的目录为你自己需要的目录
./minio server /data (默认端口9000)
问题(1):
指定用户名和密码(不指定也可以访问,但是最好还是改了,AK和SK)
export MINIO_ROOT_USER=
export MINIO_ROOT_PASSWORD=
问题(2):
指定web端口(配置通过网页访问的地址及端口,也可忽略不配置)
./minio server --address 'ip:port' --console-address 'ip:port' /data
2.3 windows
# 下载
http://dl.minio.org.cn/server/minio/release/windows-amd64/minio.exe
# 启动
minio.exe server D:\
3、对象存储的使用
3.1 在安装是指定访问的web地址,然后使用web访问
3.2 配置s3cmd
3.2.1 linux安装s3cmd
yum install s3cmd
3.2.2 配置s3cmd访问MinIO
[root@u1 s3cmd-2.2.0]# s3cmd --configure
Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.
Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables.
Access Key: #Minio 用户名
Secret Key: #Minio 密码
Default Region [US]: #回车
Use "s3.amazonaws.com" for S3 Endpoint and not modify it to the target Amazon S3.
S3 Endpoint [s3.amazonaws.com]: localhost:port #本机minio
Use "%(bucket)s.s3.amazonaws.com" to the target Amazon S3. "%(bucket)s" and "%(location)s" vars can be used
if the target S3 system supports dns based buckets.
DNS-style bucket+hostname:port template for accessing a bucket [%(bucket)s.s3.amazonaws.com]: localhost:port
Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: #Minio 的密码
Path to GPG program [/usr/bin/gpg]: #回车
When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP, and can only be proxied with Python 2.7 or newer
Use HTTPS protocol [Yes]: no
On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can't connect to S3 directly
HTTP Proxy server name: #回车
New settings:
Access Key:
Secret Key:
Default Region: US
S3 Endpoint: localhost:port
DNS-style bucket+hostname:port template for accessing a bucket: localhost:port
Encryption password:
Path to GPG program: /usr/bin/gpg
Use HTTPS protocol:
HTTP Proxy server name:
HTTP Proxy server port: 0
Test access with supplied credentials? [Y/n] y
Please wait, attempting to list all buckets...
Success. Your access key and secret key worked fine :-)
Now verifying that encryption works...
Success. Encryption and decryption worked fine :-)
Save settings? [y/N] y
Configuration saved to '/root/.s3cfg'
3.3.2 s3cmd操作指南
#创建存储桶
s3cmd mb s3://test
's3://test/' created
#拷贝一个文件到存储桶
s3cmd put newfile s3://testbucket
upload: 'newfile' -> 's3://testbucket/newfile'
#拷贝一个文件到本地文件系统
s3cmd get s3://testbucket/newfile
download: 's3://testbucket/newfile' -> './newfile'
#同步本地文件/文件夹到存储桶
s3cmd sync newdemo s3://testbucket
upload: 'newdemo/newdemofile.txt' -> 's3://testbucket/newdemo/newdemofile.txt'
#将存储桶或者文件对象同步到本地文件系统
s3cmd sync s3://testbucket otherlocalbucket
download: 's3://testbucket/cat.jpg' -> 'otherlocalbucket/cat.jpg'
#列举存储桶
s3cmd ls s3://
2015-12-09 16:12 s3://testbbucket
#列举存储桶里的内容
s3cmd ls s3://testbucket/
DIR s3://testbucket/test/
2015-12-09 16:05 138504 s3://testbucket/newfile
#从存储桶里删除一个文件
s3cmd del s3://testbucket/newfile
delete: 's3://testbucket/newfile'
#删除一个存储桶
s3cmd rb s3://mybucket
Bucket 's3://mybucket/' removed