作者:Eddy  历史版本:1  最后编辑:Eddy  更新时间:2024-05-15 14:41

编写版本:v3.5.0
适用版本:v3.5.0+

物理安装

1.分布式Minio可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式Minio避免了单点故障。

分布式Minio有什么好处?

在大数据领域,通常的设计理念都是无中心和分布式。Minio分布式模式可以帮助你搭建一个高可用的对象存储服务,你可以使用这些存储设备,而不用考虑其真实物理位置。

数据保护

分布式Minio采用 纠删码来防范多个节点宕机和位衰减bit rot。

分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。

高可用

单机Minio服务存在单点故障,相反,如果是一个有N块硬盘的分布式Minio,只要有N/2硬盘在线,你的数据就是安全的。不过你需要至少有N/2+1个硬盘来创建新的对象。

例如,一个16节点的Minio集群,每个节点16块硬盘,就算8台服務器宕机,这个集群仍然是可读的,不过你需要9台服務器才能写数据。

注意,只要遵守分布式Minio的限制,你可以组合不同的节点和每个节点几块硬盘。比如,你可以使用2个节点,每个节点4块硬盘,也可以使用4个节点,每个节点两块硬盘,诸如此类。

一致性

Minio在分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型

开始搭建

如果你了解Minio单机模式的搭建的话,分布式搭建的流程基本一样,Minio服务基于命令行传入的参数自动切换成单机模式还是分布式模式。

前提条件

安装Minio

运行分布式Minio

启动一个分布式Minio实例,你只需要把硬盘位置做为参数传给minio server命令即可,然后,你需要在所有其它节点运行同样的命令。
注意:

  • 分布式Minio里所有的节点需要有同样的access秘钥和secret秘钥,这样这些节点才能建立联接。为了实现这个,你需要在执行minio server命令之前,先将access秘钥和secret秘钥export成环境变量。
  • 分布式Minio使用的磁盘里必须是干净的,里面没有数据。
  • 下面示例里的IP仅供示例参考,你需要改成你真实用到的IP和文件夹路径。
  • 分布式Minio里的节点时间差不能超过3秒,你可以使用NTP 来保证时间一致。
  • 在Windows下运行分布式Minio处于实验阶段,请悠着点使用。
    示例1: 启动分布式Minio实例,8个节点,每节点1块盘,需要在8个节点上都运行下面的命令。

GNU/Linux 和 macOS

export MINIO_ACCESS_KEY=<ACCESS_KEY>
export MINIO_SECRET_KEY=<SECRET_KEY>
minio server http://192.168.1.11/export1 http://192.168.1.12/export2 \
               http://192.168.1.13/export3 http://192.168.1.14/export4 \
               http://192.168.1.15/export5 http://192.168.1.16/export6 \
               http://192.168.1.17/export7 http://192.168.1.18/export8

Windows

set MINIO_ACCESS_KEY=<ACCESS_KEY>
set MINIO_SECRET_KEY=<SECRET_KEY>
minio.exe server http://192.168.1.11/C:/data http://192.168.1.12/C:/data ^
                  http://192.168.1.13/C:/data http://192.168.1.14/C:/data ^
                  http://192.168.1.15/C:/data http://192.168.1.16/C:/data ^
                  http://192.168.1.17/C:/data http://192.168.1.18/C:/data

示例2: 启动分布式Minio实例,4节点,每节点4块盘,需要在4个节点上都运行下面的命令。

GNU/Linux 和 macOS

export MINIO_ACCESS_KEY=<ACCESS_KEY>
export MINIO_SECRET_KEY=<SECRET_KEY>
minio server http://192.168.1.11/export1 http://192.168.1.11/export2 \
               http://192.168.1.11/export3 http://192.168.1.11/export4 \
               http://192.168.1.12/export1 http://192.168.1.12/export2 \
               http://192.168.1.12/export3 http://192.168.1.12/export4 \
               http://192.168.1.13/export1 http://192.168.1.13/export2 \
               http://192.168.1.13/export3 http://192.168.1.13/export4 \
               http://192.168.1.14/export1 http://192.168.1.14/export2 \
               http://192.168.1.14/export3 http://192.168.1.14/export4

Windows

set MINIO_ACCESS_KEY=<ACCESS_KEY>
set MINIO_SECRET_KEY=<SECRET_KEY>
minio.exe server http://192.168.1.11/C:/data1 http://192.168.1.11/C:/data2 ^
                  http://192.168.1.11/C:/data3 http://192.168.1.11/C:/data4 ^
                  http://192.168.1.12/C:/data1 http://192.168.1.12/C:/data2 ^
                  http://192.168.1.12/C:/data3 http://192.168.1.12/C:/data4 ^
                  http://192.168.1.13/C:/data1 http://192.168.1.13/C:/data2 ^
                  http://192.168.1.13/C:/data3 http://192.168.1.13/C:/data4 ^
                  http://192.168.1.14/C:/data1 http://192.168.1.14/C:/data2 ^
                  http://192.168.1.14/C:/data3 http://192.168.1.14/C:/data4

扩展现有的分布式集群
例如我们是通过区的方式启动MinIO集群,命令行如下:

export MINIO_ACCESS_KEY=<ACCESS_KEY>
export MINIO_SECRET_KEY=<SECRET_KEY>
minio server http://host{1...32}/export{1...32}

MinIO支持通过命令,指定新的集群来扩展现有集群(纠删码模式),命令行如下:

export MINIO_ACCESS_KEY=<ACCESS_KEY>
export MINIO_SECRET_KEY=<SECRET_KEY>
minio server http://host{1...32}/export{1...32} http://host{33...64}/export{1...32}

现在整个集群就扩展了1024个磁盘,总磁盘变为2048个,新的对象上传请求会自动分配到最少使用的集群上。通过以上扩展策略,您就可以按需扩展您的集群。重新配置后重启集群,会立即在集群中生效,并对现有集群无影响。如上命令中,我们可以把原来的集群看做一个区,新增集群看做另一个区,新对象按每个区域中的可用空间比例放置在区域中。在每个区域内,基于确定性哈希算法确定位置。

说明: 您添加的每个区域必须具有与原始区域相同的磁盘数量(纠删码集)大小,以便维持相同的数据冗余SLA。 例如,第一个区有8个磁盘,您可以将集群扩展为16个、32个或1024个磁盘的区域,您只需确保部署的SLA是原始区域的倍数即可。

制作分布式启动脚本

脚本演示:4个节点,每个节点挂载4块磁盘。在实际的服务器上依次执行以下命令即可
案例演示:伪分布式模式

vim minio_cluster.sh
data MINIO_ROOT_USER=admin
data MINIO_ROOT_PASSWORD=12345678
MINIO_HOME=/root

nohup  ${MINIO_HOME}/minio server --address ":9000" --console-address ":50000" \
http://192.168.92.101:9000/mnt/data1 http://192.168.92.101:9000/mnt/data2 \
http://192.168.92.101:9000/mnt/data3 http://192.168.92.101:9000/mnt/data4 \
http://192.168.92.102:9000/mnt/data1 http://192.168.92.102:9000/mnt/data2 \
http://192.168.92.102:9000/mnt/data3 http://192.168.92.102:9000/mnt/data4 \
http://192.168.92.103:9000/mnt/data1 http://192.168.92.103:9000/mnt/data2 \
http://192.168.92.103:9000/mnt/data3 http://192.168.92.103:9000/mnt/data4 \
http://192.168.92.104:9000/mnt/data1 http://192.168.92.104:9000/mnt/data2 \
http://192.168.92.104:9000/mnt/data3 http://192.168.92.104:9000/mnt/data4 > ${MINIO_HOME}/minio-9000.log 2>&1 &

执行脚本

chmod u+x minio_cluster.sh
./minio_cluster.sh

制作伪分布式启动脚本

案例演示:伪分布式模式案例

下面在单台机器上,通过不同的端口模拟在4台机器节点上运行,存储目录依然是 /data,而对应的端口是9001~9004。脚本如下:

vim minio.sh
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=12345678
MINIO_HOME=/root
MINIO_HOST=192.168.92.104

for i in {01..04}; do
    nohup  ${MINIO_HOME}/minio server --address ":90${i}" --console-address ":500${i}" http://${MINIO_HOST}:9001/mnt/data01 http://${MINIO_HOST}:9002/mnt/data02  http://${MINIO_HOST}:9003/mnt/data03  http://${MINIO_HOST}:9004/mnt/data04 > ${MINIO_HOME}/minio-90${i}.log 2>&1 &
done

运行脚本查看运行结果

在浏览器中输入上面配置的任意节点

使用 nginx 负载均衡

配置nginx 可以参考minio 官网的配置
https://github.com/minio/minio/blob/master/docs/orchestration/docker-compose/nginx.conf

下面对应上面案例演示伪分布式模式的nginx minio代理配置

upstream minio {
        server 192.168.3.207:9001;
        server 192.168.3.207:9002;
        server 192.168.3.207:9003;
        server 192.168.3.207:9004;
    }
upstream console {
        ip_hash;
        server 192.168.3.207:50001;
        server 192.168.3.207:50002;
        server 192.168.3.207:50003;
        server 192.168.3.207:50004;
 }
 server {
        listen       9000;
        listen  [::]:9000;
        server_name  localhost;


        ignore_invalid_headers off;

        client_max_body_size 0;

        proxy_buffering off;

        location / {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            proxy_connect_timeout 300;

            proxy_http_version 1.1;
            proxy_set_header Connection "";
            chunked_transfer_encoding off;

            proxy_pass http://minio;
        }
    }
    server {
        listen       50000;
        listen  [::]:50000;
        server_name  localhost;


        ignore_invalid_headers off;

        client_max_body_size 0;

        proxy_buffering off;

        location / {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-NginX-Proxy true;


            real_ip_header X-Real-IP;

            proxy_connect_timeout 300;


            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";

            chunked_transfer_encoding off;

            proxy_pass http://console;
        }
    }

重启nginx

真实后端控制台端口:50001 ~ 5004,现在访问50000自动负载到50001~5004的任意一个端口

docker安装

使用 Docker Compose 部署 MinIO

在Docker Compose上部署分布式MinIO,请下载docker-compose.yaml到你的当前工作目录。Docker Compose会pull MinIO Docker Image,所以你不需要手动去下载MinIO binary。然后运行下面的命令

GNU/Linux and macOS

docker-compose pull
docker-compose up 

Windows

docker-compose.exe pull
docker-compose.exe up

注意事项

  • 默认情况下Docker Compose file使用的是最新版的MinIO server的Docker镜像,你可以修改image tag来拉取指定版本的MinIO Docker image.
  • 默认情况下会创建4个minio实例,你可以添加更多的MinIO服务(最多总共16个)到你的MinIO Comose deployment。添加一个服务
    • 复制服务定义并适当地更改新服务的名称。
    • 更新每个服务中的命令部分。
    • 更新要为新服务公开的端口号。 另外,请确保分配给新服务的端口尚未使用。
  • Docker compose file中的MinIO服务使用的端口是9001到9004,这允许多个服务在主机上运行。

docker-compose 配置

参考 minio 官方docker-compose配置 https://github.com/minio/minio/blob/master/docs/orchestration/docker-compose/docker-compose.yaml
单机编排

version: '3'
services:
  minio:
    image: minio/minio
    hostname: "minio"
    ports:
      - 9000:9000 # api 端口
      - 9001:9001 # 控制台端口
    environment:
      MINIO_ACCESS_KEY: minioadmin  #管理后台用户名
      MINIO_SECRET_KEY: minioadmin  #管理后台密码,最小8个字符
    volumes:
      - /docker/minio/data:/data               #映射当前目录下的data目录至容器内/data目录
      - /docker/minio/config:/root/.minio/     #映射配置目录
    command: server --console-address ':9001' /data  #指定容器中的目录 /data
    privileged: true
    restart: always

集群编排

version: '3.7'

# Settings and configurations that are common for all containers
x-minio-common: &minio-common
  image: quay.io/minio/minio:RELEASE.2022-02-07T08-17-33Z
  command: server --console-address ":9002" http://minio{1...4}/data{1...2}
  expose:
    - "9001"
    - "9002"
  environment:
    MINIO_ROOT_USER: minio
    MINIO_ROOT_PASSWORD: minio123
  healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost:9001/minio/health/live"]
    interval: 30s
    timeout: 20s
    retries: 3

# starts 4 docker containers running minio server instances.
# using nginx reverse proxy, load balancing, you can access
# it through port 9000.
services:
  minio1:
    <<: *minio-common
    hostname: minio1
    volumes:
      - data1-1:/data1
      - data1-2:/data2

  minio2:
    <<: *minio-common
    hostname: minio2
    volumes:
      - data2-1:/data1
      - data2-2:/data2

  minio3:
    <<: *minio-common
    hostname: minio3
    volumes:
      - data3-1:/data1
      - data3-2:/data2

  minio4:
    <<: *minio-common
    hostname: minio4
    volumes:
      - data4-1:/data1
      - data4-2:/data2

  nginx:
    image: nginx:1.19.2-alpine
    hostname: nginx
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - "9001:9001"
      - "9002:9002"
    depends_on:
      - minio1
      - minio2
      - minio3
      - minio4

## By default this config uses default local driver,
## For custom volumes replace with volume driver configuration.
volumes:
  data1-1:
  data1-2:
  data2-1:
  data2-2:
  data3-1:
  data3-2:
  data4-1:
  data4-2: