集群版 Minio 的部署和使用

单机版的 Minio 虽然有纠删码的部署方式,可以防止磁盘损坏导致文件丢失,但是单机毕竟性能有限。集群版 Minio 必须使用纠删码的部署方式,至少使用 4 块硬盘进行部署。最简单的部署方式是使用 2 个 docker 容器,每个容器使用 2 个磁盘或目录。本篇博客使用 docker-compose 在单台虚拟机上模拟部署伪集群,使用 4 个 docker 容器,每个容器中使用一个目录作为磁盘。

如果在不同的机器上部署真正的 Minio 集群,需要注意以下几点:

  • 集群中每个 Minio 节点必须具有相同的账号和密码,通过 MINIO_ROOT_USER 和 MINIO_ROOT_PASSWORD 进行初始化
  • 集群中每个 Minio 节点之间的时间,相差不能超过 3 秒,可以使用 NTP 服务器保持时间一致。
  • 集群中每个 Minio 节点中挂载的磁盘最好是没有任何数据的磁盘。

集群版 Minio 部署

首先创建好目录 /app/minio-cluster,在里面创建目录和文件,具体结构如下:

image

编写 docker-compose.yml 文件内容如下:

version: "3.5"
services:
  minio1:
    image: minio/minio
    container_name: minio1
    privileged: true
    restart: always
    environment:
      # web管理后台用户名
      MINIO_ROOT_USER: jobs
      # web管理后台密码
      MINIO_ROOT_PASSWORD: jobs@123
    networks:
      - minio_net
    volumes:
      # 文件存储目录映射
      - /app/minio-cluster/data1:/data
    # 运行 minio 服务启动命令,/data 参数是 docker 容器内部的数据目录
    # 由于 web 管理后台是动态端口,因此必须指定为固定的端口
    command: server --console-address ":9001" http://minio{1...4}:9000/data

  minio2:
    image: minio/minio
    container_name: minio2
    privileged: true
    restart: always
    environment:
      MINIO_ROOT_USER: jobs
      MINIO_ROOT_PASSWORD: jobs@123
    networks:
      - minio_net
    volumes:
      - /app/minio-cluster/data2:/data
    command: server --console-address ":9001" http://minio{1...4}:9000/data

  minio3:
    image: minio/minio
    container_name: minio3
    privileged: true
    restart: always
    environment:
      MINIO_ROOT_USER: jobs
      MINIO_ROOT_PASSWORD: jobs@123
    networks:
      - minio_net
    volumes:
      - /app/minio-cluster/data3:/data
    command: server --console-address ":9001" http://minio{1...4}:9000/data

  minio4:
    image: minio/minio
    container_name: minio4
    privileged: true
    restart: always
    environment:
      MINIO_ROOT_USER: jobs
      MINIO_ROOT_PASSWORD: jobs@123
    networks:
      - minio_net
    volumes:
      - /app/minio-cluster/data4:/data
    command: server --console-address ":9001" http://minio{1...4}:9000/data

  nginx:
    image: nginx
    container_name: nginx
    privileged: true
    restart: always
    volumes:
      - /app/minio-cluster/nginx.conf:/etc/nginx/nginx.conf
    ports:
      # 转发 api 端口
      - 9000:9000
      # 转发 web 管理界面端口
      - 9001:9001
    networks:
      - minio_net
    depends_on:
      - minio1
      - minio2
      - minio3
      - minio4

# 网络配置
networks:
  minio_net:
    driver: bridge

我们启动 4 个 docker 容器,每个 Minio 容器都是使用 9000 作为 api 端口,9001 作为 Web 管理界面端口。

由于我们需要使用 nginx 对 api 端口和 Web 管理界面端口进行负载均衡对外提供,因此 4 个容器就不再对外暴露端口。

有关 nginx 的配置文件,内容如下:

worker_processes  2;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    keepalive_timeout  65;

    # include /etc/nginx/conf.d/*.conf;

    upstream minio-api {
        server minio1:9000;
        server minio2:9000;
        server minio3:9000;
        server minio4:9000;
    }

    upstream minio-web {
        server minio1:9001;
        server minio2:9001;
        server minio3:9001;
        server minio4:9001;
    }

    server {
        listen       9000;
        listen  [::]:9000;
        server_name  localhost;

        # To allow special characters in headers
        ignore_invalid_headers off;

        # Allow any size file to be uploaded.
        # Set to a value such as 1000m; to restrict file size to a specific value
        client_max_body_size 0;

        # To disable buffering
        proxy_buffering off;

        location / {
            proxy_http_version 1.1;
            proxy_set_header   Upgrade $http_upgrade;
            proxy_set_header   Connection keep-alive;
            proxy_set_header   Host $host;

            # 转发客户浏览器的 ip 地址
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Proto $scheme;

            proxy_pass http://minio-api;
        }
    }

    server {
        listen       9001;
        listen  [::]:9001;
        server_name  localhost;

        ignore_invalid_headers off;
        client_max_body_size 0;
        proxy_buffering off;

        location / {
            proxy_http_version 1.1;
            proxy_set_header   Upgrade $http_upgrade;
            proxy_set_header   Connection keep-alive;
            proxy_set_header   Host $host;

            # 转发客户浏览器的 ip 地址
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Proto $scheme;

            proxy_pass http://minio-web;
        }
    }
}

最后在 docker-compose.yml 文件所在目录下,运行 docker-compose up -d 启动服务即可。

然后我们访问 http://192.168.136.128:9001 输入账号 jobs 密码 jobs@123 进入首页展示如下:

image

发现有 4 个服务节点,如下所示:

image

这说明 Minio 集群已经部署成功。剩下的操作就是创建 Bucket 以及上传文件,程序代码与上篇博客的代码一致。

只不过代码中配置的 api 接口地址 http://192.168.136.128:9000 是 nginx 提供的负载均衡地址。

有关 Minio 的 Web 管理界面操作和程序代码细节,请参考上一篇博客单机版 Minio 的部署和使用,这里不再赘述。

这里把上篇博客的源代码下载地址提供出来:https://files.cnblogs.com/files/blogs/699532/springboot_minio.zip

posted @ 2024-02-09 09:11  乔京飞  阅读(12200)  评论(0编辑  收藏  举报