MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So gehen Sie mit MongoDB in Produktion – Top Ten Tipps

Nach der erfolgreichen Entwicklung der Anwendung und bevor Sie sich der Produktion von MongoDB widmen, rechnen Sie mit diesen kurzen Richtlinien, um einen reibungslosen und effizienten Ablauf sowie eine optimale Leistung zu gewährleisten.

1) Bereitstellungsoptionen

Auswahl der richtigen Hardware

Für eine optimale Leistung ist es vorzuziehen, SSD statt HDD zu verwenden. Es ist notwendig, darauf zu achten, ob Ihr Speicher lokal oder remote ist, und entsprechende Maßnahmen zu ergreifen. Es ist besser, RAID zum Schutz vor Hardwaredefekten und Wiederherstellungsschemata zu verwenden, aber verlassen Sie sich nicht vollständig darauf, da es keinen Schutz vor unerwünschten Ausfällen bietet. Für die Ausführung auf Festplatten ist RAID-10 in Bezug auf Leistung und Verfügbarkeit gut geeignet, was anderen RAID-Leveln oft fehlt. Die richtige Hardware ist der Baustein für Ihre Anwendung, um die Leistung zu optimieren und größere Debakel zu vermeiden.

Cloud-Hosting

Es steht eine Reihe von Cloud-Anbietern zur Verfügung, die vorinstallierte MongoDB-Datenbankhosts anbieten. Die Auswahl der besten Wahl ist der Grundstein für Ihre Anwendung, um zu wachsen und erste Eindrücke auf dem Zielmarkt zu hinterlassen. MongoDB Atlas ist eine der möglichen Optionen, die eine vollständige Lösung für die Cloud-Schnittstelle mit Funktionen wie der Bereitstellung Ihrer Knoten und einem Snapshot Ihrer in Amazon S3 gespeicherten Daten bietet. ClusterControl ist eine weitere gute verfügbare Option für eine einfache Bereitstellung und Skalierung. Das bietet eine Vielzahl von Funktionen wie einfaches Hinzufügen und Entfernen von Knoten, Größenänderung von Instanzen und Klonen Ihres Produktionsclusters. Hier können Sie ClusterControl kostenlos testen. Andere verfügbare Optionen sind RackSpace ObjectRocket und MongoStitch.

2) Arbeitsspeicher

Elemente, auf die häufig zugegriffen wird, werden im RAM zwischengespeichert, sodass MongoDB eine optimale Reaktionszeit bieten kann. RAM hängt normalerweise von der Datenmenge ab, die Sie speichern möchten, der Anzahl der Sammlungen und Indizes. Stellen Sie sicher, dass Sie über genügend RAM verfügen, um Ihre Indizes aufzunehmen, da dies sonst Ihre Anwendungsleistung in der Produktion drastisch beeinträchtigen wird. Mehr RAM bedeutet weniger Seitenfehler und bessere Antwortzeiten.

3) Indizierung

Bei Anwendungen mit chronischen Schreibanforderungen spielt die Indizierung eine zwingende Rolle. Laut MongoDB-Dokumentation:

„Wenn ein Schreibvorgang ein indiziertes Feld ändert, aktualisiert MongoDB alle Indizes, die das geänderte Feld als Schlüssel haben.“

Seien Sie also vorsichtig bei der Auswahl von Indizes, da dies Ihre DB-Leistung beeinträchtigen kann.

Indexierungsbeispiel:Mustereintrag in der Restaurantdatenbank

{
  "address": {
     "building": "701",
     "street": "Harley street",
     "zipcode": "71000"
  },
  "cuisine": "Bakery",
  "grades": [
     { "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
     { "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 },
     { "date": { "$date": 1358985600000 }, "grade": "A", "score": 10 },
     { "date": { "$date": 1322006400000 }, "grade": "A", "score": 9 },
     { "date": { "$date": 1299715200000 }, "grade": "B", "score": 14 }
  ],
  "name": "Bombay Bakery",
  "restaurant_id": "187521"
}
  1. Index für einzelnes Feld erstellen

    > db.restaurants.createIndex( { "cuisine": 1 } );
    {
         "createdCollectionAutomatically" : false,
         "numIndexesBefore" : 1,
         "numIndexesAfter" : 2,
         "ok" : 1
    }

    Im obigen Beispiel wird ein Index in aufsteigender Reihenfolge für das Feld "Küche" erstellt.

  2. Index für mehrere Felder erstellen

    > db.restaurants.createIndex( { "cuisine": 1 , "address.zipcode": -1 } );
    {
            "createdCollectionAutomatically" : false,
            "numIndexesBefore" : 2,
            "numIndexesAfter" : 3,
            "ok" : 1
    }

    Hier wird ein zusammengesetzter Index für die Felder Küche und Postleitzahl erstellt. Die Zahl -ve definiert die absteigende Reihenfolge.

4) Bereiten Sie sich auf Sharding vor

MongoDB partitioniert die Daten mithilfe eines als Sharding bezeichneten Mechanismus auf verschiedene Maschinen. Es wird nicht empfohlen, am Anfang Sharding hinzuzufügen, es sei denn, Sie erwarten umfangreiche Datensätze. Denken Sie daran, die Leistung Ihrer Anwendung in Einklang zu halten. Sie benötigen einen guten Sharding-Schlüssel, der Ihren Datenmustern entspricht, da er sich direkt auf Ihre Antwortzeit auswirkt. Der Datenausgleich zwischen den Shards erfolgt automatisch. Es ist jedoch besser, vorbereitet zu sein und einen richtigen Plan zu haben. So können Sie konsolidieren, wann immer Ihre Anwendung es erfordert.

5) Best Practices für die Betriebssystemkonfiguration

  • XFS-Dateisystem
    • Es ist ein hochgradig skalierbares, hochleistungsfähiges 64-Bit-Journaling-Dateisystem. Verbessert die E/A-Leistung, indem weniger und größere E/A-Operationen zugelassen werden.
  • Dateideskriptorlimit setzen.
  • Deaktivieren Sie transparente Huge Pages und Nonuniform Access Memory (NUMA).
  • Ändern Sie die standardmäßige TCP-Keepalive-Zeit auf 300 Sekunden (für Linux) und 120 Sekunden (für Azure).

Probieren Sie diese Befehle aus, um die standardmäßige Keepalive-Zeit zu ändern;

Für Linux

sudo sysctl -w net.ipv4.tcp_keepalive_time=<value>

Für Windows

Geben Sie diesen Befehl als Administrator in die Eingabeaufforderung ein, wobei in Hexadezimalform ausgedrückt wird (z. B. 120000 ist 0x1d4c0):

reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ /t REG_DWORD /v KeepAliveTime /d <value>

6) Gewährleistung einer hohen Verfügbarkeit durch Replikation

Wenn Sie ohne Replikation in die Produktion gehen, kann es zu plötzlichen Ausfällen Ihrer App kommen. Die Replikation kümmert sich um das Problem, wenn ein Knoten ausfällt. Verwalten Sie Lese- und Schreibvorgänge für Ihre sekundären MongoDB-Instanzen gemäß Ihren Anwendungsanforderungen.

Beachten Sie beim Replizieren Folgendes:

  • Stellen Sie für Hochverfügbarkeit Ihren Replikatsatz in mindestens drei Rechenzentren bereit.
  • Stellen Sie sicher, dass MongoDB-Instanzen 0 oder 1 Stimmen haben.
  • Stellen Sie eine vollständige bidirektionale Netzwerkkonnektivität zwischen allen MongoDB-Instanzen sicher.

Beispiel für die Erstellung eines Replikatsatzes mit 4 lokalen MongoDB-Instanzen:

  1. Erstellen von 4 lokalen MongoDB-Instanzen

    Erstellen Sie zuerst Datenverzeichnisse

    mkdir -p /data/m0
    mkdir -p /data/m1
    mkdir -p /data/m2
    mkdir -p /data/m3
  2. Starten Sie 4 lokale Instanzen

    mongod --replSet cluster1 --port 27017 --dbpath /data/m0
    mongod --replSet cluster2 --port 27018 --dbpath /data/m1
    mongod --replSet cluster1 --port 27019 --dbpath /data/m2
    mongod --replSet cluster1 --port 27020 --dbpath /data/m3
  3. Fügen Sie die Instanzen zum Cluster hinzu und starten Sie

    mongo myhost:34014
    myConfig = {_id: ‘cluster1’, members: [
        {_id: 0, host: ‘myhost1:27017’},
        {_id: 1, host: ‘myhost2:27018’},
        {_id: 2, host: ‘myhost3:27019’},
        {_id: 3, host: ‘myhost4:27020’}]
    }
    rs.initiate(myConfig);

Sicherheitsmaßnahmen

7) Maschinen sichern

Offene Ports auf Maschinen, auf denen MongoDB gehostet wird, sind anfällig für verschiedene böswillige Angriffe. Mehr als 30.000 MongoDB-Datenbanken wurden bei einem Ransomware-Angriff aufgrund von Verzögerungen bei der richtigen Sicherheitskonfiguration kompromittiert. Schließen Sie während der Produktion Ihre öffentlichen Ports des MongoDB-Servers. Sie sollten jedoch einen Port für SSh-Zwecke offen halten.

Authentifizierung auf MongoDB-Instanz aktivieren:

  1. Starten Sie die Datei mongod.conf in Ihrem bevorzugten Editor.

  2. Fügen Sie diese Zeilen am Ende der Konfigurationsdatei hinzu.

    security:
          authorization: enabled
  3. Fügen Sie diese Zeilen am Ende der Konfigurationsdatei hinzu.

    service mongod restart
  4. Bestätigen Sie den Status

    service mongod status

Einschränken des externen Zugriffs

Öffnen Sie die Datei mongod.conf erneut, um eingeschränkte IPs für den Zugriff auf Ihren Server einzurichten.

bind_ip=127.0.0.1

Indem Sie diese Zeile hinzufügen, bedeutet dies, dass Sie nur über 127.0.0 auf Ihren Server zugreifen können. (das ist localhost). Sie können auch mehrere IPs in der Bindungsoption hinzufügen.

bind_ip=127.0.0.1,168.21.200.200

Das bedeutet, dass Sie von localhost und Ihrem privaten Netzwerk darauf zugreifen können.

8) Passwortschutz

Um Ihren Maschinen eine zusätzliche Sicherheitsebene hinzuzufügen, aktivieren Sie die Zugriffskontrolle und erzwingen Sie die Authentifizierung. Trotz der Tatsache, dass Sie den MongoDB-Server daran gehindert haben, Verbindungen von der Außenwelt zu akzeptieren, besteht immer noch die Möglichkeit, dass schädliche Skripte auf Ihren Server gelangen. Zögern Sie also nicht, einen Benutzernamen/ein Passwort für Ihre Datenbank festzulegen und die erforderlichen Berechtigungen zuzuweisen. Bei aktivierter Zugriffskontrolle können Benutzer nur Aktionen ausführen, die von ihren Rollen bestimmt werden.

Hier sind die Schritte zum Erstellen eines Benutzers und Zuweisen des Datenbankzugriffs mit bestimmten Rollen.

Zuerst erstellen wir einen Benutzer (in diesem Fall ist es der Administrator) zum Verwalten aller Benutzer und Datenbanken, und dann erstellen wir einen bestimmten Datenbankbesitzer, der nur Lese- und Schreibrechte für eine MongoDB-Datenbankinstanz hat.

Erstellen Sie einen Admin-Benutzer zum Verwalten anderer Benutzer für Datenbankinstanzen

  1. Öffnen Sie Ihre Mongo-Shell und wechseln Sie zur Admin-Datenbank:

    use admin
  2. Erstellen Sie einen Benutzer für die Admin-Datenbank

    db.createUser({ user: "admin", pwd: "admin_password", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
  3. Neu erstellten Benutzer authentifizieren

    db.auth("admin", "admin_password")
  4. Spezifischen Instanzbenutzer erstellen:

    use database_1
    db.createUser({ user: "user_1", pwd: "your_password", roles: [{ role: "dbOwner", db: "database_1" }] })
  5. Überprüfen Sie nun, ob ein Benutzer erfolgreich erstellt wurde oder nicht.

    db.auth("user_1", "your_password")
    show collections

Das ist es! Sie haben Ihre Datenbankinstanzen erfolgreich mit der richtigen Authentifizierung gesichert. Sie können nach demselben Verfahren beliebig viele Benutzer hinzufügen.

9) Verschlüsselung und Schutz von Daten

Wenn Sie Wiredtiger als Speicher-Engine verwenden, können Sie seine Verschlüsselung im Ruhezustand verwenden, um Ihre Daten zu verschlüsseln. Wenn nicht, sollte die Verschlüsselung auf dem Host mithilfe eines Dateisystems, von Geräten oder einer physischen Verschlüsselung durchgeführt werden.

10) Überwachen Sie Ihre Bereitstellung

Sobald Sie die Bereitstellung von MongoDB in der Produktion abgeschlossen haben, müssen Sie die Leistungsaktivität verfolgen, um mögliche Probleme frühzeitig zu vermeiden. Es gibt eine Reihe von Strategien, die Sie anpassen können, um Ihre Datenleistung in der Produktionsumgebung zu überwachen.

  • MongoDB enthält Dienstprogramme, die Statistiken über die Leistung und Aktivität von Instanzen zurückgeben. Dienstprogramme werden verwendet, um Probleme zu lokalisieren und den normalen Betrieb zu analysieren.

  • Verwenden Sie mongostat, um die Anordnung der Betriebstypen und die Kapazitätsplanung zu erfassen.

  • Zum Verfolgen von Berichten und Lese-Schreib-Aktivitäten wird Mongotop empfohlen.

mongotop 15

Dieser Befehl gibt alle 15 Sekunden eine Ausgabe zurück.

                     ns    total    read    write          2018-04-22T15:32:01-05:00
   admin.system.roles      0ms     0ms      0ms
 admin.system.version      0ms     0ms      0ms
             local.me      0ms     0ms      0ms
       local.oplog.rs      0ms     0ms      0ms
   local.replset.minvalid  0ms     0ms      0ms
    local.startup_log      0ms     0ms      0ms
 local.system.indexes      0ms     0ms      0ms
  local.system.namespaces  0ms     0ms      0ms
 local.system.replset      0ms     0ms      0ms     
                     ns    total    read    write          2018-04-22T15:32:16-05:00
   admin.system.roles      0ms     0ms      0ms
 admin.system.version      0ms     0ms      0ms
             local.me      0ms     0ms      0ms
       local.oplog.rs      0ms     0ms      0ms
   local.replset.minvalid  0ms     0ms      0ms
    local.startup_log      0ms     0ms      0ms
 local.system.indexes      0ms     0ms      0ms
  local.system.namespaces  0ms     0ms      0ms
 local.system.replset      0ms     0ms      0ms

MongoDB Monitoring Service (MMS) ist eine weitere verfügbare Option, die Ihren MongoDB-Cluster überwacht und es Ihnen bequem macht, einen Überblick über die Produktionsbereitstellungsaktivitäten zu haben.

Und natürlich ClusterControl von Multiplenines, das Automatisierungs- und Managementsystem für Open-Source-Datenbanken. ClusterControl ermöglicht die einfache Bereitstellung von Clustern mit automatisierten Sicherheitseinstellungen und vereinfacht die Fehlerbehebung Ihrer Datenbank durch Bereitstellung einer benutzerfreundlichen Verwaltungsautomatisierung, die die Reparatur und Wiederherstellung defekter Knoten, automatische Upgrades und mehr umfasst. Sie können mit der (für immer kostenlosen) Community Edition beginnen, mit der Sie MongoDB bereitstellen und überwachen sowie benutzerdefinierte Berater erstellen können, um Ihre Überwachungsbemühungen auf die Aspekte abzustimmen, die für Ihr Setup spezifisch sind. Laden Sie es hier kostenlos herunter.