MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come distribuire il database Open edX MongoDB per l'alta disponibilità

Open edX è una piattaforma che fornisce la tecnologia software di apprendimento estremamente scalabile alla base di edX. Il progetto Open edX è una piattaforma basata sul Web per la creazione, l'erogazione e l'analisi di corsi online. È il software che alimenta edx.org e molti altri siti di formazione online.

In precedenza abbiamo scritto sul blog sull'implementazione di un database ad alta disponibilità per MySQL sulla piattaforma Open edX. Come detto in precedenza, è una piattaforma complessa in quanto copre più componenti e parte di questa enorme piattaforma è coperta da più servizi:

  • eCommerce:https://github.com/edx/ecommerce
  • Catalogo:https://github.com/edx/course-discovery
  • LMS / Studio:https://github.com/edx/edx-platform
  • Credenziali:https://github.com/edx/credentials
  • Approfondimenti:https://github.com/edx/edx-analytics-dashboard
  • API di analisi:https://github.com/edx/edx-analytics-data-api

Essenzialmente, Open Edx è perfetto per i corsi online in mezzo a una pandemia e per la formazione online come quello che potresti aver già provato e seguito, specialmente se stai acquisendo una certificazione di prodotto.

Breve panoramica architettonica

Il fulcro dell'architettura Open edX è edx-platform, che contiene le applicazioni di gestione dell'apprendimento e di creazione dei corsi (rispettivamente LMS e Studio). Oltre alla sua piattaforma edx, i servizi tecnici che comprendono l'intera piattaforma comprendono varie tecnologie coinvolte che coprono un intero livello complesso di questo software. Vedi il diagramma qui sotto tratto dalla presentazione di edX Team lo scorso dicembre.

Hai Snowflake, Amazon RDS, MongoDB, Amazon S3, Elasticsearch, Memcached e Redis come le tecnologie che incarnano questa ricca piattaforma. Eppure è persino difficile installare e configurare Open edX, ma sono riuscito a creare un semplice ambiente di sviluppo per capire un po' di questa piattaforma.

Mentre concentriamoci su MongoDB che viene utilizzato per archiviare contenuti per forum, struttura del corso e risorse del corso. I dati per studente sono archiviati in MySQL, quindi se vuoi conoscere e avere un'elevata disponibilità per il tuo MySQL con Open edX, leggilo qui.

Memorizzazione di contenuti per MongoDB

MongoDB è il database scelto da Open edX per archiviare file di grandi dimensioni che sono file di testo, PDF, clip audio/video, tarball, ecc. Se hai familiarità con Open edX e l'hai usato soprattutto come un autore per LMS o Studio, i dati vengono archiviati se carichi risorse nella configurazione di Open edX. Questi caricamenti sono i cosiddetti "contentstore" e sono fondamentalmente un'istanza GridFS supportata da MongoDB. Open edX utilizza MongoDB GridFS per archiviare i dati dei file in blocchi all'interno di un'istanza MongoDB e sono in grado di archiviare file di dimensioni superiori a 16 MB. Può anche servire porzioni di file di grandi dimensioni anziché l'intero file.

Una risorsa può essere caricata come "bloccata" o "sbloccata". Una risorsa bloccata è disponibile solo per gli studenti che seguono un corso particolare:la piattaforma edx controlla il ruolo dell'utente prima di servire il file. Le risorse sbloccate vengono fornite a qualsiasi utente su richiesta. Quando uno studente di un corso richiede una risorsa, l'intera risorsa viene servita da GridFS.

Impostazione di una disponibilità elevata per il database Open edX MongoDB

Ammettiamo che l'installazione o la configurazione della piattaforma Open edX sia una grande sfida. È difficile soprattutto che tu sia nuovo su questa piattaforma o software, ma ha un ottimo design architettonico. Tuttavia, è possibile che la configurazione con MongoDB sia un set di repliche a un nodo come supporto principale. D'altra parte, è meglio che il set di repliche abbia almeno uno o più nodi secondari oltre al primario. Questo serve la tua configurazione ad alta disponibilità nel caso in cui il tuo primario diventa kaput, il tuo nodo di replica secondario assumerà il ruolo principale.

Imposta un set di repliche con repliche secondarie

In questo modo, devi solo aggiungere e configurare almeno due repliche secondarie. L'ideale è che, almeno, in un set di repliche, hai 3 nodi per i quali uno è il tuo primario, quindi gli altri due nodi sono i tuoi secondari che si replicano sul primario. Ciò consente al set di replica MongoDB di procedere a un'elezione nel caso in cui il primario perda la connettività con i suoi secondari. Ciò offre affidabilità, ridondanza e, naturalmente, elevata disponibilità. È una configurazione semplice che puoi avere per ottenere un ambiente ad alta disponibilità con MongoDB.

Perché fornisce un'elevata disponibilità? Un set di repliche in MongoDB è un gruppo di processi mongod che mantengono lo stesso set di dati. I set di replica MongoDB utilizzano le elezioni per determinare quale membro del set diventerà primario in caso di guasto o arresto anomalo del sistema primario o di alcune modifiche alla configurazione. I set di repliche possono attivare un'elezione in risposta a una varietà di eventi, come:

  • Aggiunta di un nuovo nodo al set di repliche,
  • avvio di un set di repliche,
  • esecuzione della manutenzione del set di repliche utilizzando metodi come rs.stepDown() o rs.reconfig() e
  • i membri secondari perdono la connettività al primario per più del timeout configurato (10 secondi per impostazione predefinita).

Prendi questo diagramma di esempio che mostra come funzionano le elezioni.

Immagine per gentile concessione della documentazione di MongoDB

Inoltre, puoi utilizzare le altre repliche secondarie come la tua preferenza di lettura, ma questo dipende dalla configurazione basata sulla connessione del tuo client. Puoi saperne di più leggendo le opzioni di preferenza di lettura per la connessione o controllando la Preferenza di lettura qui.

Ora, sembra fantastico, ma gestire l'endpoint del client dell'applicazione come la modifica del nome host o dell'indirizzo IP richiede una modifica manuale. Non è l'ideale se hai un sistema di bilanciamento del carico sopra il tuo set di repliche, proprio come HaProxy, poiché MongoDB Replica Set esegue l'elezione internamente a MongoDB.

Imposta un cluster frammentato

Il cluster frammentato è l'ideale se hai a che fare con set di dati di grandi dimensioni. Sebbene ciò non significhi che devi progettare un cluster partizionato, deve avere a che fare con set di dati di grandi dimensioni. MongoDB offre mongos, che è un'utilità che funge da servizio di routing per le configurazioni shard di MongoDB che elabora le query dal livello dell'applicazione, quindi determina la posizione di questi dati nel cluster shard identificato tramite la sua chiave shard per completare le sue transazioni o database operazioni. Fondamentalmente, pensa solo che le istanze mongos si comportano in modo identico a qualsiasi altra istanza MongoDB.

Allora perché avere un mongo davanti alla tua applicazione? Nei casi in cui la replica imposta il nome host primario o l'IP cambia dopo l'elezione, dal punto di vista dell'applicazione, ciò significa che è necessario modificare anche l'endpoint. Con mongos, è sufficiente indirizzare il client dell'applicazione su una delle nostre istanze mongos. Il client dell'applicazione si interfaccia solo con l'istanza mongos e questo è tutto ciò che conta. Il mongos sarà quello che gestirà le tue richieste di query o transazioni utilizzando il suo scopo e la sua funzione per la tua configurazione di MongoDB Shard. Ciò significa che nei file di configurazione Open edx non ci sono modifiche da apportare. Non è necessario riavviare i server delle applicazioni per recuperare il ritardo con le modifiche dai set di repliche MongoDB.

Come impostare l'alta disponibilità

Ad esempio, utilizzando ClusterControl. L'utilizzo di ClusterControl può essere ottenuto in modo semplice ed efficiente poiché ciò può essere eseguito tramite l'interfaccia utente evitando quelle configurazioni e installazioni manuali per un'installazione molto complessa.

Supponiamo che tu abbia un'istanza MongoDB esistente con un database Open edX esistente,

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

}

Puoi semplicemente importare questo come database esistente in ClusterControl ed eseguire un backup utilizzando la funzione di backup di ClusterControl. In alternativa, puoi utilizzare mongodump o provare a utilizzare Percona Backup for MongoDB.

Ora, in ClusterControl, crea uno shard MongoDB come nuova distribuzione. Questo può essere fatto procedendo come segue:

  1. Distribuisci un nuovo MongoDB Shard nella finestra di dialogo della procedura guidata di distribuzione.

  1. Configura le impostazioni SSH e i relativi server e router di configurazione. Qui è dove le tue istanze mongos devono essere separate dai tuoi server di configurazione.

  1. Definisci i tuoi frammenti. Questi sono i frammenti del tuo set di repliche. A seconda della tua esigenza. Ad esempio, in questa distribuzione ho distribuito due shard, ma all'inizio puoi utilizzare solo uno shard, specialmente per le piccole distribuzioni.

  1. Definisci le impostazioni del tuo database

A questo punto, premi premere il pulsante di implementazione e attendere che il lavoro venga elaborato da ClusterControl.

  1. Una volta terminato, ora puoi ripristinare il backup che hai preso da mongodump. Ad esempio, ho eseguito un backup utilizzando ClusterControl e quindi l'ho utilizzato come backup di origine. Quando usi il comando mongorestore, assicurati che il tuo host di destinazione sia una delle tue istanze mongos. Per questa distribuzione di esempio, ho 192.168.40.233 host.

$ 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. Ora sei pronto per apportare alcune modifiche ai file di configurazione di Open edX . Nella mia configurazione di installazione, puoi aggiornare /edx/etc/studio.yml e  /edx/etc/lms.yml. Potrebbe essere necessario modificare anche i file nei file /edx/app/edxapp/lms.auth.json e /edx/app/edxapp/cms.auth.json e sostituirli con il nome host corretto dell'istanza mongos.

  2. Verifica nei tuoi mongos e verifica se i database sono caricati e possono essere accessibili,

[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

Ora sei a posto!!!

Nella visualizzazione web anche di ClusterControl, una volta che ClusterControl avrà terminato la distribuzione, avrai una topologia simile a questa,

Una volta terminato, sei a posto per gestire il tuo Open edX e gestirlo i tuoi corsi!