sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo implementar la base de datos Open edX MongoDB para alta disponibilidad

Open edX es una plataforma que proporciona la tecnología de software de aprendizaje masivamente escalable detrás de edX. El proyecto Open edX es una plataforma basada en la web para crear, impartir y analizar cursos en línea. Es el software que impulsa edx.org y muchos otros sitios de educación en línea.

Anteriormente escribimos en un blog sobre la implementación de una base de datos de alta disponibilidad para MySQL en la plataforma Open edX. Como se dijo anteriormente, es una plataforma compleja ya que cubre múltiples componentes, y parte de esta enorme plataforma está cubierta por múltiples servicios:

  • Comercio electrónico:https://github.com/edx/ecommerce
  • Catálogo:https://github.com/edx/course-discovery
  • LMS/Estudio:https://github.com/edx/edx-platform
  • Credenciales:https://github.com/edx/credentials
  • Perspectivas:https://github.com/edx/edx-analytics-dashboard
  • API de análisis:https://github.com/edx/edx-analytics-data-api

Esencialmente, Open Edx es perfecto para cursos en línea en medio de una pandemia y capacitación en línea como lo que ya podría haber probado y tomado, especialmente si está adquiriendo una certificación de producto.

Resumen arquitectónico breve

La pieza central de la arquitectura Open edX es edx-platform, que contiene las aplicaciones de gestión de aprendizaje y creación de cursos (LMS y Studio, respectivamente). Además de su plataforma edx, los servicios técnicos que comprenden toda la plataforma comprenden varias tecnologías involucradas que cubren todo un nivel complejo de este software. Vea el siguiente diagrama tomado de la presentación del equipo edX en diciembre pasado.

Tiene Snowflake, Amazon RDS, MongoDB, Amazon S3, Elasticsearch, Memcached y Redis como las tecnologías que incorporan esta rica plataforma. Sin embargo, incluso es difícil de instalar y configurar Open edX, pero logré instalar un entorno de desarrollo simple para comprender un poco de esta plataforma.

Mientras tanto, centrémonos en MongoDB, que se utiliza para almacenar contenidos para foros, estructura del curso y recursos del curso. Los datos por alumno se almacenan en MySQL, así que si desea saber y tener alta disponibilidad para su MySQL con Open edX, léalo aquí.

Almacenamiento de contenido para MongoDB

MongoDB es la base de datos elegida por Open edX para almacenar archivos grandes que son archivos de texto, PDF, clips de audio/video, tarballs, etc. Si está familiarizado con Open edX y lo ha usado especialmente como un autor para LMS o Studio, los datos se almacenan si carga activos en su configuración de Open edX. Estas cargas se denominan "almacén de contenido" y son básicamente una instancia de GridFS respaldada por MongoDB. Open edX usa MongoDB GridFS para almacenar datos de archivos en fragmentos dentro de una instancia de MongoDB y puede almacenar archivos de más de 16 MB de tamaño. También puede servir porciones de archivos grandes en lugar del archivo completo.

Un activo se puede cargar como "bloqueado" o "desbloqueado". Un activo bloqueado solo está disponible para los estudiantes que toman un curso en particular:la plataforma edx verifica el rol del usuario antes de entregar el archivo. Los activos desbloqueados se sirven a cualquier usuario que lo solicite. Cuando un estudiante en un curso solicita un activo, todo el activo se sirve desde GridFS.

Configuración de una alta disponibilidad para su base de datos Open edX MongoDB

Admitamos que instalar o configurar su plataforma Open edX es un gran desafío. Es difícil, especialmente si eres nuevo en esta plataforma o software, pero tiene un diseño arquitectónico muy bueno. Sin embargo, es posible que su configuración con su MongoDB sea un soporte de conjunto de réplicas de un nodo como principal. Por otro lado, es mejor que su conjunto de réplicas tenga al menos un nodo secundario o varios nodos secundarios además del principal. Esto es útil para su configuración de alta disponibilidad en caso de que su nodo de réplica principal quede inhabilitado, su nodo de réplica secundario asumirá la función principal.

Configurar un conjunto de réplicas con réplicas secundarias

Al hacer esto, solo tiene que agregar y configurar al menos dos réplicas secundarias. Lo ideal es que, al menos, en un conjunto de réplicas, tenga 3 nodos para los cuales uno es su principal, luego los otros dos nodos son sus secundarios que se replican en el principal. Esto permite que el conjunto de réplicas de MongoDB realice una elección en caso de que el primario pierda la conectividad con sus secundarios. Esto le brinda confiabilidad, redundancia y, por supuesto, alta disponibilidad. Es una configuración simple que puede tener para lograr un entorno de alta disponibilidad con MongoDB.

¿Por qué esto proporciona alta disponibilidad? Un conjunto de réplicas en MongoDB es un grupo de procesos mongod que mantienen el mismo conjunto de datos. Los conjuntos de réplicas de MongoDB usan elecciones para determinar qué miembro del conjunto se convertirá en el principal en caso de que el principal se apague o finalice de manera anormal o algunos cambios de configuración. Los conjuntos de réplicas pueden desencadenar una elección en respuesta a una variedad de eventos, como:

  • Agregar un nuevo nodo al conjunto de réplicas,
  • iniciar un conjunto de réplicas,
  • realizar el mantenimiento del conjunto de réplicas mediante métodos como rs.stepDown() o rs.reconfig(), y
  • los miembros secundarios pierden la conectividad con el principal durante más del tiempo de espera configurado (10 segundos de forma predeterminada).

Tome este diagrama de ejemplo que visualiza cómo funciona la elección.

Imagen cortesía de la documentación de MongoDB

Además, puede usar las otras réplicas secundarias como su preferencia de lectura, pero esto depende de la configuración basada en la conexión de su cliente. Puede obtener más información leyendo las opciones de preferencias de lectura para la conexión o consultando las Preferencias de lectura aquí.

Ahora, esto se ve muy bien, pero tratar con el punto final del cliente de su aplicación, como cambiar el nombre de host o la dirección IP, requiere un cambio manual. No es ideal si tiene un equilibrador de carga encima de su conjunto de réplicas como HaProxy, ya que el conjunto de réplicas de MongoDB realiza la elección internamente de MongoDB.

Configurar un clúster fragmentado

El clúster fragmentado es ideal si se trata de conjuntos de datos de gran tamaño. Aunque no significa que tenga que diseñar un clúster fragmentado, tiene que lidiar con grandes conjuntos de datos. MongoDB ofrece mongos, que es una utilidad que actuará como un servicio de enrutamiento para configuraciones de fragmentos de MongoDB que procesa consultas desde la capa de aplicación y luego determina la ubicación de estos datos en el clúster fragmentado identificado a través de su clave de fragmento para completar sus transacciones o base de datos. operaciones. Básicamente, solo piense que las instancias de mongos se comportan de manera idéntica a cualquier otra instancia de MongoDB.

Entonces, ¿por qué tener un mongos delante de su aplicación? En los momentos en que su Réplica establece el nombre de host principal o la IP cambia después de la elección, desde la perspectiva de la aplicación, eso significa que también debe cambiar el punto final. Con mongos, simplemente dirija su aplicación cliente a una de nuestras instancias de mongos. Su cliente de aplicación solo interactúa con la instancia de mongos y eso es todo lo que importa. Los mongos serán los que manejarán sus solicitudes de consulta o transacciones utilizando su propósito y función para la configuración de su MongoDB Shard. Eso significa que, en sus archivos de configuración de Open edx, no hay cambios que hacer. No necesita reiniciar sus servidores de aplicaciones para ponerse al día con los cambios de sus conjuntos de réplicas de MongoDB.

Cómo configurar alta disponibilidad

Por ejemplo, usando ClusterControl. El uso de ClusterControl se puede lograr de manera simple y eficiente, ya que esto se puede hacer a través de la interfaz de usuario, evitando esas configuraciones e instalaciones manuales para una configuración muy compleja.

Supongamos que tiene una instancia de MongoDB existente con una base de datos Open edX existente,

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

}

Simplemente puede importar esto como una base de datos existente a ClusterControl y realizar una copia de seguridad utilizando la función de copia de seguridad de ClusterControl. Alternativamente, puede usar mongodump o intentar usar Percona Backup for MongoDB.

Ahora, en ClusterControl, cree un MongoDB Shard como una nueva implementación. Esto se puede hacer mediante los siguientes pasos:

  1. Implemente un nuevo fragmento de MongoDB en el cuadro de diálogo del asistente de implementación.

  1. Establezca la configuración de SSH y sus servidores de configuración y enrutadores. Aquí es donde sus instancias mongos estarán aparte de sus servidores de configuración.

  1. Defina sus fragmentos. Estos son sus fragmentos de conjunto de réplicas. Dependiendo de su necesidad. Por ejemplo, en esta implementación implementé dos fragmentos, pero puede usar solo un fragmento para comenzar, especialmente para implementaciones pequeñas.

  1. Defina la configuración de su base de datos

En este punto, presione el botón de implementación y simplemente espere a que ClusterControl procese el trabajo.

  1. Una vez terminado, ahora puede restaurar la copia de seguridad que ha tomado de mongodump. Por ejemplo, hice una copia de seguridad usando ClusterControl y luego la usé como mi copia de seguridad de origen. Cuando utilice el comando mongorestore, asegúrese de que su host de destino sea una de sus instancias de mongos. Para esta implementación de ejemplo, tengo el 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. Ahora, está listo y luego haga algunos cambios en sus archivos de configuración de Open edX . En mi configuración de instalación, puede actualizar /edx/etc/studio.yml y  /edx/etc/lms.yml. Es posible que también deba cambiar los archivos en /edx/app/edxapp/lms.auth.json y /edx/app/edxapp/cms.auth.json y reemplazarlos con el nombre de host correcto de su instancia de mongos.

  2. Verifique en sus mongos y verifique si las bases de datos están cargadas y pueden ser accesibles,

[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

¡Ahora estás listo!

En la vista web también de ClusterControl, una vez que ClusterControl finalice la implementación, tendrá una topología que se verá así,

Una vez que haya terminado, podrá administrar Open edX y administrar tus cursos!