diff --git a/README.md b/README.md new file mode 100644 index 0000000..07aefec --- /dev/null +++ b/README.md @@ -0,0 +1,101 @@ +# MetaVox Load Test + +Ansible playbook voor het opzetten van een MetaVox loadtest omgeving op een Nextcloud server. + +## Wat doet het? + +- **50 teamfolders** aanmaken via de Groupfolders API +- **500.000 bestanden** (10.000 per teamfolder) direct op het filesystem +- **3-niveau mappenstructuur** (10 hoofdmappen × 3 submappen = 30 leaf folders) +- **100 metadata velddefinities** (10 teamfolder + 90 file-level) via MetaVox OCS API +- **~43 miljoen metadata records** direct via MySQL +- **7 redundante database indexes** droppen voor performance en diskruimte + +## Waarom direct filesystem + MySQL? + +| Methode | Snelheid | 500K bestanden | +|---------|----------|----------------| +| WebDAV upload | ~1.8 files/s | ~3 dagen | +| `occ files:scan` | ~2 files/s | ~3 dagen | +| **Direct filesystem + MySQL** | **~200 files/s** | **~40 minuten** | + +| Methode | Snelheid | 43M metadata records | +|---------|----------|----------------------| +| MetaVox API | ~0.5 req/s (timeouts) | weken | +| **Direct MySQL insert** | **~6.000 rows/s** | **~2 uur** | + +## Vereisten + +- Nextcloud server met MetaVox en Groupfolders app geïnstalleerd +- Ansible (lokaal op de server, `ansible_connection: local`) +- Python 3 met `requests` module +- MySQL/MariaDB root toegang (zonder wachtwoord, via unix socket) +- Minimaal 15GB vrije schijfruimte + +## Gebruik + +### Deployen + +```bash +# Clone op de Nextcloud server +git clone https://gitea.rikdekker.nl/Samkey/metavox-loadtest.git +cd metavox-loadtest + +# Pas server URL en credentials aan +vi group_vars/all.yml + +# Draai het playbook +ansible-playbook -i inventory/hosts.yml site.yml +``` + +### Specifieke fases draaien + +```bash +# Alleen teamfolders aanmaken +ansible-playbook -i inventory/hosts.yml site.yml --tags teamfolders + +# Alleen bestanden + DB registratie +ansible-playbook -i inventory/hosts.yml site.yml --tags files,db-register + +# Alleen metadata records invoegen +ansible-playbook -i inventory/hosts.yml site.yml --tags metadata-records +``` + +### Opruimen + +```bash +ansible-playbook -i inventory/hosts.yml cleanup.yml +``` + +## Fases + +1. **Pre-check** — Nextcloud bereikbaarheid en schijfruimte controleren +2. **Teamfolders** — 50 teamfolders aanmaken via Groupfolders API +3. **Metadata velden** — 100 velddefinities aanmaken en toewijzen via MetaVox API +4. **Bestanden** — 500K `.txt` bestanden direct op filesystem schrijven +5. **DB registratie** — Bestanden registreren in `oc_filecache` via MySQL +6. **Mappenstructuur** — Submappen aanmaken en bestanden verdelen +7. **Drop indexes** — 7 redundante indexes verwijderen van `oc_metavox_file_gf_meta` +8. **Metadata records** — ~43M records invoegen in `oc_metavox_file_gf_meta` en `oc_metavox_gf_metadata` + +## Database indexes + +Na het droppen van 7 redundante indexes blijven er 4 over op `oc_metavox_file_gf_meta`: + +| Index | Kolommen | +|-------|----------| +| PRIMARY | id | +| mf_file_gf_meta_unique | file_id, groupfolder_id, field_name | +| idx_file_gf_gf_lookup | groupfolder_id, field_name, field_value | +| idx_gf_file_meta_filter | field_name, field_value, groupfolder_id | + +## Configuratie + +Alle instellingen staan in `group_vars/all.yml`: + +| Variabele | Default | Beschrijving | +|-----------|---------|-------------| +| `num_teamfolders` | 50 | Aantal teamfolders | +| `files_per_teamfolder` | 10000 | Bestanden per teamfolder | +| `sql_batch_size` | 2000 | Rijen per INSERT statement | +| `folder_structure` | 10×3 | Mappenstructuur definitie |