Linux使用nginx高可用部署minio分布式集群

1,150 阅读7分钟

前言

从 github.com/minio/minio… 开始,MinIO 为单节点单驱动器部署实现了零奇偶校验纠删码后端。 此功能允许访问与纠删码相关的功能,而无需多个驱动器。

  • 单节点多驱动器(SNMD 或“独立多驱动器”)
    • 性能、规模和容量要求较低的工作负载
    • 驱动器级可靠性,可配置容差,可丢失多达 1/2 的所有驱动器
    • 评估多驱动器拓扑和故障转移行为。
  • 节点多驱动器(MNMD 或“分布式”)
    • 企业级高性能对象存储
    • 多节点/驱动器级可靠性,可配置容差,可丢失多达 1/2 的所有节点/驱动器
    • AI/ML、分布式查询、分析和其他数据湖组件的主存储

集群部署

部署前的准备工作
  • 准备服务器环境
  • 采用两台服务器,分别挂载两块硬盘
机器资源挂载路径1挂载路径2
192.168.1.100/data/data1/data/data2
192.168.1.101/data/data1/data/data2
image.png image.png
  • 创建minio运行时配置数据存储文件夹
mkdir -p /etc/minio
  • 创建minio软件安装路径
mkdir -p /opt/minio
  • /opt/minio 目录下载minio软件
wget https://dl.minio.io/server/minio/release/linux-amd64/minio
  • 下载成功后给minio增加执行权限
chmod +x minio
  • 创建minio启动脚本
vim /opt/minio/run.sh
  • 写入的脚本内容
#!/bin/bash  
# 原始脚本  
export MINIO_ROOT_USER=minio  
export MINIO_ROOT_PASSWORD=minio123456  

/opt/minio/minio server --config-dir /etc/minio \  
--address ":9000" --console-address ":9001" \  
http://192.168.1.100:9000/data/data{1...2} \  
http://192.168.1.101:9000/data/data{1...2} > minio_server.log
  • 给运行脚本增加可执行权限
chmod +x /opt/minio/run.sh
  • 编写服务脚本
vim /usr/lib/systemd/system/minio.service
  • 编写服务脚本内容
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/

[Service]
WorkingDirectory=/opt/minio/
ExecStart=/opt/minio/run.sh

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
  • 增加service的可执行权限
chmod +x /usr/lib/systemd/system/minio.service
  • 如图 image.png

  • 启动minio

# 重新加载
systemctl daemon-reload

# 启动minio 
systemctl start minio.service

# 设置开机启动 
systemctl enable minio.service

# 查看运行状态 
systemctl status minio.service
  • 启动成功后,如图: image.png

扩容

准备两台同样配置的服务器,并且每台挂载两块同样大小的硬盘
机器资源挂载路径1挂载路径2类型
192.168.1.100/data/data1/data/data2原始集群
192.168.1.101/data/data1/data/data2原始集群
192.168.1.102/data/data1/data/data2扩容集群
192.168.1.103/data/data1/data/data2扩容集群
操作
  • 修改run.sh 脚本,配置在原来的两台服务器和增加的服务器
  • MinIO支持通过命令,指定新的集群来扩展现有集群(纠删码模式),命令行如下:
#!/bin/bash  
# 扩容脚本  
export MINIO_ROOT_USER=minio  
export MINIO_ROOT_PASSWORD=minio123456  

/opt/minio/minio server --config-dir /etc/minio \  
--address ":9000" --console-address ":9001" \  
http://192.168.1.100:9000/data/data{1...2} \  
http://192.168.1.101:9000/data/data{1...2} \  
http://192.168.1.102:9000/data/data{1...2} \  
http://192.168.1.103:9000/data/data{1...2} > minio_server.log
注意:
  • MinIO 支持通过添加新的服务器池来扩展现有的分布式部署。 每个池扩展群集的总可用存储容量。
  • 官网链接:扩展分布式 MinIO 部署 — 适用于 Linux 的 MinIO 对象存储
  • 注意:原始集群2个节点2块磁盘,则在扩容时必须增加2个节点2块磁盘或整倍数,以致于系统维持相同的数据冗余SLA来降低扩容的复杂性
  • 当MinIO集群扩容后,并不会对全部的4个节点进行完全的数据均衡,而是将原本的2个节点视作一个区域新加入的2节点视作另一区域
  • 当有新对象上传时,集群将依据各区域的可用空间比例确定存放区域,在各区域内仍旧通过哈希算法确定对应的纠删组进行最终的存放
  • 此外,集群进行一次对等扩容后,还可依据扩容规则继续进行对等扩容,但出于安全性考虑,集群的最大节点数一般不得超过32个,超过了反而会增加集权维护强一致性的负担

负载均衡

安装nginx

  • nginx 安装在另一台服务器 192.168.1.105
安装前的准备工作
  • 安装 编译工具和库文件
yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel
  • 安装PCRE让Nginx支持Rewrite功能
cd /usr/local/src/
wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
  • 解压安装包
tar -zxvf pcre-8.35.tar.gz
  • 进入安装包目录
cd pcre-8.35
  • 编译安装
./configure
make && make install
此问题,开启firewall 9000 端口即可

image.png

安装 Nginx
  • 下载ngnix安装包
cd /usr/local/src/
wget http://nginx.org/download/nginx-1.20.2.tar.gz
  • 解压安装包
tar -zxvf nginx-1.20.2.tar.gz
  • 进入安装包目录
cd nginx-1.20.2
  • 编译安装
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35
make && make install
修改nginx配置文件 [/usr/local/nginx/conf/nginx.conf]
worker_processes auto;  

events {  
    worker_connections 1024;  
}  

error_log logs/error.log;  

http {  
    include mime.types;  
    default_type application/octet-stream;  
    client_max_body_size 10M;  
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '  
    '$status $body_bytes_sent "$http_referer" '  
    '"$http_user_agent" "$http_x_forwarded_for" "$upstream_addr"'  
    '$request_time $upstream_response_time';  

    access_log logs/access.log main;  
    sendfile on;  
    keepalive_timeout 65;  

    upstream minio-server {  
        server 192.168.1.100:9000 weight=25 max_fails=2 fail_timeout=30s;  
        server 192.168.1.101:9000 weight=25 max_fails=2 fail_timeout=30s;  
        server 192.168.1.102:9000 weight=25 max_fails=2 fail_timeout=30s;  
        server 192.168.1.103:9000 weight=25 max_fails=2 fail_timeout=30s;  
    }  

    upstream minio-console {  
        ip_hash;  
        server 192.168.1.100:9001 weight=25 max_fails=2 fail_timeout=30s;  
        server 192.168.1.101:9001 weight=25 max_fails=2 fail_timeout=30s;  
        server 192.168.1.102:9001 weight=25 max_fails=2 fail_timeout=30s;  
        server 192.168.1.103:9001 weight=25 max_fails=2 fail_timeout=30s;  
    }  

    server {  
        listen 9000;  
        server_name localhost;  

        # To allow special characters in headers  
        ignore_invalid_headers off;  
        # 配置成上传文件不限制大小  
        client_max_body_size 0;  
        # To disable buffering  
        proxy_buffering off;  

        location / {
            proxy_pass http://minio-server;  

            proxy_set_header Upgrade $http_upgrade;  
            proxy_set_header Connection "upgrade";  
            proxy_set_header Host $http_host;  
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
            proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;  
            expires 0;  

            # 后端服务器连接的超时时间_发起握手等候响应超时时间  
            proxy_connect_timeout 300;  
            proxy_http_version 1.1;  
            chunked_transfer_encoding off;  
            # 是否开启proxy忽略客户端中断  
            proxy_ignore_client_abort on;  
        }
    }

    server {  
        listen 9001;  
        server_name localhost;  

        # To allow special characters in headers  
        ignore_invalid_headers off;  
        # 配置成上传文件不限制大小  
        client_max_body_size 0;  
        # To disable buffering  
        proxy_buffering off;  

        location / {  
            proxy_pass http://minio-console;  

            proxy_set_header Upgrade $http_upgrade;  
            proxy_set_header Connection "upgrade";  
            proxy_set_header Host $http_host;  
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
            proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;  
            expires 0;  

            # 后端服务器连接的超时时间_发起握手等候响应超时时间  
            proxy_connect_timeout 300;  
            proxy_http_version 1.1;  
            chunked_transfer_encoding off;  
            # 是否开启proxy忽略客户端中断  
            proxy_ignore_client_abort on;  
        }  
    } 
}
  • nginx配置没有支持webscoket,使用控制台时无法访问桶

    • 需要添加以下配置
    proxy_set_header        Upgrade $http_upgrade;
    proxy_set_header        Connection "upgrade";
    
  • 使用API上传文件时,response响应nginx403

    • 需要将proxy_set_header Host $host修改为以下配置
    proxy_set_header        Host  $http_host
    
启动nginx
cd /usr/local/nginx
  • 指定配置文件,启动方式
./sbin/nginx -c ./conf/nginx.conf
  • 修改配置文件,重新加载
./sbin/nginx -c ./conf/nginx.conf -s reload 

演示环境:http:192.68.1.105:9001

image.png

验证数据损坏恢复

验证方案

数据块,指文件分割成N块后分别存储在不同硬盘的数据,在硬盘内的文件名为part.1,part.2…

  • 4台服务8(N)个数据块,根据纠删码的原理,只要保证至少4(N/2)个硬盘的数据完整,文件就可以正常访问,且可以对损坏数据块进行恢复。
  • 分别上传2个文件,一个文件用于验证损坏超过4个硬盘数据时文件能否正常访问,另一个文件用于验证坏不超过4个硬盘时,是否可以进行文件恢复。
  • 验证损坏超过N/2个数据块
  • 上传文件test.jpg。
  • 进入docker容器中,删除5个( 5 > N/2 )数据块
  • 此处删除容器2两个数据块,容器4两个数据块,容器3一个数据块

此处删除容器2两个数据块,容器4两个数据块,容器3一个数据块

若有错误请指正,谢谢 o( ̄︶ ̄)o

参考 minio分布式集群搭建完全教程(纠删码,数据恢复)_冰糖豆豆的技术博客_51CTO博客