官方文档:https://docs.min.io/docs/
中文文档:http://docs.minio.org.cn/docs/ (没有及时更新,容易被坑)
minio 支持多种 server 启动模式:
2.1 单机部署
minio server 的 standalone 模式,即要管理的磁盘都在 host 本地。该启动模式一般仅用于实验环境、测试环境的验证和学习使用。在 standalone 模式下,还可以分为 non-erasure code mode 和 erasure code mode。
non-erasure code mode
在此启动模式下,对于每一份对象数据,minio 直接在 data 下面存储这份数据,不会建立副本,也不会启用纠删码机制。因此,这种模式无论是服务实例还是磁盘都是“单点”,无任何高可用保障,磁盘损坏就表示数据丢失。
erasure code mode
此模式为 minio server 实例传入多个本地磁盘参数。一旦遇到多于一个磁盘参数,minio server 会自动启用 erasure code mode。erasure code 对磁盘的个数是有要求的,如不满足要求,实例启动将失败。 erasure code 启用后,要求传给 minio server 的 endpoint(standalone 模式下,即本地磁盘上的目录)至少为 4 个。
基于 centos7
wget -q http://dl.minio.org.cn/server/minio/release/linux-amd64/minio
chmod +x minio
#启动minio server服务,指定数据存储目录/mnt/data
./minio server /mnt/data
复制代码
默认用户名密码 minioadmin:minioadmin,修改默认用户名密码可以使用:
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=12345678
复制代码
默认的配置目录是 ${HOME}/.minio,可以通过--config-dir 命令自定义配置目录:
./minio server --config-dir /mnt/config /mnt/data
复制代码
控制台监听端口是动态生成的,可以通过--console-address ":port"指定静态端口
./minio server --console-address ":50000" /mnt/data
复制代码
访问 minio 控制台: http://192.168.3.14:50000/dashboard
基于 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 -p 9000:9000 -p 50000:50000 --name minio \
-v /mnt/data:/data \
-v /mnt/config:/root/.minio \
minio/minio server --console-address ":50000" /data
复制代码
访问 minio 控制台: http://192.168.3.14:50000/
MinIO 自定义用户名密码
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
复制代码
minio 纠删码模式
Minio 使用纠删码erasure code
和校验和checksum
来保护数据免受硬件故障和无声数据损坏。 即便您丢失一半数量(N/2)的硬盘,您仍然可以恢复数据。
纠删码是一种恢复丢失和损坏数据的数学算法, Minio 采用 Reed-Solomon code 将对象拆分成 N/2 数据和 N/2 奇偶校验块。 这就意味着如果是 12 块盘,一个对象会被分成 6 个数据块、6 个奇偶校验块,你可以丢失任意 6 块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复。
使用 Minio Docker 镜像,在 8 块盘中启动 Minio 服务:
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"
复制代码
2.2 分布式集群部署
分布式 Minio 可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式 Minio 避免了单点故障。
分布式存储可靠性常用方法
分布式存储,很关键的点在于数据的可靠性,即保证数据的完整,不丢失,不损坏。只有在可靠性实现的前提下,才有了追求一致性、高可用、高性能的基础。而对于在存储领域,一般对于保证数据可靠性的方法主要有两类,一类是冗余法,一类是校验法。
冗余
冗余法最简单直接,即对存储的数据进行副本备份,当数据出现丢失,损坏,即可使用备份内容进行恢复,而副本 备份的多少,决定了数据可靠性的高低。这其中会有成本的考量,副本数据越多,数据越可靠,但需要的设备就越多,成本就越高。可靠性是允许丢失其中一份数据。当前已有很多分布式系统是采用此种方式实现,如 Hadoop 的文件系统(3 个副本),Redis 的集群,MySQL 的主备模式等。
校验
校验法即通过校验码的数学计算的方式,对出现丢失、损坏的数据进行校验、还原。注意,这里有两个作用,一个校验,通过对数据进行校验和( checksum )进行计算,可以检查数据是否完整,有无损坏或更改,在数据传输和保存时经常用到,如 TCP 协议;二是恢复还原,通过对数据结合校验码,通过数学计算,还原丢失或损坏的数据,可以在保证数据可靠的前提下,降低冗余,如单机硬盘存储中的 RAID 技术,纠删码(Erasure Code)技术等。MinIO 采用的就是纠删码技术。
分布式 Minio 优势
数据保护
分布式 Minio 采用 纠删码来防范多个节点宕机和位衰减bit rot
。
分布式 Minio 至少需要 4 个硬盘,使用分布式 Minio 自动引入了纠删码功能。
高可用
单机 Minio 服务存在单点故障,相反,如果是一个有 N 块硬盘的分布式 Minio,只要有 N/2 硬盘在线,你的数据就是安全的。不过你需要至少有 N/2+1 个硬盘来创建新的对象。
例如,一个 16 节点的 Minio 集群,每个节点 16 块硬盘,就算 8 台服務器宕机,这个集群仍然是可读的,不过你需要 9 台服務器才能写数据。
一致性
Minio 在分布式和单机模式下,所有读写操作都严格遵守 read-after-write 一致性模型。
运行分布式 Minio
启动一个分布式 Minio 实例,你只需要把硬盘位置做为参数传给 minio server 命令即可,然后,你需要在所有其它节点运行同样的命令。
分布式 Minio 里所有的节点需要有同样的 access 秘钥和 secret 秘钥,这样这些节点才能建立联接。为了实现这个,你需要在执行 minio server 命令之前,先将 access 秘钥和 secret 秘钥 export 成环境变量。新版本使用 MINIO_ROOT_USER&MINIO_ROOT_PASSWORD。
分布式 Minio 使用的磁盘里必须是干净的,里面没有数据。
下面示例里的 IP 仅供示例参考,你需要改成你真实用到的 IP 和文件夹路径。
==分布式 Minio 里的节点时间差不能超过 3 秒,你可以使用NTP 来保证时间一致。==
在 Windows 下运行分布式 Minio 处于实验阶段,请悠着点使用。
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/export8
复制代码
4 节点,每节点 4 块盘
启动分布式 Minio 实例,4 节点,每节点 4 块盘,需要在 4 个节点上都运行下面的命令
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=12345678
minio server http://192.168.1.11/export1 http://192.168.1.11/export2 \
http://192.168.1.11/export3 http://192.168.1.11/export4 \
http://192.168.1.12/export1 http://192.168.1.12/export2 \
http://192.168.1.12/export3 http://192.168.1.12/export4 \
http://192.168.1.13/export1 http://192.168.1.13/export2 \
http://192.168.1.13/export3 http://192.168.1.13/export4 \
http://192.168.1.14/export1 http://192.168.1.14/export2 \
http://192.168.1.14/export3 http://192.168.1.14/export4
复制代码
通过脚本方式启动
执行脚本后查看日志和进程
测试上传:
存储结构
使用 Docker Compose 部署 MinIO
https://docs.min.io/docs/deploy-minio-on-docker-compose.html
要在 Docker Compose 上部署分布式 MinIO,请下载docker-compose.yaml和nginx.conf到你当前的工作目录。
docker-compose pull
docker-compose up
复制代码
扩展现有的分布式集群
例如我们是通过区的方式启动 MinIO 集群,命令行如下:
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=12345678
minio server http://host{1...32}/export{1...32}
复制代码
MinIO 支持通过命令,指定新的集群来扩展现有集群(纠删码模式),命令行如下:
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=12345678
minio server http://host{1...32}/export{1...32} http://host{33...64}/export{1...32}
复制代码
现在整个集群就扩展了 1024 个磁盘,总磁盘变为 2048 个,新的对象上传请求会自动分配到最少使用的集群上。通过以上扩展策略,您就可以按需扩展您的集群。重新配置后重启集群,会立即在集群中生效,并对现有集群无影响。如上命令中,我们可以把原来的集群看做一个区,新增集群看做另一个区,新对象按每个区域中的可用空间比例放置在区域中。在每个区域内,基于确定性哈希算法确定位置。
说明: 您添加的每个区域必须具有与原始区域相同的磁盘数量(纠删码集)大小,以便维持相同的数据冗余 SLA。 例如,第一个区有 8 个磁盘,您可以将集群扩展为 16 个、32 个或 1024 个磁盘的区域,您只需确保部署的 SLA 是原始区域的倍数即可。
基于 nginx 实现 loadbalancer
upstream minio {
server 192.168.3.14:9001;
server 192.168.3.14:9002;
server 192.168.3.14:9003;
server 192.168.3.14:9004;
}
upstream console {
ip_hash;
server 192.168.3.14:50001;
server 192.168.3.14:50002;
server 192.168.3.14:50003;
server 192.168.3.14:50004;
}
server {
listen 9000;
listen [::]:9000;
server_name localhost;
# To allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;
# To disable buffering
proxy_buffering off;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300;
# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass http://minio;
}
}
server {
listen 50000;
listen [::]:50000;
server_name localhost;
# To allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;
# To disable buffering
proxy_buffering off;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
proxy_connect_timeout 300;
# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass http://console;
}
}
复制代码
2.3 Minio 客户端使用
MinIO Client (mc)为 ls,cat,cp,mirror,diff,find 等 UNIX 命令提供了一种替代方案。它支持文件系统和兼容 Amazon S3 的云存储服务(AWS Signature v2 和 v4)。
ls 列出文件和文件夹。
mb 创建一个存储桶或一个文件夹。
cat 显示文件和对象内容。
pipe 将一个STDIN重定向到一个对象或者文件或者STDOUT。
share 生成用于共享的URL。
cp 拷贝文件和对象。
mirror 给存储桶和文件夹做镜像。
find 基于参数查找文件。
diff 对两个文件夹或者存储桶比较差异。
rm 删除文件和对象。
events 管理对象通知。
watch 监视文件和对象的事件。
policy 管理访问策略。
config 管理mc配置文件。
update 检查软件更新。
version 输出版本信息。
复制代码
部署客户端 mc
wget http://dl.minio.org.cn/client/mc/release/linux-amd64/mc
chmod +x mc
./mc --help
mv mc /usr/local/sbin/
复制代码
配置 mc
mc
将所有的配置信息都存储在~/.mc/config.json
文件中
# 查询mc host配置
mc config host ls
# 添加minio服务
mc config host add minio-server http://192.168.3.14:9000 admin 12345678
# 删除host
mc config host remove minio-server
复制代码
mc 命令使用
上传下载
# 查询minio服务上的所有buckets(文件和文件夹)
mc ls minio-server
# 下载文件
mc cp minio-server/tulingmall/fox/fox.jpg /tmp/
#删除文件
mc rm minio-server/tulingmall/fox/fox.jpg
#上传文件
mc cp zookeeper.out minio-server/tulingmall/
复制代码
Bucket 管理
# 创建bucket
mc mb minio-server/bucket01
# 删除bucket
mc rb minio-server/bucket02
# bucket不为空,可以强制删除 慎用
mc rb --force minio-server/bucket01
复制代码
#查询bucket03磁盘使用情况
mc du minio-server/bucket03
复制代码
mc admin 使用
MinIO Client(mc)提供了“ admin”子命令来对您的 MinIO 部署执行管理任务。
service 服务重启并停止所有MinIO服务器
update 更新更新所有MinIO服务器
info 信息显示MinIO服务器信息
user 用户管理用户
group 小组管理小组
policy MinIO服务器中定义的策略管理策略
config 配置管理MinIO服务器配置
heal 修复MinIO服务器上的磁盘,存储桶和对象
profile 概要文件生成概要文件数据以进行调试
top 顶部提供MinIO的顶部统计信息
trace 跟踪显示MinIO服务器的http跟踪
console 控制台显示MinIO服务器的控制台日志
prometheus Prometheus管理Prometheus配置
kms kms执行KMS管理操作
复制代码
用户管理
mc admin user --help
#新建用户
mc admin user add minio-server fox
mc admin user add minio-server fox02 12345678
#查看用户
mc admin user list minio-server
#禁用用户
mc admin user disable minio-server fox02
#启用用户
mc admin user disable minio-server fox02
#查看用户信息
mc admin user info minio-server fox
#删除用户
mc admin user remove minio-server fox02
复制代码
策略管理
policy 命令,用于添加,删除,列出策略,获取有关策略的信息并为 MinIO 服务器上的用户设置策略。
mc admin policy --help
#列出MinIO上的所有固定策略
mc admin policy list minio-server
# 查看plicy信息
mc admin policy info minio-server readwrite
复制代码
添加新的策略
编写策略文件:/root/tulingmall.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::tulingmall"
]
},{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::tulingmall/*"
]
}
]
}
复制代码
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
]
将 tulingmall.json 添加到策略数据库
# 添加新的策略
mc admin policy add minio-server tulingmall-admin /root/tulingmall.json
mc admin policy list minio-server
复制代码
mc admin user add minio-server fox03 12345678
# 设置用户的访问策略
mc admin policy set minio-server tulingmall-admin user=fox03
复制代码
测试:fox03/12345678 登录 minio 控制台http://192.168.3.14:50000/,只能操作 tulingmall 的 bucket
评论