CentOS7部署MinIO

英文官网:https://min.io/

中文官网:http://minio.org.cn/(更新不及时,容易被坑)

一、为什么要使用MinIO

其实抛开Ceph这类复杂的存储解决方案外,小公司小团队的选择一般都会是FastDFS或者MinIO,那么这里我们就简单对比下MinIO相较于FastDFS的优势!

1、安装部署(运维)复杂度

虽然我觉得FastDFS安装也不算很复杂,但是MinIO的安装可以说更简单;

FastDFS安装:https://www.jiguiquan.com/?p=2133

2、文档

FastDFS可以说发展了十几年几乎没有官方文档,都是靠热心网友投稿;

而MinIO文档还是比较全的,中文文档:http://docs.minio.org.cn/docs/master/minio-monitoring-guide

3、开源项目运营组织

FastDFS是阿里余庆大神的一个个人项目,而MinIO背靠的是Apache开源组织;

4、UI界面

FastDFS默认是不带UI界面的,而MinIO服务部署时候,是自带UI界面的,开箱即用;

5、性能

MinIO号称是世界上速度最快的对象存储服务器,标准硬件设备上,读/写速度都是GB级别的;FastDFS差多了;

image.png

6、容器化支持

MinIO提供了与k8s、etcd、docker等容器化技术深度集成方案,可以说就是为了云环境而生的。这点是FastDFS不具备的。

image.png

7、丰富的SDK支持

MinIO支持的不同语言SDK多于FastDFS,尤其文档,更是完胜;

8、AWS S3标准兼容

Amazon的S3 API是对象存储领域的事实标准。MinIO是S3兼容性的事实上的标准,是第一个采用API和第一个添加对S3 Select支持的标准之一。包括微软Azure在内的750多家公司使用MinIO的S3网关,这一数字超过了业内其他公司的总和。

image.png

什么意思?就是说你现在为了节约成本使用MinIO,等你的公司壮大了、有钱了。不想自己运维基础设施了,你就可以把对象存储放到云上,只要云厂商支持S3标准,你的应用程序是不需要重新开发的。


二、MinIO的部署之Centos单机部署

此单机模式,每一份对象数据,minio直接在data目录下存储一份数据,不会建立副本,也不会启用纠删码机制(数据恢复),存在单点故障;

1、直接下载二进制执行文件,并启动:

文件下载地址:https://min.io/download#/linux

wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001"

image.png

后端调用就是9000端口,访问前端页面就是9001端口:

image.png

一切都是如此的简单!

编写一个后台运行的nohup脚本runminio.sh:

#!/bin/bash
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=Haier2022

nohup /usr/local/minio/minio server /mnt/data --console-address ":9001" > log.file 2>&1 &

#默认服务端口为9000,如果端口冲突,可以修改端口
nohup /usr/local/minio/minio server /mnt/data --address ":9999" --console-address ":9001" > log.file 2>&1 &

2、配置Minio的开机自启:

创建配置文件:minio.conf

[root@localhost minio]# mkdir /usr/local/minio/conf
[root@localhost minio]# vim /usr/local/minio/conf/minio.conf
MINIO_VOLUMES="/data/minio"
MINIO_OPTS="--console-address :9001"
MINIO_ROOT_USER="admin"
MINIO_ROOT_PASSWORD="Wolong2022"
MINIO_SERVER_URL="http://192.168.0.117:9000"

在/etc/systemd/system目录下新建一个服务minio.service 

[root@localhost minio]# vim /etc/systemd/system/minio.service
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/minio/minio

[Service]
User=root
Group=root
EnvironmentFile=/usr/local/minio/conf/minio.conf
ExecStart=/usr/local/minio/minio server $MINIO_OPTS $MINIO_VOLUMES

# Let systemd restart this service always
Restart=always
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target

3、启动minio并设置开机自启:

[root@localhost minio]# systemctl start minio
[root@localhost minio]# systemctl enable minio
Created symlink from /etc/systemd/system/multi-user.target.wants/minio.service to /etc/systemd/system/minio.service.
[root@localhost minio]# systemctl status minio
● minio.service - MinIO
   Loaded: loaded (/etc/systemd/system/minio.service; enabled; vendor preset: disabled)
   Active: active (running) since 二 2022-11-01 15:19:19 CST; 14s ago
     Docs: https://docs.min.io
 Main PID: 34443 (minio)
   CGroup: /system.slice/minio.service
           └─34443 /usr/local/minio/minio server --console-address :9001 /data/minio


三、MinIO的部署之Docker单机部署

此单机模式,每一份对象数据,minio直接在data目录下存储一份数据,不会建立副本,也不会启用纠删码机制(数据恢复),存在单点故障;

直接执行docker命令:

docker run -d \
  -p 9000:9000 \
  -p 9001:9001 \
  --name minio \
  -e "MINIO_ROOT_USER=admin" \
  -e "MINIO_ROOT_PASSWORD=password" \
  -v /mnt/data:/data \
  -v /mnt/config:/root/.minio \
  quay.io/minio/minio server /data --console-address ":9001"


四、MinIO的部署之纠删码模式部署

该部署模式使用纠删码(Reasure Code)和校验checksum来保护数据免受硬件故障或无声数据损坏,即使你丢了一般数量(N/2)的硬盘,你仍可以恢复数据!

纠删码技术的官方描述资料:http://docs.minio.org.cn/docs/master/minio-erasure-code-quickstart-guide

使用docker进行单机版的纠删码模式部署:

docker run -d \
  -p 9000:9000 \
  -p 9001:9001 \
  --name minio \
  -e "MINIO_ROOT_USER=admin" \
  -e "MINIO_ROOT_PASSWORD=password" \
  -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 \
  -v /mnt/config:/root/.minio \
  quay.io/minio/minio server /data{1...8} --console-address ":9001"

执行成功后,我们登录到后台,然后上传几个文件看看效果:

[root@node2 /]# tree /mnt
/mnt
├── config
│   └── certs
│       └── CAs
├── data
│   └── haier
│       ├── harbor-offline-installer-v1.10.10.tgz
│       ├── maven.jpeg
│       └── nexus3.jpg
├── data1
│   └── haier
│       ├── maven.jpeg
│       │   └── xl.meta
│       └── nexus3.jpg
│           └── xl.meta
├── data2
│   └── haier
│       ├── maven.jpeg
│       │   └── xl.meta
│       └── nexus3.jpg
│           └── xl.meta
├── data3
│   └── haier
│       ├── maven.jpeg
│       │   └── xl.meta
│       └── nexus3.jpg
│           └── xl.meta
├── data4
│   └── haier
│       ├── maven.jpeg
│       │   └── xl.meta
│       └── nexus3.jpg
│           └── xl.meta
├── data5
│   └── haier
│       ├── maven.jpeg
│       │   └── xl.meta
│       └── nexus3.jpg
│           └── xl.meta
├── data6
│   └── haier
│       ├── maven.jpeg
│       │   └── xl.meta
│       └── nexus3.jpg
│           └── xl.meta
├── data7
│   └── haier
│       ├── maven.jpeg
│       │   └── xl.meta
│       └── nexus3.jpg
│           └── xl.meta
└── data8
    └── haier
        ├── maven.jpeg
        │   └── xl.meta
        └── nexus3.jpg
            └── xl.meta

37 directories, 19 files

此时,我做了一次简单的测试,删盘(其实是删除文件夹):

  • 当我删除4个文件夹时候,数据依然可以正常访问;

  • 当我删除第5个文件夹时候,数据文法正常访问,UI页面无法登录,报错:

image.png


五、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处于实验阶段,请悠着点使用。

比如我打算用三台机器部署分布式集群,挂载6块盘

1、首先,在三台机器的 /usr/local/minio 目录下下载好我们的minio程序,并添加环境变量:

chmod +x minio
export MINIO_ROOT_USER=admin 
export MINIO_ROOT_PASSWORD=Haier2022

2、在每台机器上,都执行以下命令,启动集群:

nohup /usr/local/minio/minio server --config-dir /minio/config --address ':9000' --console-address ':9001' \
http://10.206.73.154/minio/data1 http://10.206.73.154/minio/data2\
http://10.206.73.155/minio/data1 http://10.206.73.155/minio/data2\
http://10.206.73.156/minio/data1 http://10.206.73.156/minio/data2> /usr/local/minio/log.file 2>&1 &

但是当我们执行时,经常会碰到这个问题:

image.png

即必须要使用新的挂载磁盘,不可以使用与系统root目录相同的磁盘;这时候我们就要想办法先给系统挂载一块新磁盘到 /minio 目录上,之后才能进行之后的操作了!

3、挂载完了,但是我只有一块机器有磁盘,将就一下:

nohup /usr/local/minio/minio server --config-dir /minio/config --address ':9000' --console-address ':9001' \
http://10.206.73.156/minio/data1 http://10.206.73.156/minio/data2 \
http://10.206.73.156/minio/data3 http://10.206.73.156/minio/data4 \
http://10.206.73.156/minio/data5 http://10.206.73.156/minio/data6> /usr/local/minio/log.file 2>&1 &

image.png

4、在minio的9001面板中,对服务进行监控:

image.png


六、MinIO如何配置公共读/私有写权限(最常见)

首先,需要了解MinIO基于策略的权限控制系统(PBAC)

1、首先我们将创建的bucket桶,设置为private:

默认就是private,就不截图了!

2、在匿名(Anonymous)下添加一个 * 只读权限,即可实现公共读:

1707025782104187.png

3、创建一个自己的AccessKey,并配置对应的PBAC权限:

PBAC权限的格式是简单的json,很容易理解:

默认创建的AccessKey的标准权限很多,如下:

{
    "Version":"2012-10-17",
    "Statement":[
        Object{...},
        {
            "Effect":"Allow",
            "Action":[
                "admin:*"
            ]
        },
        {
            "Effect":"Allow",
            "Action":[
                "kms:*"
            ]
        },
        {
            "Effect":"Allow",
            "Action":[
                "s3:*"
            ],
            "Resource":[
                "arn:aws:s3:::*"
            ]
        },
        {
            "Effect":"Allow",
            "Action":[
                "s3:PutObject"
            ],
            "Resource":[
                "arn:aws:s3:::*"
            ]
        },
        {
            "Effect":"Allow",
            "Action":[
                "s3:GetObject",
                "s3:GetBucketLocation"
            ],
            "Resource":[
                "arn:aws:s3:::*"
            ]
        }
    ]
}

我们可以简化一下,只留自己需要的权限,一版对于AccessKey,我们只会保留简单的“文件上传PutObejct”和“文件查看GetObject”权限:

{
    "Version":"2012-10-17",
    "Statement":[
        {
            "Effect":"Allow",
            "Action":[
                "s3:PutObject"
            ],
            "Resource":[
                "arn:aws:s3:::jiguiquan/*"
            ]
        },
        {
            "Effect":"Allow",
            "Action":[
                "s3:GetObject",
                "s3:GetBucketLocation"
            ],
            "Resource":[
                "arn:aws:s3:::*"
            ]
        }
    ]
}

注意其中的“jiguiquan/*”代表,jiguiquan这个桶下面的所有路径!

这样就实现了“公共读,授权写”的功能,且使用此accessKey只有jiguiquan这个桶的上传权限!—— 正常工作中,做到这和个程度就OK了!

jiguiquan@163.com

文章作者信息...

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

相关推荐