Aku buat R&D homelab untuk memahami konsep distributed storage, khususnya bagaimana object storage seperti MinIO/SILO menggunakan beberapa storage drives dan nodes untuk menyediakan redundancy dan survive daripada kegagalan storage.
Untuk lab ini, aku gunakan:
- Windows + WSL2
- Debian
- Incus
- Debian VM
- PGSTY SILO
- MinIO Client (
mc) - ext4 filesystem
Tujuan utama bukan untuk membina production storage cluster, tetapi untuk memahami apa yang berlaku apabila storage drive atau node gagal.
PGSTY SILO ialah fork daripada MinIO yang mengekalkan compatibility dengan S3 dan MinIO tooling. (github.com)
1. Apa yang aku cuba faham?
Istilah seperti:
- distributed storage
- object storage
- erasure coding
- quorum
- storage node
- storage drive
- drive failure
- node failure
- healing
nampak macam konsep yang berasingan.
Jadi aku nak buat experiment yang mudah:
Kalau satu storage drive mati, adakah object masih boleh dibaca?
Kemudian:
Apa pula yang berlaku kalau satu server/node mati?
Daripada sini kita boleh faham konsep distributed storage melalui experiment sebenar.
2. Kenapa guna Incus?
Aku tidak mempunyai beberapa physical server untuk dijadikan storage nodes.
Jadi Incus digunakan untuk simulate beberapa server.
Topology:
WSL2
│
└── Incus
│
├── debian-vm
│ ├── sdb → storage drive 1
│ └── sdc → storage drive 2
│
└── debian-vm2
├── sdb → storage drive 3
└── sdc → storage drive 4
VM bukan distributed storage itu sendiri.
VM hanya digunakan sebagai simulation of storage nodes.
Distributed storage berlaku pada layer SILO.
3. Kenapa guna VM, bukan container?
Pada awalnya aku cuba menggunakan Incus container. Incus Container menggunakan root block sebagai virtual hdd. cara lain adalah menggunakan real block device seperti:
/dev/sdb
/dev/sdc
ia diperlukan agar dapat simulate storage drive sebenar.
Incus custom block volumes boleh digunakan pada VM dan disk devices VM menyokong hotplug. (linuxcontainers.org)
Jadi architecture akhirnya:
Incus
│
├── debian-vm
│ ├── /dev/sdb
│ └── /dev/sdc
│
└── debian-vm2
├── /dev/sdb
└── /dev/sdc
4. Membina storage drives
Untuk setiap VM, aku create dua Incus block volumes.
Contohnya:
incus storage volume create default silo1 size=5GiB --type block
incus storage volume create default silo1-extra size=5GiB --type block
Kemudian attach kepada VM:
incus config device add debian-vm silo-disk \
disk pool=default source=silo1
incus config device add debian-vm silo-disk2 \
disk pool=default source=silo1-extra
Hasilnya:
debian-vm
sda 30G OS
sdb 5G storage
sdc 5G storage
Perkara yang sama dibuat pada debian-vm2.
Akhirnya:
2 nodes × 2 drives = 4 storage endpoints
5. Format dan mount storage
Setiap block device diformat sebagai ext4:
sudo mkfs.ext4 /dev/sdb
sudo mkfs.ext4 /dev/sdc
Kemudian:
sudo mkdir -p /mnt/export1
sudo mkdir -p /mnt/export2
sudo mount /dev/sdb /mnt/export1
sudo mount /dev/sdc /mnt/export2
Jadi setiap node mempunyai:
/mnt/export1
/mnt/export2
yang masing-masing berada pada storage drive berbeza.
Untuk lab ini, mount dilakukan secara manual. fstab belum digunakan kerana fokusnya adalah experiment storage failure.
6. Network antara nodes
SILO memerlukan nodes berkomunikasi antara satu sama lain.
Incus menyediakan network dan DNS antara instances.
Contohnya:
ping debian-vm2
berjaya dari debian-vm.
Jadi SILO boleh menggunakan hostname:
debian-vm
debian-vm2
sebagai storage endpoints.
7. Setup SILO authentication
Sebelum menjalankan SILO, kita set credential untuk S3/API.
Untuk lab, kita gunakan environment variables:
export SILO_ROOT_USER="siloadmin"
export SILO_ROOT_PASSWORD="change-this-password"
Jangan gunakan password contoh ini untuk production.
Password perlu cukup kuat dan sebaiknya disimpan melalui secret-management mechanism apabila deployment sudah menjadi production.
Kemudian jalankan SILO dengan storage endpoints:
silo server \
http://debian-vm/mnt/export1 \
http://debian-vm/mnt/export2 \
http://debian-vm2/mnt/export1 \
http://debian-vm2/mnt/export2
Nama environment variable dan authentication mechanism perlu disesuaikan dengan versi SILO yang digunakan. Semak
silo server --helpatau dokumentasi versi yang dipasang sebelum production deployment.
8. Connect menggunakan mc
Selepas SILO berjalan, mc digunakan sebagai S3 client.
Contohnya:
mc alias set silo \
http://debian-vm:9000 \
siloadmin \
change-this-password
Kemudian check:
mc alias list
dan:
mc admin info silo
mc sekarang boleh digunakan untuk:
- create bucket
- upload object
- download object
- inspect server
- inspect storage status
Contoh:
mc mb silo/test
Kemudian upload:
echo "distributed storage test" > test.txt
mc cp test.txt silo/test/
Dan verify:
mc ls silo/test/
9. Membina distributed SILO pool
SILO dijalankan menggunakan keempat-empat storage endpoints:
silo server \
http://debian-vm/mnt/export1 \
http://debian-vm/mnt/export2 \
http://debian-vm2/mnt/export1 \
http://debian-vm2/mnt/export2
Sekarang SILO tidak lagi melihat storage sebagai empat directory yang tidak berkaitan.
Ia melihatnya sebagai satu distributed storage pool.
Topology:
SILO
│
Distributed Pool
│
┌────────────┴────────────┐
│ │
debian-vm debian-vm2
│ │
┌───┴───┐ ┌───┴───┐
│ │ │ │
sdb sdc sdb sdc
│ │ │ │
D1 D2 D3 D4
Dalam experiment ini, mc admin info menunjukkan:
Pool: 1
Drives: 2/2 OK
dan:
Pool | Drives Usage | Erasure stripe size | Erasure sets
1st | 0.0% | 4 | 1
Jadi empat storage endpoints tersebut membentuk:
1 pool
1 erasure set
4 drives
10. Distributed storage bukan sekadar "copy file"
Salah satu perkara penting yang aku mula faham:
4 drives ≠ semestinya 4 copies
Distributed object storage menggunakan mekanisme seperti erasure coding untuk menyediakan redundancy.
Secara konsep:
Object
│
Erasure Coding
│
┌────────┼────────┐
│ │ │
D1 D2 D3 ... Dn
Data object dipecahkan kepada beberapa shards dan sebahagian shard digunakan sebagai parity.
SILO menggunakan storage class dengan konfigurasi parity seperti EC:n. Konfigurasi sebenar perlu disemak daripada cluster configuration dan mc admin info, bukan diandaikan hanya berdasarkan jumlah drive. (github.com)
11. Drive failure experiment
Ini experiment yang paling menarik.
Aku mahu simulate:
Satu physical drive rosak tetapi server masih hidup.
Kita tidak shutdown VM.
Contohnya:
debian-vm
sdb → /mnt/export1
sdc → /mnt/export2
↑
FAILURE
Pertama, filesystem di-unmount:
sudo umount /mnt/export2
Tetapi:
umountsahaja bukan bermaksud drive rosak.
Ia cuma unmount filesystem.
Untuk simulate drive benar-benar hilang daripada VM, kita remove Incus disk device:
incus config device remove debian-vm silo-disk2
Kemudian:
incus exec debian-vm -- lsblk
/dev/sdc sudah tidak kelihatan.
Sekarang simulation menjadi:
debian-vm
│
├── sdb ONLINE
│
└── sdc OFFLINE
tetapi:
debian-vm = RUNNING
Jadi kita sedang menguji drive failure, bukan node failure.
12. Apa yang berlaku kepada object?
Sebelum melakukan failure test, upload satu object:
mc cp test.txt silo/test/
Kemudian pastikan object boleh dibaca:
mc cat silo/test/test.txt
Selepas satu drive ditarik keluar, cuba lagi:
mc cat silo/test/test.txt
Inilah experiment sebenar yang kita mahu lihat.
Jika cluster masih mempunyai quorum yang diperlukan untuk operasi tersebut, object boleh terus diakses walaupun satu storage endpoint offline.
Ini bergantung kepada erasure-set dan storage-class configuration.
13. Memasukkan drive kembali
Selepas experiment selesai, drive boleh attach kembali.
incus config device add debian-vm silo-disk2 \
disk pool=default source=silo1-extra
Check:
incus exec debian-vm -- lsblk
Kita mahu lihat:
sda
sdb
sdc
Kemudian mount kembali:
incus exec debian-vm -- sudo mount /dev/sdc /mnt/export2
Verify:
incus exec debian-vm -- df -hT /mnt/export2
Kemudian:
mc admin info silo
untuk melihat status drive dan cluster.
Jangan jalankan mkfs pada drive yang sama.
Kita mahu preserve filesystem dan storage data yang sedia ada.
14. Drive failure vs Node failure
Ini satu lagi konsep penting.
Drive failure
debian-vm
│
├── drive 1 ONLINE
└── drive 2 OFFLINE
Server masih hidup.
SILO masih boleh berkomunikasi dengan node tersebut.
Node failure
Sekarang kita shutdown keseluruhan VM:
debian-vm OFFLINE
│
├── drive 1
└── drive 2
debian-vm2 ONLINE
├── drive 3
└── drive 4
Dalam keadaan ini dua storage endpoints hilang serentak.
Jadi:
1 drive failure ≠ 1 node failure
Ini adalah sebab penting kenapa distributed storage perlu dilihat berdasarkan failure domain, bukan sekadar jumlah drives.
15. Current lab topology
Topology semasa:
WSL2
│
Incus
│
┌────────────┴────────────┐
│ │
debian-vm debian-vm2
│ │
┌────┴────┐ ┌────┴────┐
│ │ │ │
sdb sdc sdb sdc
│ │ │ │
5 GiB 5 GiB 5 GiB 5 GiB
│ │ │ │
export1 export2 export1 export2
└─────────┴───────────────┴─────────┘
│
SILO
│
Pool 1
1 erasure set
4 drives
Authentication:
S3/API user:
siloadmin
Password:
set melalui SILO environment variable
Client:
mc
│
└── silo alias
│
└── http://debian-vm:9000
16. Apa yang aku belajar
Lab ini bermula dengan soalan:
"Macam mana distributed storage sebenarnya bekerja?"
Sekarang konsepnya lebih jelas:
Node
│
├── Drive
├── Drive
│
└── SILO
│
├── Erasure Set
├── Erasure Coding
├── Quorum
├── Failure Detection
└── Recovery / Healing
Incus pula digunakan untuk simulate infrastructure:
Incus
↓
Virtual Machines
↓
Block Devices
↓
Filesystems
↓
SILO
↓
Distributed Object Storage
↓
S3 Client (mc)
17. Next experiment
Selepas berjaya memahami single-drive failure, experiment seterusnya:
Experiment 1 — Node failure
Shutdown:
debian-vm
Kemudian lihat behaviour cluster.
Experiment 2 — Node recovery
Start semula:
debian-vm
Kemudian observe status drives.
Experiment 3 — Healing
Perhatikan sama ada cluster melakukan recovery/healing selepas storage kembali.
Experiment 4 — Load balancer
Selepas memahami storage layer, baru tambah Nginx sebagai client-facing endpoint:
Client
│
Nginx
│
┌─────────┴─────────┐
│ │
debian-vm debian-vm2
│ │
D1 D2 D3 D4
\ /
\────── SILO ─────/
Ini memisahkan dua konsep:
SILO
→ distributed storage / data resilience
Nginx
→ client traffic / endpoint failover
Conclusion
Apa yang menarik tentang lab ini ialah kita tidak hanya menjalankan MinIO/SILO.
Kita cuba merosakkan storage secara sengaja.
Mula dengan:
4 drives
2 nodes
1 erasure set
Kemudian:
pull 1 drive
↓
observe
↓
attach kembali
↓
observe recovery
Daripada experiment ini, konsep distributed storage menjadi lebih mudah difahami kerana kita boleh melihat sendiri hubungan antara:
Node
+
Drive
+
Erasure Coding
+
Erasure Set
+
Quorum
+
Failure
+
Recovery
Seterusnya kita akan cuba matikan satu node, bukan sekadar satu drive.
Itulah beza antara:
"satu disk rosak"
dan
"satu server storage hilang."
Top comments (0)