본문 바로가기
서버구축 (WEB,DB)

MinIO(S3) 객체 스토리지에 파일 및 로그 자동백업 구성

by 날으는물고기 2024. 9. 8.

MinIO(S3) 객체 스토리지에 파일 및 로그 자동백업 구성

Minio는 AWS S3와 호환되는 객체 스토리지 서버로, S3 API와 호환되어 다양한 애플리케이션에서 쉽게 사용할 수 있습니다. 설정이나 로그 백업을 Minio 버킷에 저장하는 방법입니다.

1. Minio 서버 설치 및 설정

Minio 서버를 설치하고 설정해야 합니다. 여기서는 Linux 서버에 Minio를 설치하는 과정을 설명하겠습니다.

1.1 Minio 서버 설치

wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/

1.2 Minio 서버 실행

export MINIO_ROOT_USER=minioadmin
export MINIO_ROOT_PASSWORD=minioadmin123
minio server /mnt/data

1.3 Minio 서버를 시스템 서비스로 등록

sudo tee /etc/systemd/system/minio.service <<EOF
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target

[Service]
User=minio-user
Group=minio-user
EnvironmentFile=-/etc/default/minio
ExecStart=/usr/local/bin/minio server /mnt/data
Restart=always
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable minio
sudo systemctl start minio

2. Minio 클라이언트(mc) 설치 및 설정

Minio 클라이언트를 설치하여 Minio 서버에 접근하고, 버킷을 관리할 수 있습니다.

2.1 Minio 클라이언트 설치

wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/

2.2 Minio 서버 설정

mc alias set myminio http://127.0.0.1:9000 minioadmin minioadmin123

3. 버킷 생성 및 파일 업로드

3.1 버킷 생성

mc mb myminio/logs-backup

3.2 파일 업로드

mc cp /path/to/your/config-or-log-file myminio/logs-backup

4. 자동 백업 스크립트 설정

백업을 자동화하기 위해 스크립트를 작성하고, 이를 cron job으로 설정할 수 있습니다.

4.1 백업 스크립트 작성

예를 들어, backup.sh 스크립트를 작성합니다.

#!/bin/bash

# 백업할 파일 경로
SOURCE_FILE="/path/to/your/config-or-log-file"
# 백업할 버킷 경로
BUCKET_PATH="myminio/logs-backup"

# Minio 클라이언트로 파일 업로드
mc cp $SOURCE_FILE $BUCKET_PATH

# 로그 기록
echo "$(date): Backup completed" >> /var/log/minio_backup.log

4.2 스크립트 실행 권한 부여

chmod +x backup.sh

4.3 크론 작업 설정

crontab -e

예를 들어, 매일 밤 2시에 백업을 실행하려면 다음과 같이 설정합니다.

0 2 * * * /path/to/backup.sh

이렇게 설정하면 Minio 버킷에 설정이나 로그 파일을 자동으로 백업할 수 있습니다. 필요에 따라 스크립트를 조정하고, 백업 주기를 설정하면 됩니다.

Python을 사용하여 설정 파일이나 로그 파일을 Minio 버킷에 자동으로 업로드하는 코드입니다.

1. 환경 설정

Python 환경에 minio 라이브러리를 설치합니다.

pip install minio

2. Python 코드 작성

Minio 클라이언트를 사용하여 파일을 업로드하는 Python 코드를 작성합니다. 이 예제에서는 주어진 파일을 Minio 버킷에 업로드하고, 성공 여부를 로그로 기록합니다.

2.1 Python 스크립트 작성

import os
from minio import Minio
from minio.error import S3Error
from datetime import datetime

# Minio 서버 정보 설정
minio_client = Minio(
    "127.0.0.1:9000",
    access_key="minioadmin",
    secret_key="minioadmin123",
    secure=False
)

# 백업할 파일 경로
SOURCE_FILE = "/path/to/your/config-or-log-file"
# 백업할 버킷 이름
BUCKET_NAME = "logs-backup"
# 업로드할 파일 이름
FILE_NAME = os.path.basename(SOURCE_FILE)

def upload_file_to_minio():
    try:
        # 버킷 존재 여부 확인 및 생성
        if not minio_client.bucket_exists(BUCKET_NAME):
            minio_client.make_bucket(BUCKET_NAME)

        # 파일 업로드
        minio_client.fput_object(
            BUCKET_NAME, FILE_NAME, SOURCE_FILE
        )
        print(f"{datetime.now()}: Backup completed successfully.")
    except S3Error as exc:
        print(f"{datetime.now()}: Error occurred - {exc}")

if __name__ == "__main__":
    upload_file_to_minio()

3. 자동화 설정

백업 작업을 자동화하기 위해 이 스크립트를 cron job에 추가할 수 있습니다.

3.1 스크립트 저장

위의 Python 코드를 backup.py 파일로 저장합니다.

3.2 크론 작업 설정

crontab -e 명령을 사용하여 crontab 편집기를 엽니다.

crontab -e

매일 밤 2시에 백업 스크립트를 실행하려면 다음 라인을 추가합니다.

0 2 * * * /usr/bin/python3 /path/to/backup.py

이렇게 하면 매일 정해진 시간에 Python 스크립트를 통해 설정 파일이나 로그 파일이 Minio 버킷에 자동으로 업로드됩니다.

추가 참고 사항

  • minio_client.fput_object 메서드는 파일을 직접 업로드할 때 사용됩니다.
  • 백업 파일이 주기적으로 많아질 경우, 파일 이름에 타임스탬프를 추가하여 백업 파일들을 구분하는 것이 좋습니다.

 

n8n을 통해 Minio 버킷에 백업 데이터를 저장하는 워크플로우를 구성할 수 있습니다. n8n은 다양한 노드를 사용하여 데이터를 처리하고 저장할 수 있는 자동화 도구입니다. HTTP Request 노드와 Function 노드를 사용하여 파일을 Minio 버킷에 업로드하는 과정을 다룹니다.

1. n8n 설정

n8n이 설치되어 있어야 합니다. Docker를 사용하여 설치할 수 있습니다.

docker run -d --name n8n -p 5678:5678 -e N8N_BASIC_AUTH_ACTIVE=true -e N8N_BASIC_AUTH_USER=<your-username> -e N8N_BASIC_AUTH_PASSWORD=<your-password> n8nio/n8n

2. n8n 워크플로우 구성

n8n UI에 접속하여 새로운 워크플로우를 구성합니다.

2.1 Start 노드 추가

  • 워크플로우의 시작점을 정의합니다.

2.2 HTTP Request 노드 추가

  • HTTP Request 노드를 추가하여 백업할 데이터를 가져옵니다.
  • 예를 들어, 설정 파일을 HTTP API에서 가져온다고 가정합니다.

설정 예시

  • Method: GET
  • URL: http://example.com/config-file
  • Response Format: File

2.3 Function 노드 추가

  • Function 노드를 추가하여 Minio에 파일을 업로드하는 스크립트를 작성합니다.
  • HTTP Request 노드와 연결합니다.

스크립트 예시

const { Minio } = require('minio');

const minioClient = new Minio.Client({
  endPoint: '127.0.0.1',
  port: 9000,
  useSSL: false,
  accessKey: 'minioadmin',
  secretKey: 'minioadmin123'
});

const bucketName = 'logs-backup';
const fileName = 'config-file-backup';
const fileContent = items[0].binary.data;

async function uploadToMinio() {
  try {
    const bucketExists = await minioClient.bucketExists(bucketName);
    if (!bucketExists) {
      await minioClient.makeBucket(bucketName);
    }

    const metaData = {
      'Content-Type': 'application/octet-stream',
    };

    await minioClient.putObject(bucketName, fileName, Buffer.from(fileContent, 'binary'), metaData);
    console.log('Backup completed successfully.');
  } catch (err) {
    console.error('Error occurred:', err);
  }
}

uploadToMinio();

return items;

2.4 워크플로우 저장 및 실행

  • 워크플로우를 저장하고, 원하는 주기에 따라 실행되도록 설정합니다.

3. 크론 설정

  • n8n의 크론 노드를 사용하여 주기적으로 워크플로우를 실행하도록 설정할 수 있습니다.
  • 크론 노드를 추가하고, Start 노드와 연결합니다.

설정 예시

  • Mode: Every Day
  • Hour: 2

 

위 단계들을 통해 n8n을 사용하여 Minio 버킷에 설정 파일이나 로그 파일을 자동으로 업로드하는 워크플로우를 구성할 수 있습니다. 필요에 따라 데이터를 가져오는 방식이나 업로드 스크립트를 조정하여 맞춤화할 수 있습니다.

 

이러한 방식을 통해 로그 파일이나 바이너리 파일과 같은 데이터를 Minio 버킷에 백업하는 것은 매우 효과적인 방법입니다. Minio는 S3와 호환되는 객체 스토리지로서 다양한 이점을 제공합니다. 여기 몇 가지 이유를 설명하겠습니다.

Minio 버킷을 사용한 백업의 장점

  1. 확장성
    • Minio는 대용량 데이터를 효율적으로 저장하고 관리할 수 있습니다. 따라서 로그 파일이나 바이너리 파일과 같은 대규모 데이터를 처리하는 데 적합합니다.
  2. 안정성
    • Minio는 데이터를 여러 노드에 분산 저장하여 데이터 손실 위험을 최소화합니다. 이는 중요한 로그 파일이나 바이너리 파일의 안전한 보관을 보장합니다.
  3. 접근성
    • Minio는 S3 API와 호환되므로 다양한 툴과 통합하여 데이터를 쉽게 접근하고 관리할 수 있습니다. 이를 통해 데이터를 쉽게 백업하고 복원할 수 있습니다.
  4. 비용 효율성
    • 오픈소스 솔루션인 Minio는 비용 효율적으로 데이터를 관리할 수 있습니다. 자체 서버에 설치하여 운영 비용을 절감할 수 있습니다.

Minio 버킷을 사용하여 로그 파일이나 바이너리 파일을 백업하는 것은 안정적이고 비용 효율적인 데이터 관리 방법입니다. n8n을 사용하여 자동화된 워크플로우를 구성하면 주기적으로 데이터를 백업할 수 있으며, 필요에 따라 워크플로우를 조정하여 다양한 데이터를 효율적으로 관리할 수 있습니다.

 

Minio 버킷에서 보관 기간을 정의하고, 해당 기간이 초과된 파일을 자동으로 삭제하는 방법입니다. 이를 위해 lifecycle 정책을 설정하여 특정 조건이 만족되면 객체를 삭제하도록 할 수 있습니다. n8n을 통해 이 작업을 자동화할 수도 있습니다.

1. Minio Lifecycle Policy 설정

Minio에서는 객체 수명 주기(Lifecycle)를 관리하는 정책을 설정할 수 있습니다. 이는 특정 기간이 지나면 객체를 자동으로 삭제하도록 할 수 있습니다.

1.1 Lifecycle Policy 파일 생성

lifecycle.json 파일을 생성합니다. 예를 들어, 30일 동안 보관된 파일을 자동으로 삭제하도록 설정할 수 있습니다.

{
  "Rules": [
    {
      "ID": "delete-old-objects",
      "Status": "Enabled",
      "Filter": {},
      "Expiration": {
        "Days": 30
      },
      "NoncurrentVersionExpiration": {
        "NoncurrentDays": 30
      }
    }
  ]
}

1.2 Minio Client를 사용하여 Lifecycle Policy 적용

mc 명령어를 사용하여 Lifecycle Policy를 Minio 버킷에 적용합니다.

mc ilm import myminio/logs-backup < lifecycle.json

2. n8n을 사용한 자동화

만약 더 세밀한 제어가 필요하거나 특정 조건에 따라 삭제 작업을 수행하고 싶다면, n8n을 사용하여 주기적으로 파일을 확인하고 삭제할 수 있습니다.

2.1 n8n 워크플로우 구성

  • Start 노드 추가
  • HTTP Request 노드 추가 (Minio 버킷의 객체 목록 가져오기)
  • Function 노드 추가 (객체 삭제)

HTTP Request 노드 설정

  • Method: GET
  • URL: http://127.0.0.1:9000/logs-backup?list-type=2&prefix=&delimiter=/
  • Authentication: Basic Auth
    • Username: minioadmin
    • Password: minioadmin123

Function 노드 설정

  • 파일 삭제를 위한 스크립트 작성
const { Client } = require('minio');

const minioClient = new Client({
  endPoint: '127.0.0.1',
  port: 9000,
  useSSL: false,
  accessKey: 'minioadmin',
  secretKey: 'minioadmin123'
});

const bucketName = 'logs-backup';
const retentionDays = 30;
const now = new Date();

async function deleteOldFiles() {
  const objectsList = await minioClient.listObjectsV2(bucketName, '', true);
  for (const obj of objectsList) {
    const lastModified = new Date(obj.lastModified);
    const ageInDays = (now - lastModified) / (1000 * 60 * 60 * 24);
    if (ageInDays > retentionDays) {
      await minioClient.removeObject(bucketName, obj.name);
      console.log(`Deleted ${obj.name}`);
    }
  }
}

deleteOldFiles();

return items;

2.2 크론 설정

  • 크론 노드를 추가하여 이 작업을 주기적으로 실행하도록 설정합니다.

설정 예시

  • Mode: Every Day
  • Hour: 2

 

Lifecycle Policy는 간편하고 기본적인 자동 삭제 기능을 제공하며, n8n을 사용하면 더 세밀하고 복잡한 조건을 설정할 수 있습니다. 두 방법 중 하나를 선택하여 환경에 맞게 적용하면 됩니다. Minio에서 버킷을 생성할 때 Lifecycle Policy를 설정할 수 있는 직접적인 방법은 없습니다. 버킷을 생성한 후에 별도로 Lifecycle Policy를 설정해줘야 합니다. Minio의 mc 클라이언트를 사용하여 이 작업을 수행할 수 있습니다.

Minio에서 버킷 생성 후 Lifecycle Policy 설정 방법

1. Minio 버킷 생성

Minio 버킷을 생성합니다.

mc mb myminio/logs-backup

2. Lifecycle Policy 파일 생성

lifecycle.json 파일을 생성합니다. 이 예제에서는 30일 동안 보관된 파일을 자동으로 삭제하는 정책을 정의합니다.

{
  "Rules": [
    {
      "ID": "delete-old-objects",
      "Status": "Enabled",
      "Filter": {},
      "Expiration": {
        "Days": 30
      },
      "NoncurrentVersionExpiration": {
        "NoncurrentDays": 30
      }
    }
  ]
}

3. Lifecycle Policy 적용

Minio 클라이언트(mc)를 사용하여 Lifecycle Policy를 버킷에 적용합니다.

mc ilm import myminio/logs-backup < lifecycle.json

Python 스크립트를 사용한 자동화 예제

버킷을 생성하고 Lifecycle Policy를 설정하는 전체 과정을 Python 스크립트로 자동화할 수 있습니다.

import json
from minio import Minio
from minio.lifecycleconfig import LifecycleConfig, Expiration, Rule

# Minio 서버 설정
minio_client = Minio(
    "127.0.0.1:9000",
    access_key="minioadmin",
    secret_key="minioadmin123",
    secure=False
)

# 버킷 이름
bucket_name = "logs-backup"

# 버킷 생성
if not minio_client.bucket_exists(bucket_name):
    minio_client.make_bucket(bucket_name)

# Lifecycle Policy 설정
expiration_rule = Expiration(days=30)
rule = Rule(
    id="delete-old-objects",
    status="Enabled",
    expiration=expiration_rule,
)

lifecycle_config = LifecycleConfig(rule)

# Lifecycle Policy 적용
minio_client.set_bucket_lifecycle(bucket_name, lifecycle_config)

print(f"Lifecycle Policy applied to bucket '{bucket_name}'.")

n8n을 사용한 자동화 워크플로우

n8n에서 HTTP Request 노드와 Function 노드를 사용하여 Minio 버킷을 생성하고 Lifecycle Policy를 설정하는 작업을 자동화할 수 있습니다.

1. HTTP Request 노드 추가

  • Method: PUT
  • URL: http://127.0.0.1:9000/logs-backup
  • Headers: Content-Type: application/xml
  • Authentication: Basic Auth
    • Username: minioadmin
    • Password: minioadmin123

2. Function 노드 추가

  • Lifecycle Policy를 설정하는 스크립트 작성
const { Client } = require('minio');

const minioClient = new Client({
  endPoint: '127.0.0.1',
  port: 9000,
  useSSL: false,
  accessKey: 'minioadmin',
  secretKey: 'minioadmin123'
});

const bucketName = 'logs-backup';

const lifecycleConfig = {
  Rules: [
    {
      ID: "delete-old-objects",
      Status: "Enabled",
      Filter: {},
      Expiration: {
        Days: 30
      }
    }
  ]
};

async function setLifecyclePolicy() {
  await minioClient.setBucketLifecycle(bucketName, lifecycleConfig);
  console.log('Lifecycle Policy applied successfully.');
}

setLifecyclePolicy();

return items;

이 두 노드를 연결하여 워크플로우를 설정하면, 버킷 생성 후 Lifecycle Policy를 자동으로 설정할 수 있습니다.

  1. Minio 버킷을 생성한 후에 Lifecycle Policy를 별도로 설정해야 합니다.
  2. mc 클라이언트를 사용하여 버킷 생성 후 Lifecycle Policy를 적용할 수 있습니다.
  3. Python 스크립트나 n8n을 사용하여 이 과정을 자동화할 수 있습니다.

Minio에서는 버킷 단위로 Lifecycle Policy를 설정할 수 있습니다. Lifecycle Policy는 버킷 내의 모든 객체에 적용되지만, 객체의 경로나 태그에 따라 다르게 적용할 수 있는 방법도 있습니다. 이를 통해 파일별로 다른 정책을 적용할 수 있습니다.

1. 버킷 단위로 Lifecycle Policy 설정

버킷 단위로 설정하는 Lifecycle Policy는 기본적으로 해당 버킷 내의 모든 객체에 동일하게 적용됩니다. 예를 들어, 30일 후에 모든 객체를 삭제하는 정책을 설정할 수 있습니다.

{
  "Rules": [
    {
      "ID": "delete-old-objects",
      "Status": "Enabled",
      "Filter": {},
      "Expiration": {
        "Days": 30
      }
    }
  ]
}

2. 경로나 태그에 따른 Lifecycle Policy 설정

객체의 경로나 태그를 사용하여 파일별로 다른 정책을 적용할 수 있습니다. 다음은 객체 경로와 태그를 사용하여 다르게 설정하는 예시입니다.

2.1 경로 기반 정책 설정

예를 들어, /logs/ 경로에 있는 파일은 30일 후에 삭제하고, /backup/ 경로에 있는 파일은 60일 후에 삭제하는 정책을 설정할 수 있습니다.

{
  "Rules": [
    {
      "ID": "logs-delete-old-objects",
      "Status": "Enabled",
      "Filter": {
        "Prefix": "logs/"
      },
      "Expiration": {
        "Days": 30
      }
    },
    {
      "ID": "backup-delete-old-objects",
      "Status": "Enabled",
      "Filter": {
        "Prefix": "backup/"
      },
      "Expiration": {
        "Days": 60
      }
    }
  ]
}

2.2 태그 기반 정책 설정

객체에 태그를 부여하고, 태그에 따라 정책을 다르게 적용할 수 있습니다. 예를 들어, log 태그를 가진 파일은 30일 후에 삭제하고, archive 태그를 가진 파일은 90일 후에 삭제하는 정책을 설정할 수 있습니다.

{
  "Rules": [
    {
      "ID": "logs-delete-old-objects",
      "Status": "Enabled",
      "Filter": {
        "Tag": {
          "key": "type",
          "value": "log"
        }
      },
      "Expiration": {
        "Days": 30
      }
    },
    {
      "ID": "archive-delete-old-objects",
      "Status": "Enabled",
      "Filter": {
        "Tag": {
          "key": "type",
          "value": "archive"
        }
      },
      "Expiration": {
        "Days": 90
      }
    }
  ]
}

3. 정책 설정 적용 방법

Minio의 mc 클라이언트를 사용하여 이러한 정책을 설정할 수 있습니다.

3.1 정책 파일 생성

위의 정책을 파일로 저장합니다. 예를 들어, lifecycle.json 파일을 생성합니다.

nano lifecycle.json

3.2 정책 파일 적용

mc 명령어를 사용하여 정책 파일을 적용합니다.

mc ilm import myminio/logs-backup < lifecycle.json

4. Python을 사용한 정책 설정

Python을 사용하여 Minio 버킷에 Lifecycle Policy를 적용하는 방법도 가능합니다.

import json
from minio import Minio
from minio.lifecycleconfig import LifecycleConfig, Expiration, Rule, Filter, AndOperator, Tag

# Minio 서버 설정
minio_client = Minio(
    "127.0.0.1:9000",
    access_key="minioadmin",
    secret_key="minioadmin123",
    secure=False
)

# 버킷 이름
bucket_name = "logs-backup"

# 버킷 생성
if not minio_client.bucket_exists(bucket_name):
    minio_client.make_bucket(bucket_name)

# Lifecycle Policy 설정
log_expiration_rule = Rule(
    id="logs-delete-old-objects",
    status="Enabled",
    filter=Filter(prefix="logs/"),
    expiration=Expiration(days=30)
)

backup_expiration_rule = Rule(
    id="backup-delete-old-objects",
    status="Enabled",
    filter=Filter(prefix="backup/"),
    expiration=Expiration(days=60)
)

lifecycle_config = LifecycleConfig(log_expiration_rule, backup_expiration_rule)

# Lifecycle Policy 적용
minio_client.set_bucket_lifecycle(bucket_name, lifecycle_config)

print(f"Lifecycle Policy applied to bucket '{bucket_name}'.")
  • Minio 버킷에 설정된 Lifecycle Policy는 기본적으로 모든 객체에 동일하게 적용됩니다.
  • 객체 경로나 태그를 기반으로 파일별로 다른 정책을 적용할 수 있습니다.
  • mc 클라이언트나 Python 스크립트를 사용하여 이러한 정책을 설정하고 적용할 수 있습니다.
728x90

댓글