【对象存储】一文搞懂MinIO部署与使用

TangLu 服务部署 2024-07-16 206 0

一、MinIO简介

MinIO是一款开源的对象存储系统(Object Storage),号称世界上最快的对象存储,在特定环境下GET/PUT的结果可达325GiB/S和165GiB/S对象存储的出现解决了传统存储如NAS、SAN的容量和性能不足的问题,与传统文件存储不同的地方在于它是以对象为单位来存储和检索数据,每个对象都包含了数据本身和元数据,每个对象都包含了数据本身和元数据。元数据主要包括对象的描述信息,如用户(accout)、存储桶(bucket)以及索引(index)等,而数据则包含了各种格式,比如文本、语音、图像、视频和其他非结构化数据。

国内外比较知名的对象存储有阿里云OSS,AWS S3(2006年随着S3的出现开始定义了对象存储这个概念,而MinIO则可以完全兼容S3接口)。MinIO支持的对象文件大小可以从KB级到TB级,客户端则是通过唯一标识来识别每个对象,被上传的对象会被分片存放在每个节点、每个磁盘下以bucket命名的目录中,并且会以每个文件的名字再生成一个子目录,目录下就是被拆分后的数据(xl.meta),该文件无法直接阅读。比如上传一个20M大小名为test.txt的文件到test这个bucket中,那么MinIO各节点的目录树结构为/data/test/test.txt/xl.meta,总占用大小大概在40M左右。


二、MinIO纠删码

MinIO有一个最重要的特性就是通过纠删码(Erasure Code,简称EC)来最大化确保数据的安全(至少需要4块磁盘才能使用纠删码特性,不管是单机多磁盘还是多机多磁盘都一样)。该模式会将对象拆分成N/2份数据和N/2分奇偶校验块,然后分散存储在不同的磁盘上,这样部分磁盘损坏也可以通过剩余的数据块和校验块恢复数据。举例来说,假设有12块磁盘组成了MinIO集群,存储的对象就会被分成6个数据块和6个校验块,然后任意损坏6块磁盘(不管是数据盘还是校验盘)都可以保证数据不丢失。


三、MinIO的安装

1、通过MinIO官网(https://min.io/)找到客户端和服务端的下载页面

minio1.png


2、下载MinIO服务端和客户端的二进制文件

#服务端
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
mv /usr/local/src/minio /usr/local/bin/minio

#客户端
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
mv /usr/local/src/mc /usr/local/bin/mc


四、运行MinIO

1、单机模式(仅供测试)

服务启动后可以看到API地址、控制台地址等信息

MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001"
# MINIO_ROOT_USER:minio管理账号
# MINIO_ROOT_PASSWORD:minio管理密码
# /mnt/data:数据存放目录
# --console-address:控制台监听地址和端口


2、单机多磁盘模式(存在单节点故障)

需要提前做好磁盘分区和格式再进行启动

nohup ./minio server --console-address ":9091" /data/{1..12} > /tmp/min.lo 2>&1 &


3、多节点多磁盘的分布式集群模式(生产推荐)

分布式Minio官方建议生产环境最少4个节点,因为有N个节点,得至少保证有N/2的节点才能可读,保证至少N/2+1的节点才能可写。

1、配置启动脚本

cat /usr/lib/systemd/system/minio.service 
[Unit]
Description=MinIO
Documentation=https://minio.org.cn/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
WorkingDirectory=/usr/local
User=minio-user
Group=minio-user
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

Restart=always
LimitNOFILE=65536
TasksMax=infinity
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

# Built for ${project.name}-${project.version} (${project.name})


2、设置MinIO用户和组,启动脚本依赖该账号

groupadd -r minio-user
useradd -M -r -g minio-user minio-user
chown -R minio-user:minio-user /data2 /data3 /data4 /data5


3、创建变量配置文件,MinIO启动的时候会依赖

cat /etc/default/minio 
MINIO_VOLUMES="http://192.168.254.20{1...3}:9000/data{1...4}"
MINIO_OPTS="--console-address :9001"
MINIO_ROOT_USER=tanglu
MINIO_ROOT_PASSWORD=123456789
#MINIO_SERVER_URL="http://minio.example.net:9000"


4、每个节点启动服务,运行后初始的报错可以忽略,因为还没有建立好连接

systemctl start minio
tailf /var/log/messages


5、非脚本启动命令

MINIO_ROOT_USER="admin" MINIO_ROOT_PASSWORD="123456789" minio server --console-address ":9001" \
http://192.168.254.101:9000/data2 http://192.168.254.101:9000/data3  http://192.168.254.101:9000/data4 http://192.168.254.101:9000/data5  \
http://192.168.254.102:9000/data2 http://192.168.254.102:9000/data3  http://192.168.254.102:9000/data4 http://192.168.254.102:9000/data5  \
http://192.168.254.103:9000/data2 http://192.168.254.103:9000/data3  http://192.168.254.103:9000/data4 http://192.168.254.103:9000/data5


五、MinIO的命令行管理

1、集群别名管理

集群设置别名,只有设置了别名后才能纳入集群管理。这里创建的集群名为myminio,所以后续都用这个集群名进行演示

# 为集群创建别名
mc alias set myminio http://192.168.254.201:9000 tanglu 123456789

#查看纳入管理的集群
mc alias list

#删除别名
mc alias remove myminio


2、查看指定集群下的bucket列表

# 命令语法:mc ls [alias_name]
mc ls myminio


3、查看指定集群下指定bucket的大小

mc du myminio/test1


4、mc admin命令

用于对集群进行查看和管理,比如节点信息、磁盘信息、集群用量信息等

#查看指定集群的详细状态
mc admin info myminio

minio2.png


5、查看MinIO日志

mc admin logs myminio


6、恢复集群数据

mc admin heal -r [alias_name]/[bucket_name]


7、MinIO用户管理

mc admin user COMMAND
# COMMANDS:                                                                                                       
# add       添加用户                                                                                    
# disable     禁用用户                                                                                      
# enable      启用用户                                                                                       
# remove, rm    删除用户                                                                                       
# list, ls    列出所有用户                                                                                    
# info       查看用户信息                                                                            
# policy      导出用户策略为JSON文档                                                               
# svcacct     manage service accounts                                                                           
# sts         manage STS accounts

#查看指定集群下的所有用户
mc admin user list myminio

#在指定集群下创建用户
mc admin user add myminio tanglu 123456789

#查看用户Access Key、所属Policy等信息
mc admin user info myminio user1


8、MinIO权限管理

完成MinIO用户创建后就需要进行授权了,但是MinIO在权限配置上不是很友好,需要自己来定义Policy策略。默认提供了readonly、readwritewriteonlyconsoleAdmindiagnostics几个Policy。

· 查看指定 MinIO 集群下拥有的策略组

mc admin policy list myminio


· 创建一个对test这个bucket下的对象有读取权限的策略,但是不可上传、下载和删除

cat readonly-tanglu.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::test1",
                "arn:aws:s3:::test1/*"
            ]
        }
    ]
}


· 创建一个对tanglu这个bucket有读写权限的策略配置

cat readwrite-tanglu.json
{
  "Version": "2012-10-17",                    #策略语言的版本日期,默认使用这个即可
  "Statement": [
    {
      "Effect": "Allow",                      #策略效果,allow是允许,deny是拒绝
      "Action": [          
        "s3:GetObject",                       #允许读取对象
        "s3:PutObject",                       #允许写入对象
        "s3:DeleteObject",                    #允许删除对象
        "s3:ListBucket"                       #允许列出对象
      ],
      "Resource": [
        "arn:aws:s3:::tanglu",                  #指定了名为 tanglu 存储桶
        "arn:aws:s3:::tanglu/*"                 #指定了名为 tanglu 存储桶中的所有资源
      ]
    }
  ]
}


· 将创建的 readonly-tanglu、readwrite-tanglu 策略添加到 MinIO 中

mc admin policy create myminio readwrite-tanglu readwrite-tanglu.json
mc admin policy create myminio readonly-tanglu readonly-tanglu.json


· 将用户加入到指定 readwrite-tanglu 策略组

mc admin policy attach myminio readwrite-tanglu --user tanglu


六、MinIO常见问题

1、如果服务启动时出现Authentication failed问题,可以优先检查防火墙是否关闭以及节点间时间是否同步,一定配置好NTP服务。


2、服务启动时告警Detected Linux kernel version older than 4.0.0 release, there are some known potential performance problems with this kernel version. MinIO recommends a minimum of 4.x.x linux kernel version for best performance。如果是CentOS7系统,请将内核版本升级


3、MinIO不会自动重平衡,即不会将对象从旧的节点中迁移到新的节点。但是,MinIO会根据存储空闲大小进行加权选择,加权值是节点的空闲空间量除以所有可用池上的空闲空间。除了可用空间加权,如果继续写入文件会使得磁盘使用率超过99%或者空闲的inode计数低于1000,同样不会再往该节点写入数据

例如目前集群有3个Server Pool:
Pool A has 3 TiB of free space
Pool B has 2 TiB of free space
Pool C has 5 TiB of free space

Minio分别向各个Pool中写入的概率为:
Pool A:30% = 3 / (3 + 2 + 5)
Pool B:20% = 2 / (3 + 2 + 5)
Pool C:50% = 5 / (3 + 2 + 5)


4、如果出现磁盘损坏,可以直接格式化新的磁盘并进行挂载进行替换,替换后数据会自动同步,如果日志出现Error: file access denied,将目录属主修改为minio-user(启动脚本里使用到的用户)

评论