42 Reorganisation in MongoDB

Eine Reorganisation in MongoDB bezieht sich auf das Neuordnen oder Optimieren von Daten innerhalb der Datenbank, um die Performance zu verbessern, Speicherplatz freizugeben oder die Datenverteilung in einem Cluster auszugleichen. Hier sind die wichtigsten Aspekte der Reorganisation:


42.1 Warum ist eine Reorganisation notwendig?

  1. Fragmentierung: Durch häufiges Einfügen, Aktualisieren und Löschen von Dokumenten können Daten fragmentiert werden, was zu ineffizienter Speichernutzung führt.
  2. Ungleichmäßige Datenverteilung: In geshardeten Clustern können Daten ungleichmäßig über die Shards verteilt sein, was zu Hotspots führt.
  3. Index-Fragmentierung: Indizes können fragmentiert werden, was die Abfrageperformance beeinträchtigt.
  4. Speicheroptimierung: Speicherplatz, der durch gelöschte Dokumente belegt bleibt, wird nicht automatisch freigegeben.

42.2 Ansätze zur Reorganisation

42.2.1 1. Reparieren der Datenbank (repairDatabase)

Die repairDatabase-Operation defragmentiert Daten und gibt ungenutzten Speicherplatz zurück.

db.runCommand({ repairDatabase: 1 })

Vorteile: - Reduziert Fragmentierung. - Gibt Speicherplatz frei.

Einschränkungen: - Kann nicht auf Sharded Collections angewendet werden. - Blockiert die Datenbank während der Ausführung.


42.2.2 2. Index-Reorganisation

Index-Fragmentierung kann die Abfrageperformance beeinträchtigen. Ein Neuaufbau eines Indexes behebt dies.

db.collection.dropIndex("indexName")
db.collection.createIndex({ fieldName: 1 })

Alternativ kann der Index mit compact reorganisiert werden (nur WiredTiger):

db.runCommand({ compact: "collectionName" })

Hinweis: Die compact-Operation erfordert ausreichenden Speicherplatz und ist ressourcenintensiv.


42.2.3 3. Rebalancing in Sharded Clustern

In einem Sharded Cluster können Daten ungleichmäßig verteilt sein. Der Balancer sorgt für die automatische Reorganisation der Daten über die Shards.

42.2.3.1 Balancer aktivieren:

sh.setBalancerState(true)

42.2.3.2 Manuelles Neuausgleichen einer Shard-Range:

sh.moveChunk("db.collection", { shardKey: value }, "destinationShard")

42.2.4 4. Datenexport und Neuimport

Eine manuelle Methode zur Reorganisation ist das Exportieren und erneute Importieren der Daten.

  1. Exportieren der Daten:

    mongodump --db databaseName --out /backupPath
  2. Löschen der Collection/Datenbank:

    db.collection.drop()
  3. Importieren der Daten:

    mongorestore --db databaseName /backupPath/databaseName

42.2.5 5. TTL-Index für alte Daten

Zur automatischen Bereinigung alter oder nicht mehr benötigter Daten kann ein TTL-Index verwendet werden.

db.collection.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 })

42.3 Best Practices

  1. Planung von Reorganisationen:
  2. Backup erstellen:
  3. Überwachung der Performance:
  4. Automatisierung: