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

So stellen Sie die Open edX MongoDB-Datenbank für Hochverfügbarkeit bereit

Open edX ist eine Plattform, die die massiv skalierbare Lernsoftwaretechnologie hinter edX bereitstellt. Das Open edX-Projekt ist eine webbasierte Plattform zum Erstellen, Bereitstellen und Analysieren von Online-Kursen. Es ist die Software, die edx.org und viele andere Online-Bildungsseiten unterstützt.

Wir haben zuvor über die Bereitstellung einer High Availability for MySQL-Datenbank auf der Open edX-Plattform gebloggt. Wie bereits erwähnt, handelt es sich um eine komplexe Plattform, da sie mehrere Komponenten umfasst, und ein Teil dieser riesigen Plattform wird von mehreren Diensten abgedeckt:

  • eCommerce:https://github.com/edx/ecommerce
  • Katalog:https://github.com/edx/course-discovery
  • LMS / Studio:https://github.com/edx/edx-platform
  • Anmeldeinformationen:https://github.com/edx/credentials
  • Einblicke:https://github.com/edx/edx-analytics-dashboard
  • Analytics-API:https://github.com/edx/edx-analytics-data-api

Im Wesentlichen eignet sich Open Edx perfekt für Online-Kurse inmitten von Pandemien und Online-Schulungen, wie Sie sie möglicherweise bereits ausprobiert und absolviert haben, insbesondere wenn Sie eine Produktzertifizierung erwerben.

Kurzer Überblick über die Architektur

Das Herzstück der Open edX-Architektur ist die edx-Plattform, die die Lernmanagement- und Kurserstellungsanwendungen (LMS bzw. Studio) enthält. Neben der edx-Plattform umfassen die technischen Dienste, die die gesamte Plattform umfassen, verschiedene beteiligte Technologien, die eine ganze komplexe Ebene dieser Software abdecken. Siehe das Diagramm unten aus der Präsentation des edX-Teams vom letzten Dezember.

Sie haben Snowflake, Amazon RDS, MongoDB, Amazon S3, Elasticsearch, Memcached , und Redis als die Technologien, die diese reichhaltige Plattform verkörpern. Es ist sogar schwierig, Open edX zu installieren und einzurichten, aber ich habe es geschafft, eine einfache Entwicklungsumgebung einzurichten, um ein wenig von dieser Plattform zu verstehen.

Wollen wir uns währenddessen auf MongoDB konzentrieren, das zum Speichern von Inhalten für Foren, Kursstrukturen und Kursressourcen verwendet wird. Daten pro Lernender werden in MySQL gespeichert. Wenn Sie also wissen möchten, wie hoch Ihre MySQL mit Open edX verfügbar ist, lesen Sie sie hier.

Speichern von Inhalten für MongoDB

MongoDB ist die Datenbank der Wahl von Open edX zum Speichern großer Dateien, die Textdateien, PDFs, Audio-/Videoclips, Tarballs usw. sind. Wenn Sie mit Open edX vertraut sind und es speziell als verwendet haben ein Autor für das LMS oder Studio, werden Daten gespeichert, wenn Sie Assets in Ihr Open edX-Setup hochladen. Diese Uploads werden als „Contentstore“ bezeichnet und sind im Grunde eine von MongoDB unterstützte GridFS-Instanz. Open edX verwendet MongoDB GridFS, um Dateidaten in Blöcken innerhalb einer MongoDB-Instanz zu speichern, und kann Dateien mit einer Größe von mehr als 16 MB speichern. Es kann auch Teile großer Dateien anstelle der gesamten Datei bereitstellen.

Ein Asset kann als "gesperrt" oder "entsperrt" hochgeladen werden. Ein gesperrtes Asset ist nur für Studenten verfügbar, die einen bestimmten Kurs belegen – die edx-Plattform überprüft die Rolle des Benutzers, bevor die Datei bereitgestellt wird. Freigeschaltete Assets werden jedem Benutzer auf Anfrage bereitgestellt. Wenn ein Kursteilnehmer ein Asset anfordert, wird das gesamte Asset von GridFS bereitgestellt.

Hochverfügbarkeit für Ihre Open edX MongoDB-Datenbank einrichten

Geben wir zu, dass die Installation oder Einrichtung Ihrer Open edX-Plattform eine große Herausforderung darstellt. Es ist schwierig, besonders wenn Sie neu bei dieser Plattform oder Software sind, aber sie hat ein sehr großartiges architektonisches Design. Es ist jedoch möglich, dass Ihr Setup mit Ihrer MongoDB ein Ein-Knoten-Replikatsatz als primärer Standplatz ist. Andererseits ist es am besten, dass Ihr Replikatsatz neben dem primären mindestens einen sekundären oder mehrere sekundäre Knoten hat. Dies dient Ihrem Hochverfügbarkeits-Setup, falls Ihr primärer Knoten kaputt geht, übernimmt Ihr sekundärer Replikatknoten die primäre Rolle.

Ein Replikatset mit sekundären Replikaten einrichten

Hierfür müssen Sie nur mindestens zwei sekundäre Replikate hinzufügen und einrichten. Das Ideal ist, dass Sie in einem Replikatsatz mindestens 3 Knoten haben, von denen einer Ihr Primärknoten ist, und die anderen beiden Knoten Ihre Sekundärknoten, die auf den Primärknoten replizieren. Dies ermöglicht es dem MongoDB-Replikatsatz, eine Wahl durchzuführen, falls der Primärknoten die Verbindung zu seinen Sekundärknoten verliert. Dadurch erhalten Sie Ausfallsicherheit, Redundanz und natürlich eine hohe Verfügbarkeit. Es ist eine einfache Einrichtung, die Sie benötigen können, um mit MongoDB eine hochverfügbare Umgebung zu erreichen.

Warum bietet dies eine hohe Verfügbarkeit? Ein Replikatsatz in MongoDB ist eine Gruppe von Mongod-Prozessen, die denselben Datensatz verwalten. MongoDB-Replikatsätze verwenden Wahlen, um zu bestimmen, welches Satzmitglied primär wird, falls der primäre ausfällt oder abnormal beendet wird oder einige Konfigurationsänderungen vorgenommen werden. Replikat-Sets können eine Wahl als Reaktion auf eine Vielzahl von Ereignissen auslösen, wie z. B.:

  • Hinzufügen eines neuen Knotens zum Replikatsatz,
  • Initiieren eines Replikatsatzes
  • Durchführen der Replikatsatzwartung mit Methoden wie rs.stepDown() oder rs.reconfig() und
  • die sekundären Mitglieder verlieren die Verbindung zum primären länger als das konfigurierte Zeitlimit (standardmäßig 10 Sekunden).

Nehmen Sie dieses Beispieldiagramm, das visualisiert, wie die Wahl funktioniert.

Bild mit freundlicher Genehmigung der MongoDB-Dokumentation

Außerdem können Sie die anderen sekundären Replikate als verwenden Ihrer Lesepräferenz, aber dies hängt von der Einrichtung ab, die auf der Verbindung Ihres Clients basiert. Sie können mehr erfahren, indem Sie die Leseeinstellungsoptionen für die Verbindung lesen oder die Leseeinstellung hier überprüfen.

Das sieht gut aus, aber der Umgang mit Ihrem Anwendungs-Client-Endpunkt, wie z. B. das Ändern des Hostnamens oder der IP-Adresse, erfordert eine manuelle Änderung. Es ist nicht ideal, wenn Sie wie HaProxy einen Load Balancer auf Ihrem Replica Set haben, da das MongoDB Replica Set die Wahl intern von MongoDB durchführt.

Richten Sie einen Sharded-Cluster ein

Sharded-Cluster sind ideal, wenn Sie mit einer großen Menge an Datensätzen arbeiten. Das bedeutet zwar nicht, dass Sie einen Sharding-Cluster entwerfen müssen, aber es muss mit großen Datensätzen zurechtkommen. MongoDB bietet Mongos an, ein Dienstprogramm, das als Routing-Dienst für MongoDB-Shard-Konfigurationen fungieren soll, der Abfragen von der Anwendungsschicht verarbeitet und dann den Speicherort dieser Daten in dem Shard-Cluster bestimmt, der durch seinen Shard-Schlüssel identifiziert wird, um seine Transaktionen oder Datenbank abzuschließen Operationen. Denken Sie im Grunde nur daran, dass sich Mongos-Instanzen genauso verhalten wie jede andere MongoDB-Instanz.

Warum also einen Mongo vor deiner Bewerbung? In Zeiten, in denen sich der primäre Hostname oder die primäre IP-Adresse Ihres Replikats nach der Wahl ändert, bedeutet dies aus Anwendungssicht, dass Sie auch den Endpunkt ändern müssen. Mit Mongos verweisen Sie Ihren Anwendungsclient einfach auf eine unserer Mongos-Instanzen. Ihr Anwendungsclient ist nur mit der Mongos-Instanz verbunden, und das ist alles, worauf es ankommt. Der Mongos ist derjenige, der Ihre Abfrageanfragen oder Transaktionen unter Verwendung seines Zwecks und seiner Funktion für Ihr MongoDB-Shard-Setup bearbeitet. Das bedeutet, dass in Ihren Open edx-Konfigurationsdateien keine Änderungen vorgenommen werden müssen. Sie müssen Ihre Anwendungsserver nicht neu starten, um die Änderungen aus Ihren MongoDB-Replikatsätzen nachzuholen.

So richten Sie Hochverfügbarkeit ein

Zum Beispiel mit ClusterControl. Die Verwendung von ClusterControl kann einfach und effizient erreicht werden, da dies über die Benutzeroberfläche erfolgen kann, wodurch diese manuellen Konfigurationen und Installationen für ein sehr komplexes Setup vermieden werden.

Nehmen wir an, Sie haben eine bestehende MongoDB-Instanz mit vorhandener Open edX-Datenbank,

rs0:PRIMARY> show dbs;

admin                0.000GB

cs_comments_service  0.000GB

edxapp               0.087GB

local                0.118GB



rs0:PRIMARY> rs.status()

{

        "set" : "rs0",

        "date" : ISODate("2021-01-22T14:46:51.398Z"),

        "myState" : 1,

        "term" : NumberLong(17),

        "heartbeatIntervalMillis" : NumberLong(2000),

        "members" : [

                {

                        "_id" : 0,

                        "name" : "192.168.40.10:27017",

                        "health" : 1,

                        "state" : 1,

                        "stateStr" : "PRIMARY",

                        "uptime" : 133,

                        "optime" : {

                                "ts" : Timestamp(1611326680, 1),

                                "t" : NumberLong(17)

                        },

                        "optimeDate" : ISODate("2021-01-22T14:44:40Z"),

                        "electionTime" : Timestamp(1611326679, 1),

                        "electionDate" : ISODate("2021-01-22T14:44:39Z"),

                        "configVersion" : 2,

                        "self" : true

                }

        ],

        "ok" : 1

}

Sie können diese einfach als vorhandene Datenbank in ClusterControl importieren und mit der Backup-Funktion von ClusterControl ein Backup erstellen. Alternativ können Sie Mongodump verwenden oder versuchen, Percona Backup for MongoDB zu verwenden.

Erstellen Sie nun in ClusterControl einen MongoDB-Shard als neue Bereitstellung. Dies kann durch die folgenden Schritte erfolgen:

  1. Stellen Sie einen neuen MongoDB-Shard im Dialogfeld des Bereitstellungsassistenten bereit.

  1. Richten Sie die SSH-Einstellungen und ihre Konfigurationsserver und Router ein. Hier sollen sich Ihre Mongos-Instanzen neben Ihren Konfigurationsservern befinden.

  1. Definiere deine Shards. Dies sind Ihre Replikat-Set-Shard(s). Je nach Bedarf. In dieser Bereitstellung habe ich beispielsweise zwei Shards bereitgestellt, aber Sie können zunächst nur ein Shard verwenden, insbesondere für kleine Bereitstellungen.

  1. Definieren Sie Ihre Datenbankeinstellungen

An dieser Stelle drücken den Deploy-Button und warten Sie einfach, während der Job von ClusterControl verarbeitet wird.

  1. Sobald Sie fertig sind, können Sie jetzt die Sicherung wiederherstellen, die Sie von Mongodump erstellt haben. Zum Beispiel habe ich mit ClusterControl ein Backup erstellt und dieses dann als Quell-Backup verwendet. Stellen Sie bei Verwendung des Befehls mongorestore sicher, dass Ihr Zielhost eine Ihrer mongos-Instanzen ist. Für diese Beispielbereitstellung habe ich den Host 192.168.40.233.

$ mongorestore --host 192.168.40.233 --port 27017 --username <username> --password <password> --gzip  --archive=BACKUP-2/rs0.gz --authenticationDatabase=admin

2021-01-22T11:17:06.335+0000    preparing collections to restore from

2021-01-22T11:17:06.336+0000    don't know what to do with subdirectory "cs_comments_service", skipping...

2021-01-22T11:17:06.336+0000    don't know what to do with subdirectory "edxapp", skipping...

2021-01-22T11:17:06.337+0000    don't know what to do with subdirectory "admin", skipping...

2021-01-22T11:17:06.337+0000    don't know what to do with subdirectory "", skipping...

2021-01-22T11:17:06.372+0000    restoring to existing collection edxapp.modulestore.definitions without dropping

2021-01-22T11:17:06.372+0000    reading metadata for edxapp.modulestore.definitions from archive 'BACKUP-2/rs0.gz'

2021-01-22T11:17:06.373+0000    restoring edxapp.modulestore.definitions from archive 'BACKUP-2/rs0.gz'

2021-01-22T11:17:06.387+0000    restoring to existing collection edxapp.fs.chunks without dropping

2021-01-22T11:17:06.387+0000    reading metadata for edxapp.fs.chunks from archive 'BACKUP-2/rs0.gz'

…

……
  1. Jetzt sind Sie bereit und nehmen dann einige Änderungen an Ihren Open edX-Konfigurationsdateien vor . In meinem Installations-Setup können Sie /edx/etc/studio.yml und  /edx/etc/lms.yml aktualisieren. Möglicherweise müssen Sie auch die Dateien in den Dateien /edx/app/edxapp/lms.auth.json und /edx/app/edxapp/cms.auth.json ändern und durch den korrekten Hostnamen Ihrer Mongos-Instanz ersetzen.

  2. Überprüfen Sie in Ihrem Mongos und prüfen Sie, ob die Datenbanken geladen und zugänglich sind,

[email protected]:~# mongo --host "mongodb://edxapp:[email protected]:27017/?authSource=admin"

MongoDB shell version v4.2.11

connecting to: mongodb://192.168.40.233:27017/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb

Implicit session: session { "id" : UUID("00a3a395-3531-4381-972e-502478af38d1") }

MongoDB server version: 4.2.11

mongos> show dbs

admin                0.000GB

config               0.002GB

cs_comments_service  0.000GB

edxapp               0.104GB

Jetzt bist du fertig!!!

In der Webansicht auch von ClusterControl, sobald das ClusterControl das Deployment beendet hat, haben Sie eine Topologie, die so aussehen sollte,

Sobald Sie fertig sind, können Sie Ihr Open edX verwalten und verwalten Ihre Kurse!