อัปเดตล่าสุด: กุมภาพันธ์ 2026

RustFS

Object Storage สุดประสิทธิภาพ

เขียนด้วย Rust • เร็วกว่า MinIO 2.3x • Apache 2.0 License • S3 Compatible

High Performance Memory Safe Apache 2.0 S3 Compatible

RustFS คืออะไร?

RustFS เป็นระบบจัดเก็บข้อมูลแบบ Object Storage ที่กระจายตัว (Distributed) สร้างด้วยภาษา Rust หนึ่งในภาษาโปรแกรมที่ได้รับความนิยมสูงสุดในโลก โดย RustFS ผสานความเรียบง่ายของ MinIO เข้ากับความปลอดภัยด้านหน่วยความจำและประสิทธิภาพของ Rust

จุดเด่นสำคัญคือ RustFS ใช้ใบอนุญาต Apache 2.0 ซึ่งเป็นใบอนุญาตแบบเสรีที่ไม่มีข้อจำกัดเหมือน AGPL ทำให้สามารถนำไปใช้ในเชิงพาณิชย์ได้อย่างอิสระ

2.3x
เร็วกว่า MinIO
11K+
GitHub Stars
100%
S3 Compatible

ทำไมต้องเลือก RustFS?

  • ประสิทธิภาพสูง

    เร็วกว่า MinIO 2.3x สำหรับไฟล์ขนาดเล็ก (4KB)

  • Memory Safety

    ปลอดจาก Buffer Overflow, Use-after-free และ Data Race

  • Apache 2.0 License

    ใช้ในเชิงพาณิชย์ได้ ไม่ต้องเปิดเผย Source Code

  • S3 Compatible

    ใช้งานกับ AWS SDK, MinIO Client ได้ทันที

  • Distributed Architecture

    ไม่มี Metadata Server ไม่มี Single Point of Failure

สถาปัตยกรรมของ RustFS

RustFS ใช้สถาปัตยกรรมแบบ Metadata-free คือไม่มีเซิร์ฟเวอร์กลางสำหรับเก็บ Metadata ทุกโหนด (Node) เป็น Peer ที่เท่าเทียมกัน ข้อมูลและ Metadata กระจายไปทั่วทุกโหนด ทำให้ไม่มี Single Point of Failure

RustFS Distributed Architecture S3 Client AWS SDK / mc / curl Load Balancer Node 1 Drive 1, Drive 2 Data + Metadata Node 2 Drive 3, Drive 4 Data + Metadata Node 3 Drive 5, Drive 6 Data + Metadata Node 4 Drive 7, Drive 8 Data + Metadata Erasure Coded Set (RS 4+2) - สามารถเสียได้ 2 Drives

Nodes

เซิร์ฟเวอร์แต่ละเครื่องที่รัน RustFS process แต่ละ Node สามารถมี Drive ได้หลายตัว ทำหน้าที่เก็บทั้ง Data และ Metadata

Drives

อุปกรณ์จัดเก็บข้อมูล (XFS หรือ ext4) แต่ละ Node สามารถมีได้หลาย Drives ข้อมูลถูกกระจายไปทั่ว Drives

Sets (Stripes)

กลุ่มของ Drives ที่กระจายข้ามหลาย Nodes หนึ่ง Object จะถูกเก็บในหนึ่ง Set โดยใช้ Erasure Coding

Erasure Coding: ปกป้องข้อมูลอย่างมีประสิทธิภาพ

RustFS ใช้ Erasure Coding แทน Replication แบบดั้งเดิม โดยแบ่งข้อมูลออกเป็น Data Shards และ Parity Shards หาก Shard บางส่วนสูญหาย ระบบสามารถกู้คืนข้อมูลได้จาก Shards ที่เหลืออยู่

Original Object (1 ไฟล์) Data Shard 1 Data Shard 2 Data Shard 3 Data Shard 4 Parity Shard 1 Parity Shard 2 RS(4,2) = 4 Data + 2 Parity = 6 Shards ทั้งหมด สามารถเสียได้สูงสุด 2 Shards และยังกู้คืนข้อมูลได้ กระจายไปยัง 6 Drives Drive 1-4: Data Shards Drive 5-6: Parity Shards ข้ามหลาย Nodes
รูปแบบการป้องกัน Storage Overhead Fault Tolerance
Triple Replication 200% เสียได้ 2 สำเนา
RS(4, 2) - RustFS 50% เสียได้ 2 Shards
RS(10, 4) 40% เสียได้ 4 Shards

การติดตั้ง RustFS

สิ่งที่ต้องเตรียม

CPU: 2+ Cores (สำหรับ Testing)
RAM: 4GB+ (ขึ้นกับ Workload)
Storage: XFS หรือ ext4
Network: Ports 9000, 9001

ทางเลือก: เลือกวิธีใดวิธีหนึ่งที่เหมาะกับคุณ ไม่จำเป็นต้องทำทุกวิธี

เลือกวิธีไหนดี?

  • ทางเลือกที่ 1 (One-click): สำหรับทดสอบเร็วๆ บนเครื่องเดียว
  • ทางเลือกที่ 2 (Docker): สำหรับ Development และ Testing
  • ทางเลือกที่ 3 (Docker Compose): สำหรับ Testing พร้อม Monitoring
  • ทางเลือกที่ 4 (Podman): สำหรับ Rootless Container
  • ทางเลือกที่ 5 (Distributed): สำหรับ Production ขนาดใหญ่พร้อม Load Balancer (ด้านล่าง)

ทางเลือกที่ 1 One-click Installation (แนะนำสำหรับทดสอบ)

วิธีที่ง่ายที่สุด รันคำสั่งเดียวแล้วรอ ไม่ต้องตั้งค่าอะไรเพิ่ม

bash
# ดาวน์โหลดและติดตั้ง RustFS อัตโนมัติ
curl -O https://rustfs.com/install_rustfs.sh && bash install_rustfs.sh

ทางเลือกที่ 2 Docker Deployment (สำหรับ Development)

เหมาะสำหรับ Development และ Testing บนเครื่องเดียว

bash - Docker
# สร้างไดเรกทอรีสำหรับ Data และ Logs
mkdir -p data logs

# เปลี่ยน owner เป็น UID ของ RustFS (10001)
chown -R 10001:10001 data logs

# รัน RustFS Container
docker run -d \
  --name rustfs \
  -p 9000:9000 \
  -p 9001:9001 \
  -v $(pwd)/data:/data \
  -v $(pwd)/logs:/logs \
  rustfs/rustfs:latest

# หรือใช้เวอร์ชันเฉพาะ
docker run -d \
  --name rustfs \
  -p 9000:9000 \
  -p 9001:9001 \
  -v $(pwd)/data:/data \
  -v $(pwd)/logs:/logs \
  rustfs/rustfs:1.0.0-alpha.76

สำคัญ: RustFS Container รันด้วย non-root user (UID 10001) หากใช้ -v mount host directory ต้องเปลี่ยน owner เป็น 10001 มิฉะนั้นจะเกิด Permission Denied

ทางเลือกที่ 3 Docker Compose (พร้อม Observability)

ใช้ Docker Compose พร้อม Grafana, Prometheus, Jaeger สำหรับ Monitoring

bash
# ใช้ Docker Compose พร้อม Grafana, Prometheus, Jaeger
docker compose --profile observability up -d

# หรือใช้ Podman
podman compose --profile observability up -d

ทางเลือกที่ 4 Podman (Rootless Container)

ใช้ Podman รัน RustFS โดยไม่ต้องใช้ root ปลอดภัยกว่า Docker สำหรับบางสถานการณ์

bash - Podman
# รัน RustFS ด้วย Podman (Rootless)
podman run -d \
  -p 9000:9000 \
  -p 9001:9001 \
  -v $(pwd)/data:/data \
  -v $(pwd)/logs:/logs \
  rustfs/rustfs:latest

ทางเลือกที่ 5: การติดตั้งแบบ Distributed (Production)

แนะนำสำหรับ Production: การติดตั้งแบบ Distributed พร้อม Load Balancer ช่วยให้ระบบมี High Availability และ Scalability สูง

ภาพรวมระบบ

การติดตั้งแบบ Distributed ประกอบด้วย Load Balancer (Nginx) 1 ตัว และ RustFS Nodes 4 ตัว โดย Load Balancer จะกระจาย Traffic ไปยัง RustFS Nodes ทั้ง 4 ตัว ทำให้ระบบสามารถรองรับผู้ใช้ได้มากขึ้นและมีความพร้อมใช้งานสูง (High Availability)

RustFS Distributed Architecture with Load Balancer S3 Clients AWS SDK / mc / curl Nginx Load Balancer Port 9000 (S3) / 9001 (Console) RustFS Node 1 192.168.1.11 Port: 9000, 9001 Drive 1 Drive 2 RustFS Node 2 192.168.1.12 Port: 9000, 9001 Drive 3 Drive 4 RustFS Node 3 192.168.1.13 Port: 9000, 9001 Drive 5 Drive 6 RustFS Node 4 192.168.1.14 Port: 9000, 9001 Drive 7 Drive 8 RustFS Distributed Cluster (4 Nodes, 8 Drives) Erasure Coding RS(4,2) - สามารถเสียได้ 2 Drives และยังกู้คืนข้อมูลได้

สิ่งที่ต้องเตรียมสำหรับ Distributed Setup

Hardware (5 เครื่อง)

  • Load Balancer: 1 เครื่อง, 2 CPU, 4GB RAM
  • Node 1-4: 4 เครื่อง, 4 CPU, 8GB RAM เครื่องละ
  • Storage: 2 Drives/Node (XFS หรือ ext4)
  • Network: LAN 1Gbps+ ทุกเครื่อง

Software

  • Ubuntu 22.04/24.04 LTS ทุกเครื่อง
  • Docker หรือ Podman ทุกเครื่อง
  • NTP Synchronized (สำคัญ!)
  • Firewall ให้ Ports 9000, 9001

1 ขั้นตอนที่ 1: เตรียมเครื่อง Load Balancer

ตั้งค่า IP Address และติดตั้ง Nginx บนเครื่อง Load Balancer (192.168.1.10)

bash - Load Balancer (192.168.1.10)
# ติดตั้ง Nginx
sudo apt update
sudo apt install -y nginx

# สร้างไฟล์ configuration สำหรับ RustFS Load Balancer
sudo tee /etc/nginx/conf.d/rustfs-lb.conf << 'EOF'
# Upstream สำหรับ S3 API (Port 9000)
upstream rustfs_s3 {
    least_conn;
    server 192.168.1.11:9000 weight=1 max_fails=3 fail_timeout=30s;
    server 192.168.1.12:9000 weight=1 max_fails=3 fail_timeout=30s;
    server 192.168.1.13:9000 weight=1 max_fails=3 fail_timeout=30s;
    server 192.168.1.14:9000 weight=1 max_fails=3 fail_timeout=30s;
}

# Upstream สำหรับ Web Console (Port 9001)
upstream rustfs_console {
    least_conn;
    server 192.168.1.11:9001 weight=1 max_fails=3 fail_timeout=30s;
    server 192.168.1.12:9001 weight=1 max_fails=3 fail_timeout=30s;
    server 192.168.1.13:9001 weight=1 max_fails=3 fail_timeout=30s;
    server 192.168.1.14:9001 weight=1 max_fails=3 fail_timeout=30s;
}

# S3 API Server
server {
    listen 9000;
    server_name _;

    client_max_body_size 1000m;
    proxy_buffering off;

    location / {
        proxy_pass http://rustfs_s3;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_connect_timeout 300;
        proxy_send_timeout 300;
        proxy_read_timeout 300;
    }
}

# Web Console Server
server {
    listen 9001;
    server_name _;

    client_max_body_size 100m;

    location / {
        proxy_pass http://rustfs_console;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
EOF

# ทดสอบ configuration
sudo nginx -t

# รีสตาร์ท Nginx
sudo systemctl restart nginx
sudo systemctl enable nginx

# ตรวจสอบสถานะ
sudo systemctl status nginx

คำอธิบาย: Nginx จะทำหน้าที่กระจาย Traffic ไปยัง RustFS Nodes ทั้ง 4 ตัว โดยใช้ least_conn algorithm ที่จะส่ง request ไปยัง node ที่มีการเชื่อมต่อน้อยที่สุด

2 ขั้นตอนที่ 2: เตรียม RustFS Node 1-4

ตั้งค่า IP Address และเตรียม Storage สำหรับทุก Node

รายการ IP Address:

  • Node 1: 192.168.1.11
  • Node 2: 192.168.1.12
  • Node 3: 192.168.1.13
  • Node 4: 192.168.1.14
bash - รันบนทุก Node (Node 1-4)
# ขั้นตอนที่ 2.1: ตั้งค่า Hostname (รันที่ละ Node)
# บน Node 1
sudo hostnamectl set-hostname rustfs-node1

# บน Node 2
sudo hostnamectl set-hostname rustfs-node2

# บน Node 3
sudo hostnamectl set-hostname rustfs-node3

# บน Node 4
sudo hostnamectl set-hostname rustfs-node4

# ขั้นตอนที่ 2.2: เพิ่ม hosts entries ทุกเครื่อง
sudo tee -a /etc/hosts << 'EOF'
192.168.1.10 rustfs-lb
192.168.1.11 rustfs-node1
192.168.1.12 rustfs-node2
192.168.1.13 rustfs-node3
192.168.1.14 rustfs-node4
EOF

# ขั้นตอนที่ 2.3: ฟอร์แมต Disk (สมมติใช้ /dev/sdb และ /dev/sdc)
sudo mkfs.xfs /dev/sdb
sudo mkfs.xfs /dev/sdc

# ขั้นตอนที่ 2.4: สร้าง mount points
sudo mkdir -p /data/disk1 /data/disk2

# ขั้นตอนที่ 2.5: Mount disks
sudo mount /dev/sdb /data/disk1
sudo mount /dev/sdc /data/disk2

# ขั้นตอนที่ 2.6: เพิ่มใน fstab (เพื่อ mount อัตโนมัติตอน boot)
echo '/dev/sdb /data/disk1 xfs defaults 0 0' | sudo tee -a /etc/fstab
echo '/dev/sdc /data/disk2 xfs defaults 0 0' | sudo tee -a /etc/fstab

# ขั้นตอนที่ 2.7: ติดตั้ง Docker
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER

# ขั้นตอนที่ 2.8: Sync เวลา (สำคัญมากสำหรับ Distributed System)
sudo apt install -y chrony
sudo systemctl enable chrony
sudo systemctl start chrony

3 ขั้นตอนที่ 3: รัน RustFS บนทุก Node

รัน RustFS Container บนทุก Node โดยใช้ Distributed Mode

bash - รันบนทุก Node (RUSTFS_SERVER เหมือนกันทุก Node)
# สร้างไดเรกทอรีสำหรับ RustFS
sudo mkdir -p /data/rustfs/data /data/rustfs/logs
sudo chown -R 10001:10001 /data/rustfs

# รัน RustFS บนทุก Node (ใช้คำสั่งเดียวกันทุก Node)
docker run -d \
  --name rustfs \
  --network host \
  -e RUSTFS_MODE=erasure \
  -e RUSTFS_SERVER="http://192.168.1.11:9000/data/disk1,http://192.168.1.11:9000/data/disk2,http://192.168.1.12:9000/data/disk1,http://192.168.1.12:9000/data/disk2,http://192.168.1.13:9000/data/disk1,http://192.168.1.13:9000/data/disk2,http://192.168.1.14:9000/data/disk1,http://192.168.1.14:9000/data/disk2" \
  -e RUSTFS_ACCESS_KEY=rustfsadmin \
  -e RUSTFS_SECRET_KEY=rustfsadmin \
  -e RUSTFS_ERASURE_SET_DRIVE_COUNT=8 \
  -e RUSTFS_ERASURE_SET_DATA_COUNT=4 \
  -e RUSTFS_ERASURE_SET_PARITY_COUNT=2 \
  -v /data/disk1:/data/disk1 \
  -v /data/disk2:/data/disk2 \
  -v /data/rustfs/logs:/logs \
  --restart unless-stopped \
  rustfs/rustfs:latest

# ตรวจสอบ logs
docker logs -f rustfs

สำคัญ: ทุก Node ต้องใช้ RUSTFS_SERVER เหมือนกันทุกตัว! นี่คือรายการ Drives ทั้งหมดใน Cluster ที่ RustFS จะใช้สร้าง Erasure Sets

คำอธิบาย Environment Variables:

  • RUSTFS_MODE=erasure - เปิดใช้ Erasure Coding
  • RUSTFS_ERASURE_SET_DRIVE_COUNT=8 - จำนวน Drives ทั้งหมดใน Set
  • RUSTFS_ERASURE_SET_DATA_COUNT=4 - Data Shards (4 ส่วน)
  • RUSTFS_ERASURE_SET_PARITY_COUNT=2 - Parity Shards (2 ส่วน) สามารถเสียได้ 2 Drives

4 ขั้นตอนที่ 4: ทดสอบการเชื่อมต่อ

ทดสอบเชื่อมต่อผ่าน Load Balancer

bash - ทดสอบจากเครื่อง Client
# ทดสอบเชื่อมต่อ Load Balancer
curl http://192.168.1.10:9000

# ใช้ MinIO Client (mc)
mc alias set myrustfs http://192.168.1.10:9000 rustfsadmin rustfsadmin

# สร้าง Bucket
mc mb myrustfs/test-bucket

# อัปโหลดไฟล์ทดสอบ
echo "Hello RustFS Distributed!" > test.txt
mc cp test.txt myrustfs/test-bucket/

# ดูรายการไฟล์
mc ls myrustfs/test-bucket/

# ดูข้อมูล Cluster
mc admin info myrustfs

5 ทางเลือก: ใช้ Docker Compose (ทดสอบบนเครื่องเดียว)

หากต้องการทดสอบบนเครื่องเดียวก่อน สามารถใช้ Docker Compose ได้

docker-compose.yml
# สร้างไฟล์ docker-compose.yml
version: '3.8'

services:
  # Nginx Load Balancer
  nginx-lb:
    image: nginx:alpine
    container_name: rustfs-lb
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - rustfs1
      - rustfs2
      - rustfs3
      - rustfs4
    networks:
      - rustfs-net

  # RustFS Node 1
  rustfs1:
    image: rustfs/rustfs:latest
    container_name: rustfs-node1
    environment:
      - RUSTFS_MODE=erasure
      - RUSTFS_ACCESS_KEY=rustfsadmin
      - RUSTFS_SECRET_KEY=rustfsadmin
    volumes:
      - ./data/node1/disk1:/data/disk1
      - ./data/node1/disk2:/data/disk2
    networks:
      - rustfs-net

  # RustFS Node 2
  rustfs2:
    image: rustfs/rustfs:latest
    container_name: rustfs-node2
    environment:
      - RUSTFS_MODE=erasure
      - RUSTFS_ACCESS_KEY=rustfsadmin
      - RUSTFS_SECRET_KEY=rustfsadmin
    volumes:
      - ./data/node2/disk1:/data/disk1
      - ./data/node2/disk2:/data/disk2
    networks:
      - rustfs-net

  # RustFS Node 3
  rustfs3:
    image: rustfs/rustfs:latest
    container_name: rustfs-node3
    environment:
      - RUSTFS_MODE=erasure
      - RUSTFS_ACCESS_KEY=rustfsadmin
      - RUSTFS_SECRET_KEY=rustfsadmin
    volumes:
      - ./data/node3/disk1:/data/disk1
      - ./data/node3/disk2:/data/disk2
    networks:
      - rustfs-net

  # RustFS Node 4
  rustfs4:
    image: rustfs/rustfs:latest
    container_name: rustfs-node4
    environment:
      - RUSTFS_MODE=erasure
      - RUSTFS_ACCESS_KEY=rustfsadmin
      - RUSTFS_SECRET_KEY=rustfsadmin
    volumes:
      - ./data/node4/disk1:/data/disk1
      - ./data/node4/disk2:/data/disk2
    networks:
      - rustfs-net

networks:
  rustfs-net:
    driver: bridge
nginx.conf (สำหรับ Docker Compose)
# สร้างไฟล์ nginx.conf
upstream rustfs_s3 {
    least_conn;
    server rustfs1:9000;
    server rustfs2:9000;
    server rustfs3:9000;
    server rustfs4:9000;
}

upstream rustfs_console {
    least_conn;
    server rustfs1:9001;
    server rustfs2:9001;
    server rustfs3:9001;
    server rustfs4:9001;
}

server {
    listen 9000;
    location / {
        proxy_pass http://rustfs_s3;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

server {
    listen 9001;
    location / {
        proxy_pass http://rustfs_console;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
bash - รัน Docker Compose
# เตรียม directories
mkdir -p data/node{1,2,3,4}/disk{1,2}

# เปลี่ยน owner
sudo chown -R 10001:10001 data

# รัน
docker compose up -d

# ดู logs
docker compose logs -f

# ทดสอบ
mc alias set local http://localhost:9000 rustfsadmin rustfsadmin
mc admin info local

การเข้าถึง RustFS

Web Console

เปิดเบราว์เซอร์ไปที่ http://localhost:9001

Default Credentials:

Username: rustfsadmin
Password: rustfsadmin

ใช้งานผ่าน MinIO Client (mc)

bash
# ตั้งค่า Alias สำหรับ RustFS
mc alias set myrustfs http://localhost:9000 rustfsadmin rustfsadmin

# สร้าง Bucket
mc mb myrustfs/mybucket

# อัปโหลดไฟล์
mc cp myfile.txt myrustfs/mybucket/

# ดูรายการไฟล์
mc ls myrustfs/mybucket/

# ดาวน์โหลดไฟล์
mc cp myrustfs/mybucket/myfile.txt ./downloaded.txt

ใช้งานผ่าน AWS CLI

bash
# ตั้งค่า AWS CLI สำหรับ RustFS
aws configure set aws_access_key_id rustfsadmin
aws configure set aws_secret_access_key rustfsadmin
aws configure set default.region us-east-1

# สร้าง Bucket
aws s3 mb s3://mybucket --endpoint-url http://localhost:9000

# อัปโหลดไฟล์
aws s3 cp myfile.txt s3://mybucket/ --endpoint-url http://localhost:9000

# ดูรายการ
aws s3 ls s3://mybucket/ --endpoint-url http://localhost:9000

# ซิงค์โฟลเดอร์
aws s3 sync ./local-folder s3://mybucket/ --endpoint-url http://localhost:9000

ใช้งานผ่าน Python (boto3)

python
import boto3

# สร้าง S3 Client สำหรับ RustFS
s3 = boto3.client(
    's3',
    endpoint_url='http://localhost:9000',
    aws_access_key_id='rustfsadmin',
    aws_secret_access_key='rustfsadmin',
    region_name='us-east-1'
)

# สร้าง Bucket
s3.create_bucket(Bucket='mybucket')

# อัปโหลดไฟล์
s3.upload_file('myfile.txt', 'mybucket', 'myfile.txt')

# ดาวน์โหลดไฟล์
s3.download_file('mybucket', 'myfile.txt', 'downloaded.txt')

# ดูรายการ Objects
response = s3.list_objects_v2(Bucket='mybucket')
for obj in response.get('Contents', []):
    print(obj['Key'])

RustFS vs MinIO: เปรียบเทียบแบบเจาะลึก

ใบอนุญาต (Licensing)

RustFS - Apache 2.0

  • ฝังในผลิตภัณฑ์ Proprietary ได้
  • ให้บริการเป็น Hosted Service ได้
  • เก็บ Source Code ที่แก้ไขเป็นความลับได้
  • Legal Review ง่ายและรวดเร็ว

MinIO - AGPLv3

  • ต้องเปิดเผย Source Code หากดัดแปลง
  • Network Use ต้องเปิดเผย Code
  • การแก้ไขต้องใช้ License เดิม
  • ต้องซื้อ Commercial License สำหรับบาง Use Case

ประสิทธิภาพ (Performance)

Metric RustFS MinIO หมายเหตุ
4KB Objects 2.3x เร็วกว่า Baseline ไฟล์เล็ก, IoT, Logs
20MB Objects ~23 Gbps ~53 Gbps ไฟล์ใหญ่, Video
Time to First Byte ~260 ms ~24 ms กำลังปรับปรุง
Memory Usage Stable (No GC) GC Pauses Load สูง
Weak Hardware ชนะชัดเจน ใกล้เคียง Edge, ARM

เปรียบเทียบ Features

Feature RustFS MinIO
S3 API Compatibility
Object Versioning
WORM / Object Lock
Server-Side Encryption
Bucket Replication
Web Console (Full) Limited
No Telemetry
Production Ready Beta

Use Cases: ใช้ RustFS ทำอะไรได้บ้าง?

Data Lakes & Analytics

สำหรับ Spark, Trino, Presto อ่านเขียน Parquet files ได้รวดเร็ว รองรับ throughput กว่า 300 GB/s

Spark Trino Parquet

AI/ML Pipelines

เก็บ Training Datasets, Model Checkpoints, รองรับ GPU Direct Storage (Roadmap) สำหรับ ML Workloads

PyTorch TensorFlow GDS

Backup & Compliance

WORM Compliance สำหรับ SEC 17a-4, FINRA 4511, HIPAA เก็บข้อมูล Immutable ได้ตามกฎหมาย

WORM Legal Hold Veeam

Edge & IoT

Binary ขนาดเล็ก (<100MB) รันบน ARM, Raspberry Pi เหมาะสำหรับ Edge Computing และ Factory

ARM IoT Edge

Self-Hosted S3

ทดแทน AWS S3 เพื่อลดค่า Egress Fees ควบคุม Data Sovereignty ตาม GDPR

GDPR Cost Savings Self-Hosted

Homelab & Self-Hosting

ใช้กับ Nextcloud, Immich, restic backup สร้าง Distributed Storage ที่บ้าน

Nextcloud Immich restic

ปัญหาที่พบบ่อยและการแก้ไข

Permission Denied เมื่อใช้ Docker Volume

อาการ:

Error: permission denied when accessing /data

แก้ไข:

# เปลี่ยน owner ของ directory เป็น UID 10001
chown -R 10001:10001 data logs

# หรือใช้ Docker named volumes แทน host paths
docker volume create rustfs-data
docker run -v rustfs-data:/data rustfs/rustfs:latest

Connection Refused บน Port 9000/9001

อาการ:

curl: (7) Failed to connect to localhost port 9000

แก้ไข:

# ตรวจสอบว่า Container รันอยู่
docker ps | grep rustfs

# ตรวจสอบ logs
docker logs rustfs

# ตรวจสอบ port binding
docker port rustfs

# รันใหม่พร้อม publish ports
docker run -p 9000:9000 -p 9001:9001 rustfs/rustfs:latest

SignatureDoesNotMatch Error

อาการ:

SignatureDoesNotMatch: The request signature we calculated does not match

แก้ไข:

# ตรวจสอบ credentials ให้ถูกต้อง
mc alias set myrustfs http://localhost:9000 rustfsadmin rustfsadmin

# สำหรับ AWS CLI ให้ระบุ signature version
aws s3 ls --endpoint-url http://localhost:9000 \
  --no-sign-request  # สำหรับ public bucket

# หรือตั้งค่า AWS config
aws configure set s3.signature_version s3v4

Slow Performance สำหรับ Large Files

อาการ:

อัปโหลด/ดาวน์โหลดไฟล์ขนาดใหญ่ช้ากว่า MinIO

แก้ไข / ข้อแนะนำ:

# RustFS ยังอยู่ใน Beta และกำลังปรับปรุง Big File Performance
# ข้อแนะนำ:
# 1. ใช้ RustFS สำหรับ Small Objects (< 1MB)
# 2. รอ Big File Optimization ในเวอร์ชันถัดไป
# 3. ทดสอบ Performance กับ Workload จริงก่อนใช้ Production

# ตรวจสอบเวอร์ชันล่าสุด
curl -s https://api.github.com/repos/rustfs/rustfs/releases/latest | grep tag_name

Node Failure และ Data Recovery

อาการ:

Node ใน Cluster ล่ม ต้องการกู้คืนข้อมูล

แก้ไข:

# RustFS มี Self-Healing อัตโนมัติ
# หาก Node ล่มไม่เกินจำนวน Parity Shards ข้อมูลจะยังปลอดภัย

# ตรวจสอบ Cluster Health
mc admin info myrustfs

# ดู Status ของ Drives
mc admin heal myrustfs

# กู้คืนข้อมูลที่เสียหาย (Auto-healing)
mc admin heal --deep myrustfs

Best Practices

ควรทำ (Do)

  • ใช้ XFS หรือ ext4 สำหรับ Storage Backend
  • วางแผน Node เป็น Pool ของ 4-8 Nodes
  • ใช้ Erasure Coding RS(4,2) สำหรับ Production
  • เปิด Monitoring ด้วย Prometheus
  • ทดสอบ Performance กับ Workload จริง
  • ใช้ HTTPS สำหรับ Production

ไม่ควรทำ (Don't)

  • อย่าใช้ใน Production ขณะนี้ (ยัง Beta)
  • อย่าใช้ NFS สำหรับ Storage Backend
  • อย่าลืมเปลี่ยน Default Credentials
  • อย่าข้ามการ Backup ข้อมูลสำคัญ
  • อย่า Scale เกิน 100 Nodes ใน Cluster เดียว
  • อย่าใช้ root user รัน RustFS

สรุป: ควรใช้ RustFS หรือไม่?

ใช้ RustFS เมื่อ...

  • ต้องการ Apache 2.0 License
  • Workload เป็น Small Objects
  • Hardware มีจำกัด
  • ต้องการ No Telemetry
  • Edge/IoT Deployments
  • ยอมรับความเสี่ยง Beta

รอก่อนเมื่อ...

  • ต้องการ Production Stability 100%
  • Workload เป็น Large Files
  • ต้องการ Commercial Support
  • ต้องการ SLA จาก Vendor
  • ใช้ MinIO อยู่แล้วไม่มีปัญหา

ข้อแนะนำ: เริ่มต้นใช้ RustFS ใน Dev/Staging Environment ก่อน ทดสอบกับ Workload จริง และติดตามความคืบหน้าไปสู่ Version 1.0 Stable

แหล่งข้อมูลเพิ่มเติม