官方文档: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/miniochmod +x minio#启动minio server服务,指定数据存储目录/mnt/data./minio server /mnt/data
复制代码
默认用户名密码 minioadmin:minioadmin,修改默认用户名密码可以使用:
export MINIO_ROOT_USER=adminexport 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=adminexport MINIO_ROOT_PASSWORD=12345678minio 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=adminexport MINIO_ROOT_PASSWORD=12345678minio 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 pulldocker-compose up
复制代码
扩展现有的分布式集群
例如我们是通过区的方式启动 MinIO 集群,命令行如下:
export MINIO_ROOT_USER=adminexport MINIO_ROOT_PASSWORD=12345678minio server http://host{1...32}/export{1...32}
复制代码
MinIO 支持通过命令,指定新的集群来扩展现有集群(纠删码模式),命令行如下:
export MINIO_ROOT_USER=adminexport MINIO_ROOT_PASSWORD=12345678minio 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/mcchmod +x mc./mc --helpmv 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# 删除hostmc 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 管理
# 创建bucketmc mb minio-server/bucket01# 删除bucketmc 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 foxmc 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.jsonmc 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
评论