Files
metavox-loadtest/README.md
2026-03-16 16:58:41 +01:00

102 lines
3.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 |