MinIO的基础概念和环境部署可以参考我之前的文章:高性能分布式对象存储——MinIO(环境部署)
官方文档:https://docs.min.io/docs/minio-admin-complete-guide.html
MinIO Client (mc) 为 UNIX 命令(如 ls、cat、cp、mirror、diff、find 等)提供了现代替代方案。它支持文件系统和兼容 Amazon S3 的云存储服务(AWS Signature v2 和 v4)。
alias set, remove and list aliases in configuration file
ls list buckets and objects
mb make a bucket
rb remove a bucket
cp copy objects
mirror synchronize object(s) to a remote site
cat display object contents
head display first 'n' lines of an object
pipe stream STDIN to an object
share generate URL for temporary access to an object
find search for objects
sql run sql queries on objects
stat show object metadata
mv move objects
tree list buckets and objects in a tree format
du summarize disk usage recursively
retention set retention for object(s)
legalhold set legal hold for object(s)
diff list differences in object name, size, and date between two buckets
rm remove objects
encrypt manage bucket encryption config
event manage object notifications
watch listen for object notification events
undo undo PUT/DELETE operations
policy manage anonymous access to buckets and objects
tag manage tags for bucket(s) and object(s)
ilm manage bucket lifecycle
version manage bucket versioning
replicate configure server side bucket replication
admin manage MinIO servers
update update mc to latest release
如果您使用的是 bash、zsh 或 fish。Shell 补全默认嵌入在mc,安装自动补全使用mc --autocompletion。重新启动 shell,mc 将自动完成命令,如下所示。
# 安装
mc --autocompletion
# 重启shell,即退出shell,重新连接即可

mc --version

mc ls play
# json格式
mc --json ls play

mb命令在对象存储上创建一个新存储桶。在文件系统上,它的行为类似于mkdir -p命令。Bucket 相当于文件系统中的驱动器或挂载点,不应被视为文件夹。MinIO 对每个用户创建的存储桶数量没有任何限制。
# 添加MinIO存储服务
cd /opt/bigdata/minio
./mc config host add minio http://local-168-182-110:19000 admin admin123456
# 在自己部署的minio创建新存储桶
mc mb minio/mybucket
# 查看所有桶
mc ls minio

web访问:http://local-168-182-110:19001

cp命令将数据从一个或多个源复制到目标。
mc cp wget-log minio/mybucket
# 查看
mc ls wget-log minio/mybucket

您可以添加 shell 别名来覆盖您常用的 Unix 工具。
alias ls='mc ls'
alias cp='mc cp'
alias cat='mc cat'
alias mkdir='mc mb'
alias pipe='mc pipe'
alias find='mc find'
alias tree='mc tree'
MinIO Client (mc) 提供admin子命令来对 MinIO 部署执行管理任务。
service restart and stop all MinIO servers
update update all MinIO servers
info display MinIO server information
user manage users
group manage groups
policy manage policies defined in the MinIO server
replicate manage MinIO site replication
config manage MinIO server configuration
decommission, decom manage MinIO server pool decommissioning
heal heal disks, buckets and objects on MinIO server
prometheus manages prometheus config
kms perform KMS management operations
bucket manage buckets defined in the MinIO server
tier manage remote tier targets for ILM transition
top provide top like statistics for MinIO
trace show http trace for MinIO server
console show console logs for MinIO server
mc admin info minio
# 为了方便使用,可以设置别名
alias minfo='mc admin info'
minfo minio


【示例】显示info命令的详细调试输出
mc admin info --debug minio

JSON 选项启用JSON 行格式的可解析输出。
【示例】MinIO 服务器信息
mc admin --json info minio

service命令提供了一种重新启动和停止所有 MinIO 服务器的方法。
【示例】
mc admin service restart minio
policy添加、删除、列出策略、获取策略信息以及为 MinIO 服务器上的用户设置策略的命令。
NAME:
mc admin policy - manage policies
FLAGS:
--help, -h show help
COMMANDS:
add add new policy
remove remove policy
list list all policies
info show info on a policy
set set IAM policy on a user or group
mc admin policy list minio

策略来自 /tmp/listbucketsonly.json。当此策略应用于用户时,该用户只能列出顶层存储桶,但不能列出其他任何内容,没有前缀,没有对象。
首先使用以下信息创建 json 文件 /tmp/listbucketsonly.json。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets"
],
"Resource": [
"arn:aws:s3:::*"
]
}
]
}
将策略作为“listbucketsonly”添加到策略数据库
mc admin policy add minio listbucketsonly /tmp/listbucketsonly.json
# 删除 MinIO 上的策略“listbucketsonly”
mc admin policy remove minio listbucketsonly
# 添加一个新用户“newuser”,密码"newuser123"
mc admin user add minio newuser newuser123
# 给用户添加策略
mc admin policy set minio writeonly user=newuser
# 添加组“somegroup ”,把用户“newuser ”添加到组
mc admin group add minio somegroup newuser
# 给组添加策略
mc admin policy set minio writeonly group=somegroup
# 添加一个新用户“newuser”,密码"newuser123"
mc admin user add minio newuser newuser123
mc admin user disable minio newuser
mc admin user enable minio newuser
mc admin user remove minio newuser
mc admin user list --json minio
mc admin user info minio newuser
group在 MinIO 服务器上添加、删除、信息、列出、启用、禁用组的命令。
# 如果组不存在,则创建组。
mc admin group add minio somegroup newuser
mc admin group remove minio somegroup newuser
仅在给定组为空时有效,非空组无法删除
mc admin group remove minio somegroup

# 添加组
mc admin group add minio somegroup newuser
# 删除
mc admin group info minio somegroup
mc admin group list minio
mc admin group enable minio somegroup
mc admin group disable minio somegroup
config命令来管理 MinIO 服务器配置。
# 通过引入第三方组件etcd,在不动原有集群的基础上实现动态扩展方案
mc admin config get minio etcd
mc admin config set minio etcd endpoints=http://[hostname|ip]:2379
mc admin config export minio > /tmp/my-serverconfig
mc admin config import minio < /tmp/my-serverconfig
这里列出了常用的命令,想了解更多,可以查看官方文档:https://docs.min.io/docs/minio-admin-complete-guide.html
MinIO Client(mc)操作还是非常简单的,但是更多的使用还是通过程序去调用api接口的,后续会讲解~
参考:https://docs.min.io/docs/distributed-minio-quickstart-guide.html

MinIO集群扩容方法:
常见的集群扩容方法可分为两类:水平扩容和垂直扩容。
首先,MinIO的极简设计理念使得MinIO分布式集群并不支持向集群中添加单个节点并进行自动调节的扩容方式,这是因为加入单个节点后所引发的数据均衡以及纠删组划分等问题会为整个集群带来复杂的调度和处理过程,并不利于维护。因此,MinIO提供了一种对等扩容的方式,即要求增加的节点数和磁盘数均需与原集群保持对等。
对等扩容的优点在于配置操作简单易行
通过一条命令即可完成扩容(注意:推荐使用连续的节点IP,并参照MinIO官网在扩容命令中使用{})。而对等扩容的局限性在于:
【温馨提示】这里不沿用之前的集群进行扩容,这里重新部署2个节点的集群。具体部署,可以参考我之前的文章:高性能分布式对象存储——MinIO(环境部署)
| 主机名 | IP | data | 备注 |
|---|---|---|---|
| local-168-182-110 | 192.168.182.110 | /opt/bigdata/minio/data/export{1,2} | 原始节点 |
| local-168-182-111 | 192.168.182.111 | /opt/bigdata/minio/data/export{1,2} | 原始节点 |
| local-168-182-112 | 192.168.182.112 | /opt/bigdata/minio/data/export{1,2} | 扩容节点 |
| local-168-182-113 | 192.168.182.113 | /opt/bigdata/minio/data/export{1,2} | 扩容节点 |
启动脚本
#!/bin/bash
# 创建日志存储目录
mkdir -p /opt/bigdata/minio/logs
# 分别在三个节点上创建存储目录
mkdir -p /opt/bigdata/minio/data/export{1,2,3,4}
# 创建配置目录
mkdir -p /etc/minio
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=admin123456
# 所有节点都得修改重启服务
# --address "0.0.0.0:9000" 挂载9001端口为api端口(如Java客户端)访问的端口
# --console-address ":9000" 挂载9000端口为web端口;
/opt/bigdata/minio/minio server --address 0.0.0.0:9000 --console-address 0.0.0.0:9001 --config-dir /etc/minio \
http://192.168.182.11{0...1}/opt/bigdata/minio/data/export{1...2} > /opt/bigdata/minio/logs/minio_server.log
minio初始集群信息
web访问:http://local-168-182-110:19001



# 在local-168-182-110执行
cd /opt/bigdata/minio
scp -r /opt/bigdata/minio local-168-182-113:/opt/bigdata/
scp -r /usr/lib/systemd/system/minio.service local-168-182-113:/usr/lib/systemd/system/minio.service
这里也添加2块2G的磁盘
# 不重启,直接刷新磁盘数据总线,获取新加的磁盘
for host in $(ls /sys/class/scsi_host) ; do echo "- - -" > /sys/class/scsi_host/$host/scan; done
lsblk
# 格式化
mkfs.ext4 /dev/sdb
mkfs.ext4 /dev/sdc
mkfs.ext4 /dev/sdd
mkfs.ext4 /dev/sde
# 先删再创建挂载目录,因为这里面有其它节点的数据
rm -fr /opt/bigdata/minio/data/export{1..4}
mkdir -p /opt/bigdata/minio/data/export{1..4}
# 挂载
mount /dev/sdb /opt/bigdata/minio/data/export1
mount /dev/sdc /opt/bigdata/minio/data/export2
mount /dev/sdd /opt/bigdata/minio/data/export3
mount /dev/sde /opt/bigdata/minio/data/export4
#!/bin/bash
# 创建日志存储目录
mkdir -p /opt/bigdata/minio/logs
# 分别在三个节点上创建存储目录
mkdir -p /opt/bigdata/minio/data/export{1,2}
# 创建配置目录
mkdir -p /etc/minio
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=admin123456
# 所有节点都得修改重启服务
# --address "0.0.0.0:9000" 挂载9001端口为api端口(如Java客户端)访问的端口
# --console-address ":9000" 挂载9000端口为web端口;
# 扩容地址:http://192.168.182.11{2...3}/opt/bigdata/minio/data/export{1...2}
/opt/bigdata/minio/minio server --address 0.0.0.0:9000 --console-address 0.0.0.0:9001 --config-dir /etc/minio \
http://192.168.182.11{0...1}/opt/bigdata/minio/data/export{1...2} \
http://192.168.182.11{2...3}/opt/bigdata/minio/data/export{1...2} > /opt/bigdata/minio/logs/minio_server.log
可扩容的方式,使用MINIO纠删码,如果想要扩容,必须使用这种方式。注意上面是三个点。
下面的写法多硬盘多节点部署是不可扩容的方式,下面是官方示例:
export MINIO_ACCESS_KEY=<ACCESS_KEY>
export MINIO_SECRET_KEY=<SECRET_KEY>
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
systemctl restart minio
web访问:http://local-168-182-110:19001

到这里就完成了对等扩容了。
MinIO官方提供了另一种扩容机制——联邦扩容,即通过引入etcd,将多个MinIO分布式集群在逻辑上组成一个联邦,对外以一个整体提供服务,并提供统一的命名空间。MinIO联邦集群的架构如下图所示:

etcd是一个开源的分布式键值存储数据库,在联邦中用于记录存储桶IP地址。MinIO联邦集群的数据访问机制具体如下:
下载地址:https://github.com/etcd-io/etcd/releases
mkdir -p /opt/bigdata/etcd ; cd /opt/bigdata/etcd
wget https://github.com/etcd-io/etcd/releases/download/v3.4.20/etcd-v3.4.20-linux-amd64.tar.gz
tar -xf etcd-v3.4.20-linux-amd64.tar.gz
# 创建存储目录
mkdir /opt/bigdata/etcd/data
创建配置文件 /usr/local/etcd/conf.yml,三个节点配置文件内容分别如下:
etcd01:local-168-182-110
name: etcd01
data-dir: /opt/bigdata/etcd/data
initial-advertise-peer-urls: http://192.168.182.110:2380
listen-peer-urls: http://192.168.182.110:2380
listen-client-urls: http://192.168.182.110:2379,http://127.0.0.1:2379
advertise-client-urls: http://192.168.182.110:2379
initial-cluster-token: etcd-cluster
initial-cluster: etcd01=http://192.168.182.110:2380,etcd02=http://192.168.182.111:2380,etcd03=http://192.168.182.112:2380
initial-cluster-state: new
etcd02:local-168-182-111
name: etcd02
data-dir: /opt/bigdata/etcd/data
initial-advertise-peer-urls: http://192.168.182.111:2380
listen-peer-urls: http://192.168.182.111:2380
listen-client-urls: http://192.168.182.111:2379,http://127.0.0.1:2379
advertise-client-urls: http://192.168.182.111:2379
initial-cluster-token: etcd-cluster
initial-cluster: etcd01=http://192.168.182.110:2380,etcd02=http://192.168.182.111:2380,etcd03=http://192.168.182.112:2380
initial-cluster-state: new
etcd03:local-168-182-112
name: etcd03
data-dir: /opt/bigdata/etcd/data
initial-advertise-peer-urls: http://192.168.182.112:2380
listen-peer-urls: http://192.168.182.112:2380
listen-client-urls: http://192.168.182.112:2379,http://127.0.0.1:2379
advertise-client-urls: http://192.168.182.112:2379
initial-cluster-token: etcd-cluster
initial-cluster: etcd01=http://192.168.182.110:2380,etcd02=http://192.168.182.111:2380,etcd03=http://192.168.182.112:2380
initial-cluster-state: new
【温馨提示】只能写IP,写主机名会启动失败
配置参数解析:
name:当前etcd节点名称。data-dir:数据存储目录。initial-advertise-peer-urls:集群的其他节点通过该地址与当前节点通信。listen-peer-urls:当前节点通过该地址监听集群其他节点发送的信息。listen-client-urls:当前节点通过该地址监听客户端发送的信息。advertise-client-urls:客户端通过该地址与当前节点通信initial-cluster-token:用于区分不同的集群,同一集群的所有节点配置相同的值。initial-cluster:当前集群的所有节点信息,当前节点根据此信息与其他节点取得联系。initial-cluster-state: 本次是否为新建集群,有两个取值:new和existing。配置服务
cat >/usr/lib/systemd/system/etcd.service<<EOF
[Unit]
Description=etcd
After=network.target
[Service]
Type=notify
ExecStart=/opt/bigdata/etcd/etcd-v3.4.20-linux-amd64/etcd --config-file=/usr/local/etcd/conf.yml
[Install]
WantedBy=multi-user.target
EOF
启动服务
systemctl daemon-reload
systemctl start etcd.service
验证
# 加软连接
ln -s /opt/bigdata/etcd/etcd-v3.4.20-linux-amd64/etcdctl /usr/local/bin/etcdctl
# 查看集群成员列表
etcdctl member list
# 查看集群成员健康情况
etcdctl endpoint health --endpoints=http://192.168.182.110:2380,http://192.168.182.111:2380,http://192.168.182.112:2380

查看etcd版本
ln -s /opt/bigdata/etcd/etcd-v3.4.20-linux-amd64/etcd /usr/local/bin/etcd
etcd --version

集群1
cd /opt/bigdata/minio
export MINIO_ETCD_ENDPOINTS="http://192.168.182.110:2380,http://192.168.182.111:2380,http://192.168.182.112:2380"
mkdir -p /etc/minio
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=admin123456
export MINIO_PUBLIC_IPS=192.168.182.110,192.168.182.111
./minio server --address 0.0.0.0:8000 --console-address 0.0.0.0:8001 --config-dir /etc/minio http://192.168.182.11{0...1}/opt/bigdata/minio/data/export{3...4}
web访问:http://local-168-182-110:8001/

集群2
cd /opt/bigdata/minio
export MINIO_ETCD_ENDPOINTS="http://192.168.182.110:2380,http://192.168.182.111:2380,http://192.168.182.112:2380"
mkdir -p /etc/minio
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=admin123456
export MINIO_PUBLIC_IPS=192.168.182.112,192.168.182.113
./minio server --address 0.0.0.0:8000 --console-address 0.0.0.0:8001 --config-dir /etc/minio http://192.168.182.11{2...3}/opt/bigdata/minio/data/export{3...4}
web访问:http://local-168-182-112:8001/

配置nginx
# /etc/nginx/conf.d/minio2.conf
upstream minio_api2 {
ip_hash;
server 192.168.182.110:8000;
server 192.168.182.111:8000;
server 192.168.182.112:8000;
server 192.168.182.113:8000;
}
upstream minio_console2 {
ip_hash;
server 192.168.182.110:8001;
server 192.168.182.111:8001;
server 192.168.182.112:8001;
server 192.168.182.113:8001;
}
server{
listen 18000;
server_name 192.168.182.110;
ignore_invalid_headers off;
client_max_body_size 0;
proxy_buffering off;
location / {
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 300;
proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_ignore_client_abort on;
proxy_pass http://minio_api2;
}
}
server{
listen 18001;
server_name 192.168.182.110;
ignore_invalid_headers off;
client_max_body_size 0;
proxy_buffering off;
location / {
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 300;
proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_ignore_client_abort on;
proxy_pass http://minio_console2;
}
}
重新加载nginx 生效
systemctl reload nginx
web访问:http://local-168-182-110:18001/

不同的客户端访问会显示不同的节点信息
MinIO的基本操作和MinIO扩容实战就到这里了,有疑问的小伙伴欢迎给我留言哦,后续会持续分享更多关于大数据的教程,请小伙伴耐心等待哦~