MinIO 集群安装部署

Posted on 2020-09-14,10 min read

1 简介
MinIO 是为海量数据存储、人工智能、大数据分析而设计的,基于 Apache License v2.0 开源协议的分布式对象存储系统,它完全兼容 Amazon S3 接口,适合存储海量图片、视频、日志文件、

备份数据和容器/虚拟机镜像等,单个对象的大小可以从几KB到最大5TB。

MinIO 采用 Golang 语言实现,整个系统都运行在操作系统的用户态空间,客户端与服务器之间采用HTTP/HTTPS通信协议。

与之类似的分布式存储产品还有:Ceph、GlusterFS、Sheepdog、Lustre、Swift、Cinder、TFS、HDFS、MooseFS、FastDFS、MogileFS 等。综合对比各方面因素,MinIO 的主要优势在于:

1)部署简单

MinIO 仅有 minio 一个可执行文件,基本不依赖其它共享库或者rpm/apt包。

2)配置简单

MinIO 的配置项很少,大部分都是内核之类系统级的设置,甚至不配置也可以正常运行起来。百度、Google 上基本没有关于MinIO部署问题的网页,可见在实践中,很少有遇到这方面的问题。

相比之下其他分布式文件系统的安装配置要复杂得多,如:FastDFS、Ceph。

3)二次开发容易

MinIO 除了极少数代码使用汇编实现以外,其他全部使用 Golang 实现。因此系统的维护、二次开发比较容易。另外支持多种客户端语言 SDK,包括:JavaScript、Java、Python、

Golang、.NET、Haskell

4)支持多种存储

通过网关模式,MinIO 可以对接各种现有的常见存储类型,如 NAS、亚马逊S3、微软Azure Blob、Google 云存储、HDFS、阿里巴巴OSS 等,非常有利于企业复用现有资源,低成本(硬件成本

约等于零,部署MinIO 即可)的从传统的文件系统平滑升级到分布式存储存储。

综合对比,目前 MinIO 都可作为开源分布式存储系统的首选。

参考:

MinIO 官网:https://min.io

文档地址:https://docs.min.io/

中文文档地址:https://docs.min.io/cn

2 集群安装部署
MinIO 有两种集群部署方式,一种是本地集群部署,最为常见。一种是联盟模式部署。

本地集群部署方式在本地服务器节点部署 MinIO,组成分布式集群,提供统一命名空间和标准 S3 访问接口。

联盟部署模式将多个 MinIO 本地集群在逻辑上组成统一命名空间,实现近乎无限的扩展与海量规模的数据管理,这些集群可以都在本地,或者分布在不同地域的数据中心。

下面的部署以本地集群部署为准,相关说明及注意事项如下:

1)MinIO 集群最少需要 4 块磁盘,单机不限制

2)对于一个租户(每个租户对应一个用户名/密码)最多只能有 16 块磁盘(受纠删码技术限制)

3)默认情况下,如果有 N 块磁盘,那么每个文件将被平均分为 N/2 个分片分别存储在 N/2 个节点上,其余 N/2 个节点存放对应的纠删码。这样,最多能保证 N/2 块磁盘坏掉,系统仍能提供

读文件功能,但是无法提供写功能。如果要求写功能正常,则集群中至少有 N/2 + 1 块磁盘可用

4)N 块磁盘可以在集群的节点中随意挂载,比如,对于4块磁盘,既可以部署为4个节点,每个节点1块磁盘的集群,也可以部署为2个节点,每个节点2块磁盘的集群

MinIO 支持二进制方式安装和 Docker 方式安装。在开发和测试环境下,使用 Docker 方式更加简便,但是在正式的生产环境中,应使用二进制方式安装。

不只是 MinIO,凡是涉及持久化数据存储的服务,例如关系数据库、Redis、RabbitMQ 等,在生产环境下,都强烈不建议使用 Docker 方式安装部署。

下面介绍二进制方式的集群安装。

2.1 集群节点规划
现在以 2 个节点,每个节点挂载 2 块硬盘的 MinIO 集群为例进行说明。节点列表如下:

节点IP 操作系统 磁盘挂载点 开放的端口
10.213.120.11 CentOS 7.4+,64位 /usr/local/minio/data1 /usr/local/minio/data2 9000
10.213.120.12 CentOS 7.4+,64位 /usr/local/minio/data1 /usr/local/minio/data2 9000
说明:

1)在开发和测试环境中,磁盘挂载点可以为服务器中的一个任意目录,如上表中的 /usr/local/minio/data1,但是在正式环境中,必须为实际的磁盘挂载点

2)MinIO 服务器默认HTTP通信端口为 9000(也可以在启动时指定为其他端口),因此所在服务器的防火墙中必须开启 9000 TCP端口

2.2 开放必要的端口
在所有节点中,开启 9000 TCP 端口:

firewall-cmd --add-port=9000/tcp --permanent
firewall-cmd --reload
2.3 安装 MinIO
在所有的节点上都要安装 MinIO,并确保版本和安装位置完全一致

以 root 用户登录服务器,执行如下命令安装 MinIO:

cd /usr/local

创建 minIO 家目录

mkdir minio

进入 minIO,创建其他目录

cd minio
mkdir bin
mkdir conf
mkdir data1
mkdir data2

下载 minIO,并放到 /usr/local/minio/bin下

wget https://dl.min.io/server/minio/release/linux-amd64/minio -O ./bin

设置 minio 为可执行

chmod +x bin/minio
至此,MinIO 安装完成,最终的目录结构如下:

/usr/local/minio
      --/bin/minio
          --/conf/
          --data1/
          --data2/
按照上述步骤,在其他节点上安装 MinIO。

2.4 启动 MinIO 集群
在所有的节点上都要启动 MinIO,并且启动命令要完全相同

在所有的节点中,按照如下方式启动 MinIO:

进入 MioIO 家目录

cd /usr/local/minio

设置用户名和密码

export MINIO_ACCESS_KEY=admin ; export MINIO_SECRET_KEY=admin123

启动 MinIO 集群

bin/minio server http://10.213.120.11/usr/local/minio/data1 \ http://10.213.120.11/usr/local/minio/data2 \
http://10.213.120.12/usr/local/minio/data1
http://10.213.120.12/usr/local/minio/data2
说明:

1)export MINIO_ACCESS_KEY=admin ; export MINIO_SECRET_KEY=admin123 用于设置用户名和密码。用户名和密码用于登录 MinIO 管理界面,并进行上传、下载、删除等读写操作。由于

MinIO 支持无限租户,因此这两个变量并不适合作为系统环境变量存放,而是应该作为脚本参数传入。

2)启动集群的命令中,必须列出集群中所有节点中的所有磁盘的URL,形式如下:

http://ip/<磁盘挂载路径>

上述集群中有2个节点,每个节点2块磁盘,因此启动命令中的 url 如下:

http://10.213.120.11/usr/local/minio/data1 \
http://10.213.120.11/usr/local/minio/data2 \
http://10.213.120.12/usr/local/minio/data1
http://10.213.120.12/usr/local/minio/data2
启动成功后,应该看到如下提示信息:

Waiting for all MinIO sub-systems to be initialized.. lock acquired
All MinIO sub-systems initialized successfully
Status:         4 Online, 0 Offline.
Endpoint: http://10.213.120.182:9000 http://127.0.0.1:9000        
AccessKey: admin
SecretKey: admin123

Browser Access:
  http://10.213.120.182:9000 http://127.0.0.1:9000        

Command-line Access: https://docs.min.io/docs/minio-client-quickstart-guide
  $ mc config host add myminio http://10.213.120.182:9000 admin admin123

Object API (Amazon S3 compatible):
  Go:         https://docs.min.io/docs/golang-client-quickstart-guide
  Java:       https://docs.min.io/docs/java-client-quickstart-guide
  Python:     https://docs.min.io/docs/python-client-quickstart-guide
  JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide
  .NET:       https://docs.min.io/docs/dotnet-client-quickstart-guide

至此,MinIO 集群启动成功。

在浏览器中,分别打开如下url,看能否进入 MinIO 管理控制台:

http://10.213.120.11:9000

http://10.213.120.12:9000

登录用户名 admin,密码 admin123,就是在启动 MinIO 时设置的如下参数:

export MINIO_ACCESS_KEY=admin ; export MINIO_SECRET_KEY=admin123
2.5 配置 Nginx 负载均衡
打开 Nginx 根目录中的 conf/nginx.conf,为 MinIO 集群配置负载均衡(最简配置):

http {
......

# MinIO Upstream  
upstream minio {
    server 10.213.120.11:9000;
    server 10.213.120.12:9000;
}

# minIO server
server {
    # 使用 9999 作为 MinIO 监听端口
    listen 9999;

    # 为 MinIO 的访问设置单独的日志文件(根据需要而定)
    access_log logs/minio.log  main;

    # 注意:目前 MinIO 的 location 只能设置为 /,不能带路径,如 /minio
    location / {
        # 设置可上传的文件大小,默认为 1m,根据需要设置大一些
        client_max_body_size 20M;

        # 注意必须设置 Host,否则使用 Java Client 无法正常访问 MinIO
        proxy_set_header Host $http_host;

        proxy_pass http://minio;
    }
}

}
然后在防火墙中开启 9999 端口:

firewall-cmd --add-port=9999/tcp --permanent
firewall-cmd --reload
再重启 Nginx:

/usr/local/nginx/sbin/nginx -s reload
使用如下地址访问 MinIO 管理控制台,确认能否正常访问:

http://10.213.120.10:9999

这里 10.213.120.10 为 Nginx 所在服务器地址。

3 将 MinIO 设置为系统服务
//  TODO 待补充

4 MinIO 操作规范
4.1 存储桶命名规范
以下约定来自于 MinIO 的官方声明。

以下是在所有AWS区域中命名S3存储桶的规则:

存储桶名称在Amazon S3中的所有现有存储桶名称中必须是唯一的

存储桶名称必须符合DNS命名约定

存储桶名称长度必须至少为3且不超过63个字符

存储桶名称不得包含大写字符或下划线

存储桶名称必须以小写字母或数字开头

存储桶名称必须是一系列一个或多个标签。相邻标签由单个句点(。)分隔。存储桶名称可以包含小写字母,数字和连字符。每个标签必须以小写字母或数字开头和结尾

下一篇: Angular 环境搭建→