• 터미널이나 윈도우 cmd 에서 작업 가능
  • 백업 등 프로그램들을 할때 shell을 통하여 업로드하면 편함


1. MinIO 설치

$ wget -P /usr/bin https://dl.min.io/client/mc/release/linux-amd64/mc
$ chmod +x /usr/bin/mc

# 기본 버전 확인
$ mc --version
mc version RELEASE.2022-02-02T02-03-24Z



2. 기본 커맨드

  1. Minio가 의도한 대로 작동하는지 확인 → http://[MinIO IP]:9000/
  2. 자격 증명을 입력
    • Access Key (액세스 키) : minio
    • Secret Key (비밀 키) : melovethanos

2.1. access key와 secret key를 MinIO client 등록

  • mc 모든 구성 정보를 ~/.mc/config.json파일에 저장
  • 는 단순히 클라우드 스토리지 서비스의 짧은 이름
  • S3 엔드포인트, 액세스 및 비밀 키는 클라우드 스토리지 제공업체에서 제공
    # set access key / secret key
    # 형식 : mc alias set my-storage http://192.168.0.30:9001 ROOT_ACCESS_KEY_CHANGE_ME SECRET_ACCESS_KEY_CHANGE_ME
    $ mc alias set hippo http://[MinIO IP]:9000 minio melovethanos
    mc: Configuration written to `/root/.mc/config.json`. Please update your access credentials.
    mc: Successfully created `/root/.mc/share`.
    mc: Initialized share uploads `/root/.mc/share/uploads.json` file.
    mc: Initialized share downloads `/root/.mc/share/downloads.json` file.
    Added `hippo` successfully.

2.2. MinIO client로 bucket 생성

## bucket 생성
$ mc mb hippo/mctest
Bucket created successfully `hippo/mctest`.

2.3. MinIO client로 bucket 리스트 확인

## bucket 리스트 확인
$ mc ls hippo
[2022-02-03 01:22:49 KST]     0B hello/
[2022-02-04 02:55:46 KST]     0B mctest/
[2022-02-04 02:00:24 KST]     0B thanos/

2.4. MinIO client로 bucket에 파일 및 디렉토리 업로드

# upload
# 형식 : mc cp SOURCE ALIAS/PATH
# 파일 복사
$ mc cp ./Prometheus_Restart.sh hippo/hello/Prometheus_Restart.sh

..._Restart.sh:  115 B / 115 B ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 12.78 KiB/s 0s

# 성공적으로 파일 upload 확인
$ mc ls hippo/hello
[2022-02-04 03:04:44 KST]   115B STANDARD Prometheus_Restart.sh

# 디렉토리 복사
$ mc cp --recursive ./test hippo/hello/

..._Restart.sh:  578 B / 578 B ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 58.30 KiB/s 0s

# 성공적으로 디렉토리 upload 확인
$ mc ls hippo/hello/test
[2022-02-04 03:13:27 KST]   348B STANDARD Prometheus_Log_Clear.sh
[2022-02-04 03:13:27 KST]   115B STANDARD Prometheus_Log_View.sh
[2022-02-04 03:13:27 KST]   115B STANDARD Prometheus_Restart.sh

2.5. MinIO client로 bucket에 파일 및 디렉토리 삭제

# 디렉토리 내 리스트 확인
$ mc ls hippo/hello/test
[2022-02-04 03:13:27 KST]   348B STANDARD Prometheus_Log_Clear.sh
[2022-02-04 03:13:27 KST]   115B STANDARD Prometheus_Log_View.sh
[2022-02-04 03:13:27 KST]   115B STANDARD Prometheus_Restart.sh

# 형식 : mc rm ALIAS/PATH
# 파일 삭제
$ mc rm hippo/hello/test/Prometheus_Restart.sh
Removing `hippo/hello/test/Prometheus_Restart.sh`.

# 성공적으로 파일 삭제 확인
$ mc ls hippo/hello/test
[2022-02-04 03:13:27 KST]   348B STANDARD Prometheus_Log_Clear.sh
[2022-02-04 03:13:27 KST]   115B STANDARD Prometheus_Log_View.sh

# 형식 : mc rm --recursive --force ALIAS/PATH
# 디렉토리 삭제
$ mc rm --recursive --force hippo/hello/test
Removing `hippo/test/Prometheus_Log_Clear.sh`.
Removing `hippo/test/Prometheus_Log_View.sh`.

# 성공적으로 디렉토리 삭제 확인 -> hippo/hello/test 디렉토리 없음을 확인
$ mc ls hippo/hello
[2022-02-04 03:04:44 KST]   115B STANDARD Prometheus_Restart.sh

2.6. minio client로 bucket에 파일 다운로드 → 업로드와 위치만 변경

# download
# 형식 : mc cp my-storage/test.zip ~/test.zip
#위 cp 예제에서 source/target을 위치를 바꿈.
$ mc cp hippo/hello/Prometheus_Restart.sh /Prometheus_Restart.sh

..._Restart.sh:  115 B / 115 B ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 14.64 KiB/s 0s

# / 디렉토리 아래에 Prometheus_Restart.sh 파일 존재 확인
$ ls /Prometheus_Restart.sh
Prometheus_Restart.sh



3. 공유 파일 → 특정 파일을 특정일만 공유

  • 공유기간을 설정후 카피 버튼을 클릭해서 복사후 공유
  • 파일을 공유하기 위해 카피 버튼 클릭
  • Copy Link를 통해 접근 URL을 획득



4. 일반 웹서버처럼 공유 → 공유 기간을 무한정으로 설정

4.1. 버킷 자체를 public으로 설정

# 형식 : mc policy set public my-storage/test_bucket
$ mc policy set public hippo/hello
Access permission for `hippo/hello` is set to `public`

4.2. 버킷의 policy를 확인

$ mc policy get hippo/hello
Access permission for `hippo/hello` is `public`

4.3. 다운로드 테스트 → minio에서의 웹사이트 주소에는 minio client의 alias인 hippo는 제외

# minio 서버에 bucket 디렉토리가 바로 뒤로 붙음
$ wget http://[MinIO IP]:9000/hello/Prometheus_Restart.sh
--2022-02-04 03:33:43--  http://[MinIO IP]:9000/hello/Prometheus_Restart.sh
Connecting to [MinIO IP]:9000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 115 [application/x-sh]
Saving to: ‘Prometheus_Restart.sh’

    100%[===============================================>] 115         --.-K/s   in 0s

2022-02-04 03:33:43 (7.72 MB/s) - ‘Prometheus_Restart.sh’ saved [115/115]

1. 쿠버네티스를 통해 MinIO 설치

$ vi minio_install.yml
apiVersion: v1
kind: Namespace
metadata:
  name: minio
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: minio-local-persistent-volume
  namespace: minio
spec:
  capacity:
    storage: 6.9T
  accessModes:
  - ReadWriteMany
  volumeMode: Filesystem
  storageClassName: "minio-local-storage"
  local:
    path: /data
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - "Minio설치IP"

  claimRef:
    namespace: minio
    name: minio-local-persistent-volume-claim
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: minio-local-persistent-volume-claim
  namespace: minio
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 6.9T
  storageClassName: minio-local-storage
  volumeMode: Filesystem
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: minio-deployment
  namespace: minio
spec:
  selector:
    matchLabels:
      app: minio
  strategy:
    type: Recreate
  replicas: 1
  template:
    metadata:
      labels:
        app: minio
    spec:
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: minio-local-persistent-volume-claim
      containers:
      - name: minio
        image: minio/minio:latest
        args:
        - "server"
        - "--address=:9000"
        - "--console-address=:9001"
        - "/data"
        env:
        - name: MINIO_ACCESS_KEY
          value: "minio"
        - name: MINIO_SECRET_KEY
          value: "melovethanos"
        ports:
        - name: service
          containerPort: 9000
        - name: console
          containerPort: 9001
        volumeMounts:
        - name: data
          mountPath: /data
---
apiVersion: v1
kind: Service
metadata:
  name: minio-service-headless
  namespace: minio
spec:
  selector:
    app: minio
  ports:
  - name: service
    port: 9000
    targetPort: 9000
    protocol: TCP
  - name: console
    port: 9001
    targetPort: 9001
    protocol: TCP
  type: ClusterIP
  clusterIP: None
---
apiVersion: v1
kind: Service
metadata:
  name: minio-loadbalancer-service
  namespace: minio
spec:
  selector:
    app: minio
  ports:
  - name: service
    port: 9000
    targetPort: 9000
    protocol: TCP
  - name: console
    port: 9001
    targetPort: 9001
    protocol: TCP
  type: LoadBalancer



2. MinIO 생성 및 MinIO 생성 확인

# MinIO생성
$ kubectl apply -f minio_install.yml
namespace/minio created
persistentvolume/minio-local-persistent-volume created
persistentvolumeclaim/minio-local-persistent-volume-claim created
deployment.apps/minio-deployment created
service/minio-service-headless created
service/minio-loadbalancer-service created

# 생성 확인 → 내용이 많아 생략함
$ kubectl get -n minio all -o wide

# PV 생성 확인
$ kubectl get -n minio persistentvolume
NAME                                       CAPACITY  ACCESS MODES       RECLAIM POLICY   STATUS CLAIM            STORAGECLASS                                     REASON                       AGE
minio-local-persistent-volume     6900G          RWX                        Retain                  Bound    minio/minio-local-persistent-volume-claim       minio-local-storage              92s

# PVC 생성 확인
$ kubectl get -n minio persistentvolumeclaims
NAME                                              STATUS                   VOLUME                 CAPACITY   ACCESS MODES          STORAGECLASS              AGE
minio-local-persistent-volume-claim   Bound    minio-local-persistent-volume   6900G            RWX                  minio-local-storage          117s



3. headless 서비스 nslookup 확인

$ nslookup minio-service-headless.minio.svc.cluster.local
Server:         210.220.163.82
Address:        210.220.163.82#53

Non-authoritative answer:
Name:   minio-service-headless.minio.svc.cluster.local
Address: 218.38.137.27



4. MinIO 서비스의 Service IP를 통해 생성 확인 → Access Denied로 접근 불가

  • minio에 curl로 접근하면 Access Denied됨으로 다른 방법으로 접근

    # clusterIP 서비스를 통해 접근 가능
    $ curl 20.10.118.211:9000
    <?xml version="1.0" encoding="UTF-8"?>
    <Error><Code>AccessDenied</Code><Message>Access Denied.</Message><Resource>/</Resource><RequestId>16E0270B55D8E06A</RequestId><HostId>c2659a6e-1046-4fd9-8793-e756fbc033a2</HostId></Error>
    
    # LoadBalancer 할당 IP 서비스를 통해 접근 가능
    $ curl [LoadBalancer IP]:9000
    <?xml version="1.0" encoding="UTF-8"?>
    <Error><Code>AccessDenied</Code><Message>Access Denied.</Message><Resource>/</Resource><RequestId>16E026EBFCC13E44</RequestId><HostId>c2659a6e-1046-4fd9-8793-e756fbc033a2</HostId></Error>



5. MinIO 서비스에 Python으로 접근하여 확인

  • curl로 접근할 수 없기에 MinIO Client로 접근

    # minio 테스트에 사용할 파이썬3과 minio 패키지 설치
    $ yum install -y python3
    $ pip3 install minio
    
    # minio 접속 가능 테스트
    $ vi minio_api.py
    #!/bin/python3
    from minio import Minio
    
    if __name__ == '__main__':
       minioIP = "20.10.180.199:9000"     # serviceIP
       minioAccessKey = "minio"
       minioSecretKey = "melovethanos"
       client = Minio(minioIP, minioAccessKey, minioSecretKey, secure=False)
       print(client)
    
    # minio 접속 가능 테스트 실행 -> Minio Object 출력 시 이상 없음
    $ python3 minio_api.py
    <minio.api.Minio object at 0x7f2740e873c8>

  • 서버에 MinIO 설치
  • 로컬 디스크에 데이터를 유지하는 간단한 S3 호환 Minio 엔진을 시작

 

1. MinIO docker 설치

$ mkdir -p /data/minio
$ mkdir -p /var/log/minio/
$ touch /var/log/minio/minio.log

$ docker run -d --rm --name minio \
    -v /data/minio:/data \
    -v /var/log/minio/minio.log:/log/minio.log \
    -p 9000:9000 \
    -e "MINIO_ACCESS_KEY=minio" \
    -e "MINIO_SECRET_KEY=melovethanos" \
    -e "MINIO_HTTP_TRACE=/log/minio.log" \
    minio/minio:RELEASE.2019-01-31T00-31-19Z \
    server --anonymous --json /data

 

2. minio logrotate 작성

  1. 매주 생성
  2. gz으로 압축
  3. 압축파일에 날짜를 명시
  4. 수행 완료 후 minio 컨테이너 재실행
    $ vi /etc/logrotate.d/minio
    /var/log/minio/*.log {
    weekly
    rotate 5
    create 0644 root root
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
       /bin/docker restart `docker ps | grep -i minio | awk -F ' ' '{print$1}'` > /dev/null 2>/dev/null || true
    endscript
    }

3. minio logrotate를 실행할 /etc/crontab 설정 및 logroate 적용

# logrotate 디버그
$ /usr/sbin/logrotate -d /etc/logrotate.d/minio
Allocating hash table for state file, size 15360 B

Handling 1 logs

rotating pattern: /var/log/minio/*.log  weekly (5 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/minio/minio.log
  log does not need rotating (log has been already rotated)not running postrotate script, since no logs were rotated

# logrotate 적용
$ /usr/sbin/logrotate -f /etc/logrotate.d/minio

# 압축 파일 생성 확인
$ ls /var/log/minio/
minio.log  minio.log.1.gz

# /etc/crontab 적용
# 매주 일요일 자정 logrotate 실행
$ vi /etc/crontab
00 00 * * 7 /usr/sbin/logrotate -f /etc/logrotate.d/minio

# log 확인
$ cat /var/lib/logrotate/logrotate.status  | grep minio
"/var/log/minio/minio.log" 2022-2-6-0:9:7  

 

4. thanos bucket(타노스 버킷) 생성

  • 향후 minio 오브젝트 스토리지에 thano 실행하기 위한 디렉토리 생성
    $ mkdir /data/minio/thanos

5. Minio 배포 확인

  1. Minio가 의도한 대로 작동하는지 확인 → http://[설치 서버IP]:9000
  2. 자격 증명을 입력
    • Access Key (액세스 키) : minio
    • Secret Key (비밀 키) : melovethanos

 

 

1. MinIO 다운로드

  • MinIO가 /usr/local/bin 아래에서 실행 될 수 있도록 /usr/local/bin으로 이동 후 MinIO을 다운 받음
    $ cd /usr/local/bin
    $ wget https://dl.min.io/server/minio/release/linux-amd64/minio
    $ chmod +x minio


2. minio.conf 설정

  • /etc 밑에 minio 폴더를 만든 다음, minio,.conf을 생성

    $ mkdir /etc/minio
    $ vi /etc/minio/minio.conf

  • /etc/minio/minio.conf 파일 내용

    $ vi /etc/minio/minio.conf
    MINIO_VOLUMES="/data"              # minio 의 파일들을 관리할 위치 (volumes)
    MINIO_OPTS="--address :9000"       # minio 서비스에 대한 연결 포트
    MINIO_ROOT_USER=root               # root
    MINIO_ROOT_PASSWORD=root           # root의 비밀번호
    MINIO_ACCESS_KEY= "minioadmin"     # minio 접속 아이디
    MINIO_SECRET_KEY= "minioadmin"     # minio 접속 비밀번호



3. Centos Systemd에 MinIO 서비스 등록

  • /usr/lib/systemd/system/ 디렉토리에 minio.service 설정

    $ vi /usr/lib/systemd/system/minio.service
    [Unit]
    Description=MinIO
    Documentation=https://docs.min.io
    Wants=network-online.target
    After=network-online.target
    AssertFileIsExecutable=/usr/local/bin/minio
    
    [Service]
    EnvironmentFile=/etc/minio/minio.conf
    ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
    ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
    
    # Let systemd restart this service always
    Restart=always
    
    # Specifies the maximum file descriptor number that can be opened by this process
    LimitNOFILE=65536
    
    # Disable timeout logic and wait until process is stopped
    TimeoutStopSec=infinity
    SendSIGKILL=no
    
    [Install]
    WantedBy=multi-user.target
    # Built for ${project.name}-${project.version} (${project.name})

  • Systemd에 MinIO 서비스 적용

    $ systemctl daemon-reload

4. MinIO Service 실행

  • MinIO service 실행 및 영구 실행 적용

    $ systemctl start minio.service
    $ systemctl enable minio.service

  • MinIO service 상태 확인

    $ systemctl status minio.service



5. MinIO에 접속

  • IP:9000 접속하면 MinIO UI가 출력


  • MinIO UI에 로그인하면 아래와 같이 접속


  • MinIO는 오픈소스로 제공되는 오브젝트 스토리지 서버
  • AWS S3와 호환되는 클라우드 스토리지를 구축할 수 있는 도구
  • MinIO는 Golang으로 제작되며, 단일 실행 파일 형태로 설치 방법이 매우 간단
  • MinIO에서 데이터 보호를 위해서 Erasure Code를 사용
  • MinIO의 기본 document URL : https://docs.min.io/docs/
  • MiniO의 Console 참고 URL : https://docs.min.io/minio/baremetal/console/minio-console.html

 

MinIO를 제공하는 3가지 형태의 도구

  1. MinIO Server
    • 클라우드 스토리지 서버(오브젝트 스토리지)를 구성 가능
  1. MinIO Client
    • MinIO Server, AWS S3, GCS 등에 연결하여 파일 업로드 및 관리 등의 기능을 제공
  1. MinIO Library
    • 개발자를 위하여 Golang, Java, Python 등 SDK를 제공하는 라이브러리

 

minIO의 성능

  • minIO는 빠른 객체 스토리지
  • 읽기 속도 : 183GB/s
  • 쓰기 속도 : 171GB/s

 

minIO의 확장성

  • minIO는 간단한 확장 모델을 사용
  • 여러개의 minIO 인스턴스를 하나의 클러스터로 묶고, 클러스터들은 다시 글로벌 네임스페이스를 생성하며 병합

 

minIO기능

1. Erasure Coding

  • minIO는 어셈블리 언어로 작성된 Erasure Coding을 통해 데이터를 보호
  • minIO는 Reed-Solomon 알고리즘을 사용 → 여러 블럭으로 쪼개진 데이터 중 많은 부분이 손실되어도 복구가 가능
  • minIO는 오브젝트 수준에서 데이터 복구가 가능

 

2. Bitort Protection

  • 디스크 드라이브는 노후화된 디스크, 물리적 충격, 펌웨어의 버그 등의 문제로 데이터가 부패할 수 있지만, 사용자는 문제를 인식하지 못 할 수 있음
  • 사용자가 인식하지 못하는 데이터 손실을 minIO는 해쉬 알고리즘을 통해서 쓰고 읽을 때의 데이터가 동일한지 검증

 

minIO의 Architecture

  • minIO는 클라우드 친화적으로 설계되었으며, 경량의 컨테이너로 구동이 가능
  • 컨테이너는 40MB이하의 바이너리 파일로 매우 가벼움

 

아키텍처 개념도

  • 여러 노드에 분산된 minIO를 하나로 묶어서 사용 → 어플리케이션 수준에서는 S3 API를 이용하여 자원 접근 가능
  • 클러스터 내부에 minIO간에는 RESTful API를 통해서 통신
  • minIO는 내부적으로 3개의 Layer로 구성
    1. S3 Lyaer : 대외적인 네트워크를 처리하는 영역
    2. Object Layer : Cache, Compression, Encryption, Erasure code, Bitrot와 같이 minIO 기능들을 수행하는 영역
    3. Storage Layer : File System과 직접적으로 통신하는 영역

+ Recent posts