最近在负责 minio 分布式文件系统,所以在本地搭建一个 demo 练练手
一. 基础环境
操作系统: Centos 7.x
二. 准备工作
官网友情提示(非常重要!!!):
- 分布式Minio里所有的节点需要有同样的access秘钥和secret秘钥,这样这些节点才能建立联接。为了实现这个,你需要在执行minio server命令之前,先将access秘钥和secret秘钥export成环境变量。
- 分布式Minio使用的磁盘里必须是干净的,里面没有数据。
- 下面示例里的IP仅供示例参考,你需要改成你真实用到的IP和文件夹路径。
- 分布式Minio里的节点时间差不能超过3秒,你可以使用NTP 来保证时间一致。
- 在Windows下运行分布式Minio处于实验阶段,请悠着点使用。
2.1 机器资源
192.168.133.122
192.168.133.123
192.168.133.124
192.168.133.125
本集群由 4 台服务器构成(官方推荐集群最小 4 台服务器),每个服务器上挂载两个磁盘目录,最小数据挂载点为 4 个。
硬盘资源必须准备至少 4 块,否则启动报错:

>> 可以在同一台服务器上挂载 4 块硬盘,也可以在不同服务器上。只要硬盘数 >= 4
2.2 创建相关目录(所有节点)
数据存储目录
mkdir -p /home/tools/minio/data
启动脚本目录
mkdir -p /home/tools/minio/
上传启动脚本到该目录下
chmod +x minio
三. 编写集群启动脚本(所有节点配置文件相同)
#集群启动脚本
vi /home/tools/minio/run.sh
#!/bin/bash
export MINIO_ACCESS_KEY=minioadmin
export MINIO_SECRET_KEY=minioadmin
nohup /home/ybs/minio/minio server --config-dir /home/ybs/minio/config \
http://192.168.133.122/home/ybs/minio/data \
http://192.168.133.123/home/ybs/minio/data \
http://192.168.133.124/home/ybs/minio/data \
http://192.168.133.125/home/ybs/minio/data >> minio-start.log 2>&1 &
其中,“MINIO_ACCESS_KEY”为用户名,“MINIO_SECRET_KEY”为密码,密码不能设置过于简单,不然minio会启动失败,“-config-dir”指定集群配置文件目录
MinIO 启动日志会输出到当前目录下的 minio-start.log
chmod +x /home/tools/minio/run.sh
四. 编写服务脚本(所有节点)
vim /usr/lib/systemd/system/minio.service
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/
[Service]
WorkingDirectory=/home/tools/minio/
ExecStart=/home/tools/minio/run.sh
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
其中,“WorkingDirectory”为启动脚本目录,“ExecStart”为指定集群启动脚本
五. 启动测试 (所有节点)
网上推荐的启动方式
systemctl daemon-reload
systemctl start minio
systemctl enable minio
我自己测试发现好像不行。可能是自己菜的缘故!!
>> 我是直接执行脚本 sh run.sh
测试
浏览器输入集群任意节点地址+9000端口,即可访问minio,用户名密码为前面设置的“MINIO_ACCESS_KEY”和“MINIO_SECRET_KEY”,可创建“bucket”并上传文件测试
发现其实 minio 集群之间可以同步数据
六.单机启动
export MINIO_ACCESS_KEY=minio
export MINIO_SECRET_KEY=minio
nohup ./minio server /minio/data > /minio/logs/minio.log 2>&1 &
七.桶通知
MinIO Server config.json (v18) 指南
桶通知最好是基于绑定的 IP 不会经常动态变化的情况下操作,否则集群的节点会因为访问不到绑定的旧 IP 导致节点一个一个的减少。会提示以下错误
API: SYSTEM()
Time: 16:20:21 CST 12/08/2020
DeploymentID: b858dcdd-d921-489a-aa24-056a821db0e9
Error: Unable to initialize notification target(s): one or more targets are offline. Please use `mc admin info --json` to check the offline targets
7: github.com/minio/minio@/cmd/config-current.go:487:cmd.lookupConfigs()
6: github.com/minio/minio@/cmd/config-current.go:604:cmd.loadConfig()
5: github.com/minio/minio@/cmd/config.go:233:cmd.initConfig()
4: github.com/minio/minio@/cmd/config.go:193:cmd.(*ConfigSys).Init()
3: github.com/minio/minio@/cmd/server-main.go:323:cmd.initAllSubsystems()
2: github.com/minio/minio@/cmd/server-main.go:248:cmd.initSafeMode()
1: github.com/minio/minio@/cmd/server-main.go:523:cmd.serverMain()
All MinIO sub-systems initialized successfully
Waiting for all MinIO IAM sub-system to be initialized.. lock acquired
Use `mc admin info` to look for latest server/disk info
Status: 3 Online, 1 Offline.
Endpoint: http://10.9.129.15:9003
7.1 使用 Redis 发布 MinIO 发布事件
这种通知目标支持两种格式: namespace 和 access。
如果用的是_namespacee_格式,MinIO将存储桶里的对象同步成Redis hash中的条目。对于每一个条目,对应一个存储桶里的对象,其key都被设为"存储桶名称/对象名称",value都是一个有关这个MinIO对象的JSON格式的事件数据。如果对象更新或者删除,hash中对象的条目也会相应的更新或者删除。
如果使用的是access,MinIO使用RPUSH将事件添加到list中。这个list中每一个元素都是一个JSON格式的list,这个list中又有两个元素,第一个元素是时间戳的字符串,第二个元素是一个含有在这个存储桶上进行操作的事件数据的JSON对象。在这种格式下,list中的元素不会更新或者删除。
7.1.1 集成 Redis 到 MinIO
MinIO server 在默认情况下会将所有配置信息存到 ${HOME}/.minio/config.json 文件中。
默认的配置目录是 ${HOME}/.minio,你可以使用--config-dir命令行选项重写之。
./minio server --config-dir ./config/miniotest ./test
官网说 MinIO Server的配置文件默认路径是 ~/.minio/config.json。我找了一万遍,好像并没有这个文件。。。,所以只能通过强大的命令 find 查找了。
find / -name config.json
find 结果:
[root@localhost config]# find / -name config.json
/root/.mc/config.json (mc 相关的配置信息)
/home/tools/minio/data/.minio.sys/config/config.json (config.json 是目录)
/home/tools/minio/test/.minio.sys/config/config.json (答案所在)
cat /home/tools/minio/test/.minio.sys/config/config.json
{
"api": {
"_": [
{
"key": "requests_max",
"value": "0"
},
{
"key": "requests_deadline",
"value": "10s"
},
{
"key": "ready_deadline",
"value": "10s"
},
{
"key": "cors_allow_origin",
"value": "*"
}
]
},
"audit_webhook": {
"_": [
{
"key": "enable",
"value": "off"
},
{
"key": "endpoint",
"value": ""
},
{
"key": "auth_token",
"value": ""
}
]
},
"cache": {
"_": [
{
"key": "drives",
"value": ""
},
{
"key": "exclude",
"value": ""
},
{
"key": "expiry",
"value": "90"
},
{
"key": "quota",
"value": "80"
},
{
"key": "after",
"value": "0"
},
{
"key": "watermark_low",
"value": "70"
},
{
"key": "watermark_high",
"value": "80"
},
{
"key": "range",
"value": "on"
}
]
},
"compression": {
"_": [
{
"key": "enable",
"value": "off"
},
{
"key": "extensions",
"value": ".txt,.log,.csv,.json,.tar,.xml,.bin"
},
{
"key": "mime_types",
"value": "text/*,application/json,application/xml"
}
]
},
"credentials": {
"_": [
{
"key": "access_key",
"value": "minioadmin"
},
{
"key": "secret_key",
"value": "minioadmin"
}
]
},
"etcd": {
"_": [
{
"key": "endpoints",
"value": ""
},
{
"key": "path_prefix",
"value": ""
},
{
"key": "coredns_path",
"value": "/skydns"
},
{
"key": "client_cert",
"value": ""
},
{
"key": "client_cert_key",
"value": ""
}
]
},
"identity_ldap": {
"_": [
{
"key": "server_addr",
"value": ""
},
{
"key": "username_format",
"value": ""
},
{
"key": "username_search_filter",
"value": ""
}

本文详细介绍如何在CentOS 7.x环境下搭建MinIO分布式文件系统集群,包括基础环境准备、集群启动脚本编写、服务脚本配置及桶通知集成等关键步骤。
最低0.47元/天 解锁文章
750





