• 手把手教你搭建MinIO分布式集群


    手把手教你搭建MinIO分布式集群

    要求:

    1. MinIO集群规格:2节点2个磁盘。

    2. Minio域名:test_minio.com

    3. 数据目录:/opt/minio/data1,/opt/minio/data2

    4. 两节点证书保持一致

    5. 关闭防火墙

    建议:参考英文官网

    1. Linux场景:MinIO分布式集群构建

    1.1 规定MinIO的目录结构

    [root@192 opt]# tree -f minio/
    minio
    ├── minio/bin                              # 二进制文件目录
    │   └── minio/bin/minio
    ├── minio/certs                            # 证书文件目录
    │   ├── minio/certs/private.key            # 私钥文件
    │   ├── minio/certs/public.crt             # 证书文件
    ├── minio/config                           # 配置文件目录
    ├── minio/data1                            # minio数据目录1
    ├── minio/data2                            # minio数据目录2 
    ├── minio/log                              # 日志文件目录
    │   └── minio/log/minio.log                # 日志文件
    └── minio/run                              # 自定义脚本
        ├── minio/run/create_cert.sh           # 生成证书脚本
        ├── minio/run/minio.service            # minio service文件
        ├── minio/run/stop.sh                  # minio服务停止脚本
        └── minio/run/start.sh                 # minio服务启动脚本
    
    8 directories, 9 files
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    1.2 定义minio.service和启动、停止脚本

    • minio.service文件

      [Unit]
      Description=Minio service
      Documentation=This is a Minio Service.

      [Service]
      Type=forking

      启动服务时的等待的秒数,TimeoutStartSec 的值指定为 0,从而关闭超时检测。

      TimeoutStartSec=10

      工作目录

      WorkingDirectory=/opt/minio

      服务运行用户

      User=root

      服务运行用户组

      Group=root
      Restart=on-failure
      RestartSec=15s
      ExecStart=/opt/minio/run/start.sh
      ExecStop=/opt/minio/run/stop.sh

      [Install]
      WantedBy=multi-user.target

    • start.sh 启动脚本

    注意调整CURRENT_IP的值为当前节点的IP地址。

    #!/bin/bash
    ## MinIO启动脚本
    
    # 设置环境变量
    # 设置HOME
    export MINIO_HOME=opt/minio
    # 默认配置文件目录${HOME}/.minio,默认会将配置信息生成到config.json文件
    export MINIO_COFNIG_DIR=/${MINIO_HOME}/config
    # TLS证书目录:
    #    私钥private.key
    #    证书public.crt
    export MINIO_CERTS_DIR=/${MINIO_HOME}/certs
    # 日志目录
    export MINIO_LOG_PATH=/${MINIO_HOME}/log
    # 访问凭证AK
    export MINIO_ROOT_USER=minio_admin
    # 访问凭证SK
    export MINIO_ROOT_PASSWORD=minio_admin!@#
    # 是否开启web访问,默认是开启
    export MINIO_BROWSER=on
    # 证书密码
    export MINIO_CERT_PASSWD=admin123!@#
    # 支持path-style访问,默认 http://mydomain.com/bucket/object
    export MINIO_DOMAIN=test_minio.com
    # MINIO的集群中各节点IP
    export MINIO_HOST_1=192.168.8.109
    export MINIO_HOST_2=192.168.8.120
    export CURRENT_IP=$MINIO_HOST_2
    # 39000 为API调用接口, 9000为web console接口
    # 启动minio
    nohup  /${MINIO_HOME}/bin/minio server 
      --config-dir ${MINIO_COFNIG_DIR} 
      --certs-dir ${MINIO_CERTS_DIR} 
      --address ${CURRENT_IP}:39000 --console-address ":9000" 
      https://${MINIO_HOST_1}/${MINIO_HOME}/data1 https://${MINIO_HOST_1}/${MINIO_HOME}/data2 
      https://${MINIO_HOST_2}/${MINIO_HOME}/data1 https://${MINIO_HOST_2}/${MINIO_HOME}/data2 
      >> ${MINIO_LOG_PATH}/minio.log 2>&1 &
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • stop.sh 停止脚本

      #!/bin/bash

      MinIO停止脚本

      ps -ef | grep minio | grep -v ‘grep’ | awk ‘{print $2}’| xargs kill -9

      if $? != 0;then
      echo “minio service stop failed.”
      exit 1
      fi

    1.3 生成https证书文件,参考英文官网 3.2.2 Generate a private key with RSA

    因为这里创建的MinIO的规格是2节点2个磁盘,所以中创建证书时SANs中IP为本地IP和另一节点IP, DNS信息为节点的网关地址或者域名地址。

    create_cert.sh 证书生成脚本,执行过程中需要自定义域名、证书路径、证书密码、另一节点IP。

    #!/bin/bash
    # 用来生成pem证书文件
    # sh create_cert.sh
    set -e
    
    # 从外界读取输入参数到指定变量
    function read_input() {
        read -p "please input $1 parms:" $2
    }
    # 初始化输入参数
    function init_input_param() {
      read_input "cert domain" "DOMAIN"
      read_input "cert path" "CERT_PATH"
      read_input "cert password" "PASSWORD"
      read_input "peer ip" "PEER_IP"
      readonly IP=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | awk -F"/" '{print $1}')
      readonly DNS=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $4}' | awk -F"/" '{print $1}')
    }
    
    # 生成openssl.conf文件
    function generate_openssl_config() {
    cat > ${CERT_PATH}/openssl.conf <<-EOF
      [req]
      distinguished_name = req_distinguished_name
      x509_extensions = v3_req
      prompt = no
    
      [req_distinguished_name]
      C = CN
      ST = VA
      L = Somewhere
      O = MyOrg
      OU = MyOU
      CN = ${DOMAIN}
    
      [v3_req]
      subjectAltName = @alt_names
    
      [alt_names]
      IP.1 = 127.0.0.1
      IP.2 = ${IP}
      IP.3 = ${PEER_IP}
      DNS.1 = ${DNS}
      DNS.2 = ${DOMAIN}
    EOF
    }
    
    # openssl 生成私钥
    function generate_private_key() {
      # 生成长度为2048的私钥
      openssl genrsa -aes256 -passout pass:${PASSWORD} -out ${CERT_PATH}/private-pkcs8.key 2048
      # 转换为PCKS-1
      openssl rsa -passin pass:${PASSWORD} -in ${CERT_PATH}/private-pkcs8.key -aes256 -passout pass:${PASSWORD} -out ${CERT_PATH}/private.key
    }
    
    # 生成自签名文件
    function generate_self_sign_cert() {
      openssl req -new -x509 -nodes -days 730 -keyout ${CERT_PATH}/private.key -passout pass:${PASSWORD} -out ${CERT_PATH}/public.crt -config ${CERT_PATH}/openssl.conf
    }
    
    # 清除
    function clean() {
      rm -rf ${CERT_PATH}/openssl.conf
      rm -rf ${CERT_PATH}/private-pkcs8.key
    }
    
    # 执行流程
    function main() {
      init_input_param
      generate_openssl_config
      generate_private_key
      generate_self_sign_cert
      clean
    }
    
    main
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    执行命令: sh create_cert.sh,输入以下参数,如图所示:
    图片

    1.4 验证MinIO分布式集群

    执行以下命令,注册系统服务,并启动服务

    mv /opt/minio/run/minio.service /etc/systemd/system/
    chmod 755 /etc/systemd/system/minio.service
    chmod 755 /opt/minio/run/*
    # 开机自启minio.service
    systemctl enable minio.service
    # 刷新服务
    systemctl daemon-reload
    # 启动服务
    systemctl start minio.service
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    通过web 浏览器登录console端:https://192.168.8.109:9000/login
    在这里插入图片描述

    查看minio.log日志
    在这里插入图片描述

    若1.4执行失败,可在所有节点执行如下命令清理环境,重试。

    rm -rf /opt/minio/log/*
    rm -rf /opt/minio/data1
    rm -rf /opt/minio/data2
    rm -rf /opt/minio/config
    mkdir -p /opt/minio/data1
    mkdir -p /opt/minio/data2
    mkdir -p /opt/minio/config
    systemctl start minio
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    1.5 FAQ

    1.5.1 错误: x509: cannot validate certificate for 192.168.8.109 because it doesn’t contain any IP SANs

    API: SYSTEM()
    Time: 13:13:42 UTC 03/06/2022
    Error: Read failed. Insufficient number of disks online (*errors.errorString)
    5: cmd/prepare-storage.go:266:cmd.connectLoadInitFormats()
    4: cmd/prepare-storage.go:326:cmd.waitForFormatErasure()
    3: cmd/erasure-server-pool.go:91:cmd.newErasureServerPools()
    2: cmd/server-main.go:640:cmd.newObjectLayer()
    1: cmd/server-main.go:491:cmd.serverMain()
    Waiting for a minimum of 2 disks to come online (elapsed 52s)

    Unable to read ‘format.json’ from https://192.168.8.109:39000/opt/minio/data1: Post “https://192.168.8.109:39000/minio/storage/opt/minio/data1/v43/readalldisk-id=&file-path=format.json&volume=.minio.sys”: x509: cannot validate certificate for 192.168.8.109 because it doesn’t contain any IP SANs

    Unable to read ‘format.json’ from https://192.168.8.109:39000/opt/minio/data2: Post “https://192.168.8.109:39000/minio/storage/opt/minio/data2/v43/readalldisk-id=&file-path=format.json&volume=.minio.sys”: x509: cannot validate certificate for 192.168.8.109 because it doesn’t contain any IP SANs

    原因分析:生成证书时,SANs中IP信息不正确导致。

    解决办法:使用ip -a查看机器IP,填写正确SANs信息,重新生成证书。

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    使用pytorch实现深度可分离卷积改进模型的实战实践
    kr 第三阶段(一)16 位汇编
    EM算法 参考CMU讲义
    ffmpeg 通过遍历视频流,对视频帧进行打标
    高并发高可用--反向代理与负载均衡
    微软Edge浏览器集锦功能卡顿不能添加、无法注释等问题的解决方法
    Gbase数据库
    未知待解决问题整理_像素流带宽占用问题
    HTML设计一个简单的奥迪RS汽车主题网站( web网页制作期末大作业)
    三面面试官:运行 npm run xxx 的时候发生了什么?
  • 原文地址:https://blog.csdn.net/m0_67401270/article/details/126081280