前言:
minio是一个非常轻量化的对象存储服务,是可以算到云原生领域的。
该服务是使用go语言编写的,因此,主文件就一个文件,它的下载,部署什么的都是非常简单的,一般两三步就可以搭建好了,只是有一些细节问题需要在部署使用的时候注意。
本文将就一个可用的minio存储服务部署做一个尽量详细的讲解,并探讨如何将该技术落地。
一,
minio的简介
MinIO现在也是CNCF成员,在云原生存储部分和ceph等一起作为目前的解决方案之一,因此,该服务的一个落地方向是应用在云计算以及云原生的服务编排管理系统kubernetes内的,其次,该服务可以作为一个简单的类ftp服务器(平常给服务器传个文件还是比较方便的)
但由于存储服务的自身特性(与宿主机的操作系统联系紧密,一般是底层服务),因此,该服务爆出的漏洞通常也是比较高危的,因此,我们使用minio这种服务特别需要注意版本问题,推荐使用高版本(高版本的漏洞比较少嘛),如果是实验,测试性质,那么,版本无所谓了。(漏洞相关问题就不在这里啰嗦了,百度一大堆)
其实官网介绍的就比较详细了,官网地址:MinIO | 高性能, Kubernetes 原生对象存储
下载地址:MinIO中国镜像站
二,
minio的部署方式
1 ,rpm部署
这个没什么好说的,简单,方便,但不可定制,在上面的官方下载网站上就有
下载地址:https://dl.minio.org.cn/server/minio/release/linux-amd64/minio-20230413030807.0.0.x86_64.rpm
安装rpm包并查询出自启脚本位置和执行程序位置并加入启动
[root@EULEER ~]# rpm -ivh minio-20230413030807.0.0.x86_64.rpm Preparing... ################################# [100%] Updating / installing... 1:minio-0:20230413030807.0.0-1 ################################# [100%] [root@EULEER ~]# rpm -ql minio-20230413030807.0.0-1.x86_64 /etc/systemd/system/minio.service /usr/local/bin/minio [root@EULEER ~]# systemctl enable minio Created symlink from /etc/systemd/system/multi-user.target.wants/minio.service to /etc/systemd/system/minio.service.
根据自启脚本编写配置文件,自启脚本内容如下:
##需要注意的是,User和Group已被我修改成了minio
[root@EULEER ~]# cat /etc/systemd/system/minio.service [Unit] Description=MinIO Documentation=https://docs.min.io Wants=network-online.target After=network-online.target AssertFileIsExecutable=/usr/local/bin/minio [Service] WorkingDirectory=/usr/local User=minio Group=minio ProtectProc=invisible EnvironmentFile=-/etc/default/minio ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi" ExecStart=/usr/local/bin/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=1048576 # Specifies the maximum number of threads this process can create TasksMax=infinity # Disable timeout logic and wait until process is stopped TimeoutStopSec=infinity SendSIGKILL=no [Install] WantedBy=multi-user.target # Built for ${project.name}-${project.version} (${project.name})
OK,根据以上脚本内容,添加普通用户minio(此用户无登陆权限,可以提高系统的安全),并创建minio服务的配置文件:/etc/default/minio
useradd -M -s /bin/nologin
配置文件定义minio使用/data1目录,服务开放端口是39111,web端的登陆用户为minio,密码我这里省略了。
####注:data1这个目录不是随便来的,官方通常建议是用一个单独的硬盘内的目录,实际的生产中肯定是使用数据盘的,(如何挂载数据盘这里就不废话了)。如果集群的话,不使用数据盘,那么,minio会报错数据目录不能和root根文件系统在同一个磁盘,需要使用单独的磁盘,否则启动失败。见下图(双硬盘,一个盘挂载到data1目录下的):
[root@EULEER ~]# cat /etc/default/minio MINIO_VOLUMES="/data1" MINIO_OPTS="--address :39111" MINIO_ACCESS_KEY=minio MINIO_SECRET_KEY=密码
新建上述的data1目录并赋权给minio这个用户,需要注意,/data1这个目录必须是空目录:
mkdir /data1 chown -Rf minio. /data1
以上工作完成后,就可以启动minio服务并打开浏览器登陆minio的客户端了,登陆地址是服务器地址+39111:
服务启动和服务状态:
systemctl start minio [root@EULEER ~]# systemctl status minio ● minio.service - MinIO Loaded: loaded (/etc/systemd/system/minio.service; enabled; vendor preset: disabled) Active: active (running) since Thu 2023-05-18 05:56:36 CST; 9min ago Docs: https://docs.min.io Process: 5063 ExecStartPre=/bin/bash -c if [ -z "${MINIO_VOLUMES}" ]; then echo "Variable MINIO_VOLUMES not set in /etc/default/minio"; exit 1; fi (code=exited, status=0/SUCCESS) Main PID: 5064 (minio) CGroup: /system.slice/system-hostos.slice/minio.service └─5064 /usr/local/bin/minio server --address :39111 /data1 May 18 05:56:37 EULEER minio[5064]: Copyright: 2015-2023 MinIO, Inc. May 18 05:56:37 EULEER minio[5064]: License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html> May 18 05:56:37 EULEER minio[5064]: Version: RELEASE.2023-04-13T03-08-07Z (go1.20.3 linux/amd64) May 18 05:56:37 EULEER minio[5064]: Status: 1 Online, 0 Offline. May 18 05:56:37 EULEER minio[5064]: API: http://192.168.76.11:39111 http://127.0.0.1:39111 May 18 05:56:37 EULEER minio[5064]: Console: http://192.168.76.11:42317 http://127.0.0.1:42317 May 18 05:56:37 EULEER minio[5064]: Documentation: https://min.io/docs/minio/linux/index.html May 18 05:56:37 EULEER minio[5064]: Warning: The standard parity is set to 0. This can lead to data loss. May 18 05:56:38 EULEER minio[5064]: You are running an older version of MinIO released 3 weeks ago May 18 05:56:38 EULEER minio[5064]: Update: Run `mc admin update`
浏览器的状态:
上图停留的标签在创建桶,具体的创建桶流程如下:
- bucket name:bucket名字。
- versioning: 版本控制允许在同一个键下保留同一个对象的多个版本。
- object locking:对象锁定防止对象被删除。需要支持保留和合法持有。只能在创建桶时启用。
- quota:配额用于限制桶内的数据量。
- retention:保留是指在一段时间内防止对象删除的规则。为了设置桶保留策略,必须启用版本控制。
由于minio安装太过于容易了,因此,难度其实在后面的使用,比如,安全方面的设置,权限方面的设置,审计的设置这些。
下面以审计功能为例,讲解如何配置minio的审计功能:
可以看到审计在这里叫消息,不过无所谓,叫什么不重要。minio支持的审计存储很多,刚好我有安装redis,就用redis吧,
redis开启的端口如下:
[root@EULEER yum.repos.d]# netstat -antup |grep redis tcp 0 0 192.168.76.11:15379 0.0.0.0:* LISTEN 5581/./redis-server tcp 0 0 192.168.76.11:15379 192.168.76.1:51519 ESTABLISHED 5581/./redis-server tcp 0 0 192.168.76.11:15379 192.168.76.1:51542 ESTABLISHED 5581/./redis-server tcp 0 0 192.168.76.11:15379 192.168.76.1:51570 ESTABLISHED 5581/./redis-server tcp 0 0 192.168.76.11:15379 192.168.76.1:51541 ESTABLISHED 5581/./redis-server tcp 0 0 192.168.76.11:15379 192.168.76.1:51689 ESTABLISHED 5581/./redis-server
回到minio,点击redis的图标,进入如下界面:
保存后,显示一个警告,意思需要重启minio服务以应用刚才修改的配置,点restart就重启服务了:
重启完毕后就可以看到有显示redis了:
还差最后一哆嗦,桶指定消息源:
把增删改勾选了,第一个选择redis,保存即可:
随意上传和删除两个文件,在看redis,大概如下:
二,
OK,以上的安装部署是只有一个drive data1(minio将存放文件的文件夹叫drive)
那么,如何多drive呢?
其实,很简单的,其它的地方都不变,配置文件增加一组文件夹即可(注意是空格隔开,不是分号哦):
[root@EULEER data1]# cat /etc/default/minio MINIO_VOLUMES="/data1/test1 /data1/test2 /data1/test3 /data1/test4" MINIO_OPTS="--address :39111" MINIO_ACCESS_KEY=minio MINIO_SECRET_KEY=shiguang32
那么,我们还需要建立实际存在的上述目录并且给这些目录赋予给启动脚本内定义的那个用户,本例是minio:
mkdir /data1/test{1..4} chown -Rf minio. /data1/
再次启动minio服务,可以看到以下内容:
[root@EULEER data1]# ls -al total 4 drwxr-xr-x 7 minio minio 76 May 19 09:37 . dr-xr-xr-x. 22 root root 4096 May 17 10:31 .. drwxr-xr-x 7 minio minio 98 May 18 10:42 .minio.sys drwx------ 4 minio minio 36 May 19 09:52 test1 drwx------ 4 minio minio 36 May 19 09:52 test2 drwx------ 4 minio minio 36 May 19 09:52 test3 drwx------ 4 minio minio 36 May 19 09:52 test4
[root@EULEER data1]# tree -a --dirsfirst \./ ./ ├── .minio.sys │ ├── buckets │ │ ├── .bloomcycle.bin │ │ │ └── xl.meta │ │ ├── test │ │ │ ├── .metadata.bin │ │ │ │ └── xl.meta │ │ │ └── .usage-cache.bin │ │ │ └── xl.meta │ │ ├── .usage-cache.bin │ │ │ └── xl.meta │ │ └── .usage.json │ │ └── xl.meta │ ├── config │ │ ├── config.json │ │ │ └── xl.meta │ │ ├── history │ │ │ ├── 1ab6e422-56c1-4777-8869-21ccafdfe6c6.kv │ │ │ │ └── xl.meta │ │ │ └── 67f69168-adcc-45e5-a5c6-a49ad6c1afa8.kv │ │ │ └── xl.meta │ │ └── iam │ │ ├── format.json │ │ │ └── xl.meta │ │ └── sts │ │ └── RR5YLHZGDAC64AIGJ3U2 │ │ └── identity.json │ │ └── xl.meta │ ├── multipart │ ├── pool.bin │ │ └── xl.meta │ ├── tmp │ │ └── .trash │ └── format.json ├── test1 │ ├── .minio.sys │ │ ├── buckets │ │ │ ├── .background-heal.json │ │ │ │ └── xl.meta │ │ │ ├── .bloomcycle.bin │ │ │ │ └── xl.meta │ │ │ ├── test │ │ │ │ ├── .metadata.bin │ │ │ │ │ └── xl.meta │ │ │ │ └── .usage-cache.bin │ │ │ │ └── xl.meta │ │ │ ├── .usage-cache.bin │ │ │ │ └── xl.meta │ │ │ └── .usage.json │ │ │ └── xl.meta │ │ ├── config │ │ │ ├── config.json │ │ │ │ └── xl.meta │ │ │ └── iam │ │ │ ├── format.json │ │ │ │ └── xl.meta │ │ │ └── sts │ │ │ └── 0ESAM6BK1PEF87AZ59E2 │ │ │ └── identity.json │ │ │ └── xl.meta │ │ ├── multipart │ │ ├── pool.bin │ │ │ └── xl.meta │ │ ├── tmp │ │ │ └── .trash │ │ └── format.json │ └── test ├── test2 │ ├── .minio.sys │ │ ├── buckets │ │ │ ├── .background-heal.json │ │ │ │ └── xl.meta │ │ │ ├── .bloomcycle.bin │ │ │ │ └── xl.meta │ │ │ ├── test │ │ │ │ ├── .metadata.bin │ │ │ │ │ └── xl.meta │ │ │ │ └── .usage-cache.bin │ │ │ │ └── xl.meta │ │ │ ├── .usage-cache.bin │ │ │ │ └── xl.meta │ │ │ └── .usage.json │ │ │ └── xl.meta │ │ ├── config │ │ │ ├── config.json │ │ │ │ └── xl.meta │ │ │ └── iam │ │ │ ├── format.json │ │ │ │ └── xl.meta │ │ │ └── sts │ │ │ └── 0ESAM6BK1PEF87AZ59E2 │ │ │ └── identity.json │ │ │ └── xl.meta │ │ ├── multipart │ │ ├── pool.bin │ │ │ └── xl.meta │ │ ├── tmp │ │ │ └── .trash │ │ └── format.json │ └── test ├── test3 │ ├── .minio.sys │ │ ├── buckets │ │ │ ├── .background-heal.json │ │ │ │ └── xl.meta │ │ │ ├── .bloomcycle.bin │ │ │ │ └── xl.meta │ │ │ ├── test │ │ │ │ ├── .metadata.bin │ │ │ │ │ └── xl.meta │ │ │ │ └── .usage-cache.bin │ │ │ │ └── xl.meta │ │ │ ├── .usage-cache.bin │ │ │ │ └── xl.meta │ │ │ └── .usage.json │ │ │ └── xl.meta │ │ ├── config │ │ │ ├── config.json │ │ │ │ └── xl.meta │ │ │ └── iam │ │ │ ├── format.json │ │ │ │ └── xl.meta │ │ │ └── sts │ │ │ └── 0ESAM6BK1PEF87AZ59E2 │ │ │ └── identity.json │ │ │ └── xl.meta │ │ ├── multipart │ │ ├── pool.bin │ │ │ └── xl.meta │ │ ├── tmp │ │ │ └── .trash │ │ └── format.json │ └── test └── test4 ├── .minio.sys │ ├── buckets │ │ ├── .background-heal.json │ │ │ └── xl.meta │ │ ├── .bloomcycle.bin │ │ │ └── xl.meta │ │ ├── test │ │ │ ├── .metadata.bin │ │ │ │ └── xl.meta │ │ │ └── .usage-cache.bin │ │ │ └── xl.meta │ │ ├── .usage-cache.bin │ │ │ └── xl.meta │ │ └── .usage.json │ │ └── xl.meta │ ├── config │ │ ├── config.json │ │ │ └── xl.meta │ │ └── iam │ │ ├── format.json │ │ │ └── xl.meta │ │ └── sts │ │ └── 0ESAM6BK1PEF87AZ59E2 │ │ └── identity.json │ │ └── xl.meta │ ├── multipart │ ├── pool.bin │ │ └── xl.meta │ ├── tmp │ │ └── .trash │ └── format.json └── test 110 directories, 56 files
OK,启动minio的服务,随意创建一个桶,然后随意上传一个文件后,再次查看文件夹:
[root@EULEER data1]# tree -a --dirsfirst ./ ./ ├── .minio.sys │ ├── buckets │ │ ├── .bloomcycle.bin │ │ │ └── xl.meta │ │ ├── test │ │ │ ├── .metadata.bin │ │ │ │ └── xl.meta │ │ │ └── .usage-cache.bin │ │ │ └── xl.meta │ │ ├── .usage-cache.bin │ │ │ └── xl.meta │ │ └── .usage.json │ │ └── xl.meta │ ├── config │ │ ├── config.json │ │ │ └── xl.meta │ │ ├── history │ │ │ ├── 1ab6e422-56c1-4777-8869-21ccafdfe6c6.kv │ │ │ │ └── xl.meta │ │ │ └── 67f69168-adcc-45e5-a5c6-a49ad6c1afa8.kv │ │ │ └── xl.meta │ │ └── iam │ │ ├── format.json │ │ │ └── xl.meta │ │ └── sts │ │ └── RR5YLHZGDAC64AIGJ3U2 │ │ └── identity.json │ │ └── xl.meta │ ├── multipart │ ├── pool.bin │ │ └── xl.meta │ ├── tmp │ │ └── .trash │ └── format.json ├── test1 │ ├── .minio.sys │ │ ├── buckets │ │ │ ├── .background-heal.json │ │ │ │ └── xl.meta │ │ │ ├── .bloomcycle.bin │ │ │ │ └── xl.meta │ │ │ ├── test │ │ │ │ ├── .metadata.bin │ │ │ │ │ └── xl.meta │ │ │ │ └── .usage-cache.bin │ │ │ │ └── xl.meta │ │ │ ├── .usage-cache.bin │ │ │ │ └── xl.meta │ │ │ └── .usage.json │ │ │ └── xl.meta │ │ ├── config │ │ │ ├── config.json │ │ │ │ └── xl.meta │ │ │ └── iam │ │ │ ├── format.json │ │ │ │ └── xl.meta │ │ │ └── sts │ │ │ └── 0ESAM6BK1PEF87AZ59E2 │ │ │ └── identity.json │ │ │ └── xl.meta │ │ ├── multipart │ │ ├── pool.bin │ │ │ └── xl.meta │ │ ├── tmp │ │ │ └── .trash │ │ └── format.json │ └── test │ └── \351\242\234\350\211\262.png │ └── xl.meta ├── test2 │ ├── .minio.sys │ │ ├── buckets │ │ │ ├── .background-heal.json │ │ │ │ └── xl.meta │ │ │ ├── .bloomcycle.bin │ │ │ │ └── xl.meta │ │ │ ├── test │ │ │ │ ├── .metadata.bin │ │ │ │ │ └── xl.meta │ │ │ │ └── .usage-cache.bin │ │ │ │ └── xl.meta │ │ │ ├── .usage-cache.bin │ │ │ │ └── xl.meta │ │ │ └── .usage.json │ │ │ └── xl.meta │ │ ├── config │ │ │ ├── config.json │ │ │ │ └── xl.meta │ │ │ └── iam │ │ │ ├── format.json │ │ │ │ └── xl.meta │ │ │ └── sts │ │ │ └── 0ESAM6BK1PEF87AZ59E2 │ │ │ └── identity.json │ │ │ └── xl.meta │ │ ├── multipart │ │ ├── pool.bin │ │ │ └── xl.meta │ │ ├── tmp │ │ │ └── .trash │ │ └── format.json │ └── test │ └── \351\242\234\350\211\262.png │ └── xl.meta ├── test3 │ ├── .minio.sys │ │ ├── buckets │ │ │ ├── .background-heal.json │ │ │ │ └── xl.meta │ │ │ ├── .bloomcycle.bin │ │ │ │ └── xl.meta │ │ │ ├── test │ │ │ │ ├── .metadata.bin │ │ │ │ │ └── xl.meta │ │ │ │ └── .usage-cache.bin │ │ │ │ └── xl.meta │ │ │ ├── .usage-cache.bin │ │ │ │ └── xl.meta │ │ │ └── .usage.json │ │ │ └── xl.meta │ │ ├── config │ │ │ ├── config.json │ │ │ │ └── xl.meta │ │ │ └── iam │ │ │ ├── format.json │ │ │ │ └── xl.meta │ │ │ └── sts │ │ │ └── 0ESAM6BK1PEF87AZ59E2 │ │ │ └── identity.json │ │ │ └── xl.meta │ │ ├── multipart │ │ ├── pool.bin │ │ │ └── xl.meta │ │ ├── tmp │ │ │ └── .trash │ │ └── format.json │ └── test │ └── \351\242\234\350\211\262.png │ └── xl.meta └── test4 ├── .minio.sys │ ├── buckets │ │ ├── .background-heal.json │ │ │ └── xl.meta │ │ ├── .bloomcycle.bin │ │ │ └── xl.meta │ │ ├── test │ │ │ ├── .metadata.bin │ │ │ │ └── xl.meta │ │ │ └── .usage-cache.bin │ │ │ └── xl.meta │ │ ├── .usage-cache.bin │ │ │ └── xl.meta │ │ └── .usage.json │ │ └── xl.meta │ ├── config │ │ ├── config.json │ │ │ └── xl.meta │ │ └── iam │ │ ├── format.json │ │ │ └── xl.meta │ │ └── sts │ │ └── 0ESAM6BK1PEF87AZ59E2 │ │ └── identity.json │ │ └── xl.meta │ ├── multipart │ ├── pool.bin │ │ └── xl.meta │ ├── tmp │ │ └── .trash │ └── format.json └── test └── \351\242\234\350\211\262.png └── xl.meta 114 directories, 60 files
把test1文件夹下的那个png文件删除,稍等几秒,文件会自动恢复:
[root@EULEER data1]# rm -rf test1/test/颜色.png/ [root@EULEER data1]# ls -al !$ ls -al test1/test/颜色.png/ ls: cannot access test1/test/颜色.png/: No such file or directory #等待几秒后,发现文件回来了 [root@EULEER data1]# ls -al test1/test/颜色.png/ total 28 drwxr-xr-x 2 minio minio 21 May 19 10:33 . drwxr-xr-x 3 minio minio 24 May 19 10:33 .. -rw-r--r-- 1 minio minio 28337 May 19 10:33 xl.meta
OK,一个高可用的分布式minio集群就搭建完毕了,当然,drive可以在几台服务器上,均匀分布,下面一节说如何完全意义的分布式minio集群。