확장 가능한 고성능 분산 객체 스토리지 시스템인 MinIO의 소개, 배포 단계 및 코드 예시

자세한 소개

MinIO는 Amazon S3 API와 호환되도록 설계되었으며 주로 프라이빗 클라우드 및 엣지 컴퓨팅 시나리오에 사용되는 인기 있는 오픈 소스 객체 스토리지 시스템입니다. 고성능, 고가용성, 관리가 용이한 객체 스토리지 서비스를 제공합니다. 다음은 MinIO의 자세한 소개와 장점, 단점입니다.

  1. 아키텍처 및 기능:

    • 오픈 소스 및 크로스 플랫폼 : MinIO는 오픈 소스이며 무료(Apache v2.0 라이선스)이며 Linux, Windows, macOS 등과 같은 여러 플랫폼에서의 배포를 지원합니다.
    • 분산 스토리지 : MinIO를 분산 방식으로 배포할 수 있으며 이레이저 코딩(Erasure Coding) 기술을 통해 데이터 중복성을 구현합니다. 일부 하드 디스크에 장애가 발생하더라도 데이터를 복구할 수 있습니다. 일반적으로 N/2개의 디스크 손실이 허용되도록 구성됩니다. 데이터 가용성을 유지하면서 복구합니다.
    • Amazon S3 호환성 : Amazon S3의 v2 및 v4 API와 완벽하게 호환되므로 S3 기반 애플리케이션 및 서비스가 MinIO로 원활하게 전환할 수 있습니다.
    • 고성능 : 대규모 워크로드용으로 설계되어 매우 높은 동시 읽기 및 쓰기 요청을 처리할 수 있으며 최신 하드웨어에서 우수한 성능을 발휘합니다.
    • 보안 : 서버 측 암호화(SSE), 클라이언트 측 암호화, 인증(JWT 또는 사용자 정의 인증 메커니즘 사용), 액세스 정책 제어를 포함한 다양한 보안 조치를 제공합니다.
  2. 이점:

    • 비용 효율성 : 상용 객체 스토리지 솔루션에 비해 MinIO는 추가 라이센스 비용이 필요하지 않아 스토리지 비용이 절감됩니다.
    • 간단하고 사용하기 쉬움 : 설치 및 구성이 비교적 간단하고 사용자 인터페이스가 친숙하며 명령줄 도구, 웹 UI 또는 SDK를 통해 관리 및 작동이 가능합니다.
    • 확장성 : 수평 확장성이 뛰어나며 필요에 따라 노드를 추가하여 용량과 성능을 높일 수 있습니다.
    • 데이터 보호 : 삭제 코딩 기술을 사용하여 데이터 신뢰성을 보장하고 검증 및 체크섬을 지원하여 데이터 무결성을 보장합니다.
  3. 프런트엔드 사용 시나리오의 장점과 단점:

    • 이점 :
      • Webpack 엔지니어링을 통해 구축된 프로젝트의 경우 실행 환경에 Node.js가 포함되어 있으므로 API를 통해 파일을 MinIO 서버에 직접 업로드할 수 있습니다.
      • AWS SDK와 호환되므로 개발자가 개발을 위해 기존 S3 인터페이스 코드를 호출하는 것이 편리합니다.
    • 단점 :
      • Node.js 네이티브 모듈을 사용할 수 없기 때문에 Vite와 같은 순수 브라우저 모듈 로더로 빌드된 프로젝트에는 적합하지 않습니다.
      • 프런트엔드 직접 업로드에는 업로드 진행 상황에 대한 직관적인 피드백이 부족하여 사용자 경험이 좋지 않습니다.
      • 포트, 계정 비밀번호 등의 구성 정보를 프런트 엔드에 하드 코딩하면 보안 위험이 발생하고 유지 관리 및 확장이 어려워집니다.
  4. 전반적인 장점과 단점:

    • 이점 :
      • 고성능, 높은 신뢰성 및 손쉬운 확장성
      • 이미 AWS S3 에코시스템을 사용하고 있는 조직을 위한 우수한 호환성과 낮은 마이그레이션 비용
      • 오픈 소스 커뮤니티는 활성화되어 있으며 지속적으로 업데이트되고 개선됩니다.
    • 단점 :
      • 대규모 엔터프라이즈급 스토리지 솔루션에 비해 일부 고급 기능과 전문적인 지원이 부족할 수 있습니다.
      • 일부 특정 애플리케이션 시나리오(예: 위에서 언급한 프런트 엔드를 직접 연결할 때의 보안 및 경험 문제)에서는 솔루션을 개선하기 위해 추가 개발 작업이 필요합니다.
      • S3 API에 익숙하지 않은 팀의 경우 학습 곡선이 있을 수 있습니다.

MinIO는 특히 저비용, 고가용성 및 유연한 확장성을 갖춘 프라이빗 클라우드 스토리지를 원하는 조직을 위한 클라우드 네이티브 애플리케이션을 위한 강력하고 이상적인 스토리지 솔루션입니다. 그러나 실제 사용에서는 장단점을 신중히 검토해야 하며, 잠재적인 문제를 극복하기 위해 특정 비즈니스 시나리오에 따라 적절한 전략과 기술적 수단을 채택해야 합니다.

기능: MinIO | 고성능, Kubernetes 네이티브 객체 스토리지

MinIO 배포 단계

MinIO가 시스템과 환경에 따라 배포되는 방식에는 약간의 차이가 있지만 기본 개념은 유사합니다. 즉, 컨테이너화 또는 직접 설치를 통해 S3 API 호환 객체 스토리지 서비스를 실행한다는 것입니다. 다음에서는 Kubernetes, Docker, CentOS, Windows, macOS 및 기타 시스템에 MinIO의 서버측을 배포하는 방법을 간략하게 소개하고 클라이언트 연결에 대한 몇 가지 기본 지침을 제공합니다.

Kubernetes(k8s)는 MinIO 서버 배포

  1. MinIO StatefulSet 또는 배포를 생성합니다.

    야믈
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: minio-deployment
    spec:
      replicas: 4 # 根据需求设置副本数量以实现高可用性
      selector:
        matchLabels:
          app: minio
      template:
        metadata:
          labels:
            app: minio
        spec:
          containers:
          - name: minio
            image: minio/minio:latest
            args: ["server", "/data"]
            ports:
            - containerPort: 9000
            env:
            - name: MINIO_ACCESS_KEY
              value: "your-access-key"
            - name: MINIO_SECRET_KEY
              value: "your-secret-key"
            volumeMounts:
            - mountPath: /data
              name: minio-data
          volumes:
          - name: minio-data
            persistentVolumeClaim:
              claimName: minio-pvc # 需要预先创建并绑定到实际PV
  2. 명령을 사용하여 kubectl applyYAML 구성 파일을 적용하여 StatefulSet 또는 배포 리소스를 생성합니다. 구성 파일은 일반적으로 이미지, PV(영구 볼륨) 및 PVC(영구 볼륨 할당), 포트 매핑 및 필수 환경 변수를 지정합니다.
  3. 서비스 리소스 구성:  서비스 리소스를 생성하여 MinIO 서비스를 노출하고 ClusterIP, NodePort 또는 LoadBalancer를 통해 외부 액세스를 제공합니다.

  4. MinIO 클러스터 초기화(필요한 경우):  분산형 MinIO를 배포하려는 경우 각 포드가 서로를 검색하고 클러스터를 형성할 수 있도록 시작 매개변수와 환경 변수가 올바르게 구성되었는지 확인해야 합니다.

Docker는 MinIO 서버를 배포합니다.

  1. 이미지 가져오기 :

    docker pull minio/minio
  2. 컨테이너 실행 : 단일 노드 인스턴스:

    docker run -p 9000:9000 -p 9001:9001 --name minio \
    -e "MINIO_ACCESS_KEY=youraccesskey" \
    -e "MINIO_SECRET_KEY=yoursecretkey" \
    -v /path/to/data:/data \          #新版目录已经更改为/mnt/data
    minio/minio server /data

    분산 모드에서는 클러스터 모드와 기타 클러스터 멤버를 정의하기 위해 추가 환경 변수가 필요합니다.

docker-compose.yaml

version: '3.9'  # 使用最新的Docker Compose版本以利用新特性

services:
  minio:
    image: minio/minio:RELEASE.2024-01-05T22-17-24Z.fips  # 使用最新稳定版镜像(或指定特定版本)
    container_name: minio
    ports:
      - "19000:9000"  # 根据实际需求决定是否暴露9001端口,用于HTTPS访问时需要
      - "19001:9001"  # 根据实际需求决定是否暴露9001端口,用于HTTPS访问时需要
    environment:
      MINIO_ROOT_USER: youradminaccount
      MINIO_ROOT_PASSWORD: youradminpassword
      #MINIO_BROWSER: off  # (可选)关闭Web浏览器界面,如果只通过API访问
      #MINIO_OPTS: server --address ":9000"  # (可选)自定义启动参数,比如启用多节点集群模式等
    volumes:
      - /your pathto/minio_data:/data  # 确保宿主机目录存在并有合适的权限
    command: server /data --console-address ":9001"  --address ":9000" # 指定控制台监听的静态端口为9001

서브맨

podman run -p 9000:9000 -p 9001:9001 minio/minio server /data --console-address ":9001"

podman run --name my-mc --hostname my-mc -it --entrypoint /bin/bash --rm minio/mc
[root@my-mc /]# mc alias set myminio/ https://my-minio-service MY-USER MY-PASSWORD
[root@my-mc /]# mc ls myminio/mybucket

CentOS에 직접 MinIO 서버 설치

  1. 종속성 설치 :

    sudo yum install -y epel-release
    sudo yum install -y mc httpd-tools
  2. MinIO 바이너리 패키지 다운로드 및 압축 풀기 : 최신 버전의 MinIO 바이너리 패키지를 다운로드하고 압축을 푼 후  /usr/local/bin 원하는 디렉터리 또는 지정한 디렉터리로 이동합니다. 디렉터리를 사용자 정의할 때 해당 디렉터리를 시스템 환경의 PATH에 추가하는 것이 좋습니다. .

  3. MinIO 실행 : Docker의 데이터 볼륨 마운트와 유사하게 로컬 디렉터리를 스토리지 경로로 제공해야 합니다.

    mkdir -p /mnt/minio/data
    nohup minio server /mnt/minio/data &

Windows에 MinIO 서버 배포

지침:

  1. 1단계: MinIO 서버 다운로드

    MinIO 공식 다운로드 페이지를 방문하여 Windows 운영 체제용 실행 파일을 얻으세요: 다운로드 주소: MinIO | 고성능 객체 스토리지를 생성하기 위한 코드 및 다운로드

  2. 2단계: 압축을 풀고 설치하세요.

  3. 다운로드가 완료되면 MinIO 서비스 프로그램을 저장하려는 위치(예:  C:\develop\minio.

  4. 3단계: 데이터 저장 디렉터리 생성

    데이터를 지속적으로 저장하려면 로컬 하드 디스크에 업로드된 파일을 저장할 디렉터리를 생성해야 합니다. 예를 들어  D:\minio-data 저장소 디렉터리를 생성합니다.

    4단계: MinIO 서버 시작

    명령 프롬프트(CMD) 창을 열고 관리자 권한으로 실행한 후 MinIO 실행 파일이 있는 디렉터리로 변경합니다.

    cd C:\develop\minio

    그런 다음 다음 명령을 사용하여 MinIO 서버를 시작하고 를  <MINIO_ACCESS_KEY>사용자 <MINIO_SECRET_KEY> 지정 액세스 키와 개인 키로 바꾸고 데이터가 저장될 디렉터리를 지정합니다.

    .\minio.exe server D:\minio-data --address ":9000" --access-key <MINIO_ACCESS_KEY> --secret-key <MINIO_SECRET_KEY>

    5단계: 환경 구성(선택 사항)

    도메인 이름이나 기타 고급 옵션을 설정해야 하는 경우 환경 변수를 사용하여 구성할 수 있습니다. 예를 들어 MINIO_DOMAIN 환경 변수를 설정합니다.

    set MINIO_DOMAIN=my-minio-server.local

    그런 다음 환경 변수를 포함하여 MinIO 서비스를 시작합니다.

    6단계: 확인 및 액세스

  5. MinIO 서버는 기본적으로 포트 9000을 수신하므로 브라우저를 통해 웹 관리 인터페이스에 액세스할 수 있습니다  http://localhost:9000 .
  6. 이전에 설정한 액세스 키와 개인 키를 사용하여 로그인합니다. (초기 기본값은  minioadmin 및  입니다 minioadmin.)
  7. 방화벽 또는 보안 그룹 규칙이 포트 9000에 대한 액세스를 허용하는지 확인하십시오. 프로덕션 환경에서는 시스템 보안을 보장하기 위해 기본 액세스 키와 개인 키를 변경해야 합니다. 분산 모드에서 MinIO를 배포해야 하는 경우 클러스터 배포에 대한 특정 단계에 대한 공식 설명서를 참조하세요. 다중 노드 배포의 경우 클러스터 멤버십 및 삭제 코딩과 같은 정보를 정의하려면 추가 구성 매개변수가 필요합니다.

파워셸 방식:

## 安装minio,先直接拉取exe
Invoke-WebRequest -Uri "https://dl.min.io/server/minio/release/windows-amd64/minio.exe" -OutFile "C:\minio.exe"
setx MINIO_ROOT_USER admin
setx MINIO_ROOT_PASSWORD password
C:\minio.exe server F:\Data --console-address ":9001"


## client
Invoke-WebRequest -Uri "https://dl.minio.io/client/mc/release/windows-amd64/mc.exe" -OutFile "C:\mc.exe"
C:\mc.exe alias set myminio/ http://MINIO-SERVER MYUSER MYPASSWORD

macOS에 MinIO 서버 배포

  1. Homebrew를 설치합니다 (아직 설치하지 않은 경우).

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  2. Homebrew를 사용하여 MinIO 설치 :

    brew install minio/stable/minio
  3. MinIO 실행 : 로컬 디렉터리를 가리키는 터미널에서 MinIO 서버를 실행합니다.

    mkdir -p ~/minio-storage
    minio server ~/minio-storage
클라이언트 연결 및 사용:

클라이언트 연결의 경우 MinIO 서버가 배포된 환경에 관계없이 다음 단계를 사용하여 연결할 수 있습니다.

  1. 환경 변수를 설정합니다 (선택 사항, 명령줄 작업을 단순화하기 위해):

    export MINIO_ENDPOINT=http://localhost:9000
    export MINIO_ACCESS_KEY=youraccesskey
    export MINIO_SECRET_KEY=yoursecretkey
  2. MinIO 클라이언트 도구 mc 사용 : mc( minio/mc)를 설치한 후 다음 명령을 사용하여 MinIO 서버에 연결합니다.

    mc alias set myminio $MINIO_ENDPOINT $MINIO_ACCESS_KEY $MINIO_SECRET_KEY
  3. 연결 확인mc ls myminio 버킷 목록을 보려면 실행하세요. 모든 것이 정상이면 서버에서 버킷 정보를 볼 수 있어야 합니다.

프로덕션 환경에서는 위 예시의 "youraccesskey" 및 "yoursecretkey"를 실제 액세스 키 및 개인 키로 바꾸고 실제 상황에 따라 네트워크 구성 및 지속성 스토리지 설정을 조정해야 합니다. 동시에 공용 네트워크 액세스 제한, SSL 암호화 활성화 등과 같은 모범적인 보안 관행을 따르십시오.

 브라우저 액세스:

MinIO 서버 액세스 및 관리

MinIO 서버를 시작한 후 브라우저나 S3 API를 통해 MinIO 서버에 액세스하고 관리할 수 있습니다.

파이썬 샘플 코드:

다음은 MinIO의 Python SDK를 사용하여 MinIO 서버와 상호 작용하는 방법을 보여주는 Python으로 작성된 샘플 코드입니다.

import boto3

# 创建MinIO客户端
s3 = boto3.client('s3',
                  endpoint_url='http://localhost:9000',
                  aws_access_key_id='YOUR_ACCESS_KEY',
                  aws_secret_access_key='YOUR_SECRET_KEY')

# 列出所有桶
response = s3.list_buckets()
for bucket in response['Buckets']:
    print(bucket['Name'])

# 创建一个桶
s3.create_bucket(Bucket='mybucket')

# 上传文件
s3.upload_file('myfile.txt', 'mybucket', 'myfile.txt')

# 下载文件
s3.download_file('mybucket', 'myfile.txt', 'downloaded_file.txt')

# 删除文件
s3.delete_object(Bucket='mybucket', Key='myfile.txt')

# 删除桶
s3.delete_bucket(Bucket='mybucket')

위 코드는 boto3 라이브러리를 사용하여 MinIO 서버와 상호 작용합니다. 매개 endpoint_url변수는 올바른 MinIO 서버 주소를 가리켜야 하며 aws_access_key_id매개 aws_secret_access_key변수는 올바른 액세스 키로 설정되어야 합니다.

nodejs 예:

MinIO Node.js SDK 설치

먼저 Node.js 프로젝트에 MinIO SDK를 설치합니다.

npm install minio

샘플 코드

1. MinIO 클라이언트 초기화
const Minio = require('minio');

// 创建一个MinIO客户端实例
var minioClient = new Minio.Client({
    endPoint: 'your-minio-server-endpoint',
    port: 9000, // 默认端口为9000,如果自定义了端口,请修改
    useSSL: false, // 如果是https连接,则设置为true
    accessKey: 'your-access-key',
    secretKey: 'your-secret-key'
});

// 检查连接
minioClient.ping((err) => {
  if (err) throw err;
  console.log('Connected to MinIO server successfully.');
});
2. 버킷 생성
minioClient.makeBucket('my-bucket', 'us-west-1', function(err) {
  if (err) return console.log(err);
  console.log('Bucket created successfully');
});
3. 버킷에 파일 업로드
// 读取本地文件
const fs = require('fs');
fs.readFile('local-file.txt', (err, data) => {
  if (err) throw err;

  // 上传文件到MinIO
  minioClient.putObject('my-bucket', 'remote-file.txt', data, data.length, 'application/text', function(err, etag) {
    if (err) return console.log(err);
    console.log("File uploaded successfully.");
  });
});
4. 버킷의 모든 객체 나열
minioClient.listObjectsV2('my-bucket', '', true, function(err, objects) {
  if (err) return console.log(err);
  
  for (let obj of objects) {
    console.log(obj.name);
  }
});

위 코드의 your-minio-server-endpoint, your-access-keyyour-secret-key실제 MinIO 서버 주소, 액세스 키, 개인 키로 바꿔주세요. 또한 필요에 따라 버킷 이름, 로컬 파일 경로 및 원격 개체 이름을 조정합니다.

추천

출처blog.csdn.net/zrc_xiaoguo/article/details/135435652