102 lines
3.3 KiB
Markdown
102 lines
3.3 KiB
Markdown
# 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 |
|