MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como implantar o banco de dados Open edX MongoDB para alta disponibilidade

O Open edX é uma plataforma que fornece a tecnologia de software de aprendizado altamente escalável por trás do edX. O projeto Open edX é uma plataforma baseada na web para criar, entregar e analisar cursos online. É o software que alimenta o edx.org e muitos outros sites de educação online.

Nós escrevemos em um blog anteriormente sobre a implantação de um banco de dados de alta disponibilidade para MySQL na plataforma Open edX. Como dito anteriormente, é uma plataforma complexa, pois abrange vários componentes, e parte dessa enorme plataforma é coberta por vários serviços:

  • Comércio eletrônico:https://github.com/edx/ecommerce
  • Catálogo:https://github.com/edx/course-discovery
  • LMS / Studio:https://github.com/edx/edx-platform
  • Credenciais:https://github.com/edx/credentials
  • Insights:https://github.com/edx/edx-analytics-dashboard
  • API do Analytics:https://github.com/edx/edx-analytics-data-api

Essencialmente, o Open Edx é perfeito para cursos on-line em meio a pandemia e treinamento on-line como o que você já deve ter experimentado e feito, especialmente se estiver adquirindo uma certificação de produto.

Breve Visão Geral da Arquitetura

A peça central da arquitetura Open edX é a plataforma edx, que contém os aplicativos de gerenciamento de aprendizado e criação de cursos (LMS e Studio, respectivamente). Além de sua plataforma edx, os serviços técnicos que compõem toda a plataforma compreendem várias tecnologias envolvidas que cobrem todo um nível complexo deste software. Veja o diagrama abaixo retirado da apresentação do edX Team em dezembro passado.

Você tem Snowflake, Amazon RDS, MongoDB, Amazon S3, Elasticsearch, Memcached , e Redis como as tecnologias que incorporam essa plataforma rica. Ainda é difícil instalar e configurar o Open edX mas consegui montar um ambiente de desenvolvimento simples para entender um pouco dessa plataforma.

Enquanto isso, vamos nos concentrar no MongoDB, que é usado para armazenar conteúdo para fóruns, estrutura do curso e recursos do curso. Os dados por aluno são armazenados no MySQL, portanto, se você deseja conhecer e ter alta disponibilidade para o seu MySQL com Open edX, leia aqui.

Armazenando conteúdo para MongoDB

MongoDB é o banco de dados escolhido pelo Open edX para armazenar arquivos grandes que são arquivos de texto, PDFs, clipes de áudio/vídeo, tarballs, etc. um autor para o LMS ou Studio, os dados são armazenados se você fizer upload de ativos para sua configuração do Open edX. Esses uploads são chamados de "contentstore" e são basicamente uma instância GridFS com suporte do MongoDB. O Open edX usa o MongoDB GridFS para armazenar dados de arquivo em partes dentro de uma instância do MongoDB e pode armazenar arquivos com tamanho superior a 16 MB. Ele também pode servir partes de arquivos grandes em vez de todo o arquivo.

Um ativo pode ser carregado como "bloqueado" ou "desbloqueado". Um ativo bloqueado está disponível apenas para alunos de um curso específico - a plataforma edx verifica a função do usuário antes de fornecer o arquivo. Os ativos desbloqueados são fornecidos a qualquer usuário mediante solicitação. Quando um aluno de um curso solicita um ativo, todo o ativo é atendido pelo GridFS.

Configurando uma alta disponibilidade para seu banco de dados Open edX MongoDB

Vamos admitir que instalar ou configurar sua plataforma Open edX é um grande desafio. É difícil especialmente que você seja novo nesta plataforma ou software, mas tem um design arquitetônico muito bom. No entanto, é possível que sua configuração com o MongoDB seja um conjunto de réplicas de um nó como principal. Por outro lado, é melhor que seu conjunto de réplicas tenha pelo menos um secundário ou vários nós secundários além do primário. Isso atende à sua configuração de alta disponibilidade, caso seu primário seja interrompido, seu nó de réplica secundário assumirá a função primária.

Configurar um conjunto de réplicas com réplicas secundárias

Fazendo isso, você só precisa adicionar e configurar pelo menos duas réplicas secundárias. O ideal é que, pelo menos, em um conjunto de réplicas, você tenha 3 nós para que um seja seu Primário, então os outros dois nós sejam seus secundários replicando para o primário. Isso permite que o conjunto de réplicas do MongoDB prossiga com uma eleição caso o primário perca a conectividade com seus secundários. Isso oferece confiabilidade, redundância e, claro, alta disponibilidade. É uma configuração simples que você pode ter para obter um ambiente de alta disponibilidade com o MongoDB.

Por que isso oferece alta disponibilidade? Um conjunto de réplicas no MongoDB é um grupo de processos mongod que mantêm o mesmo conjunto de dados. Os conjuntos de réplicas do MongoDB usam eleições para determinar qual membro do conjunto se tornará primário no caso de o primário ficar inativo ou encerrado de forma anormal ou algumas alterações de configuração. Os conjuntos de réplicas podem acionar uma eleição em resposta a diversos eventos, como:

  • Adicionando um novo nó ao conjunto de réplicas,
  • iniciando um conjunto de réplicas,
  • realização da manutenção do conjunto de réplicas usando métodos como rs.stepDown() ou rs.reconfig() e
  • os membros secundários perdem a conectividade com o principal por mais do que o tempo limite configurado (10 segundos por padrão).

Tome este diagrama de exemplo que visualiza como funciona a eleição.
Imagem cortesia da documentação do MongoDB

Além disso, você pode usar as outras réplicas secundárias como sua preferência de leitura, mas isso depende da configuração baseada na conexão do seu cliente. Você pode saber mais lendo as opções de preferência de leitura para conexão ou verifique a Preferência de leitura aqui.

Agora, isso parece ótimo, mas lidar com o endpoint do cliente do aplicativo, como alterar o nome do host ou o endereço IP, requer uma alteração manual. Não é ideal se você tiver um balanceador de carga em cima do seu conjunto de réplicas, assim como o HaProxy, pois o conjunto de réplicas do MongoDB realiza a eleição internamente do MongoDB.

Configurar um cluster fragmentado

O cluster fragmentado é ideal se você estiver lidando com um grande tamanho de conjuntos de dados. Embora isso não signifique que você precise projetar um cluster fragmentado, ele deve lidar com grandes conjuntos de dados. MongoDB oferece mongos, que é um utilitário que deve atuar como um serviço de roteamento para configurações de shard MongoDB que processa consultas da camada de aplicação e determina a localização desses dados no cluster shard identificado por meio de sua chave de shard para concluir suas transações ou banco de dados operações. Basicamente, basta pensar que as instâncias do mongos se comportam de forma idêntica a qualquer outra instância do MongoDB.

Então, por que ter um mongos na frente do seu aplicativo? Nos momentos em que sua réplica define o nome do host primário ou o IP muda após a eleição, do ponto de vista do aplicativo, isso significa que você também precisa alterar o ponto de extremidade. Com mongos, basta apontar seu cliente de aplicativo para uma de nossas instâncias de mongos. Seu cliente de aplicativo apenas interage com a instância mongos e isso é tudo o que importa. Os mongos serão os únicos a lidar com suas solicitações ou transações de consulta utilizando sua finalidade e função para a configuração do seu MongoDB Shard. Isso significa que, em seus arquivos de configuração do Open edx, não há alterações a serem feitas. Você não precisa reiniciar seus servidores de aplicativos para acompanhar as alterações de seus conjuntos de réplicas do MongoDB.

Como configurar a alta disponibilidade

Por exemplo, usando ClusterControl. O uso do ClusterControl pode ser feito de maneira simples e eficiente, pois isso pode ser feito pela interface do usuário, evitando essas configurações e instalações manuais para uma configuração muito complexa.

Vamos considerar que você tem uma instância MongoDB existente com banco de dados 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

}

Você pode simplesmente importar isso como um banco de dados existente para o ClusterControl e fazer um backup usando o recurso de backup do ClusterControl. Como alternativa, você pode usar o mongodump ou tentar usar o Percona Backup for MongoDB.

Agora, no ClusterControl, crie um MongoDB Shard como uma nova implantação. Isso pode ser feito pelas seguintes etapas:

  1. Implante um novo MongoDB Shard na caixa de diálogo do assistente de implantação.

  1. Configure as configurações de SSH e seus servidores e roteadores de configuração. É aqui que suas instâncias do mongos devem ficar além de seus servidores de configuração.

  1. Defina seus fragmentos. Esses são os fragmentos do conjunto de réplicas. Dependendo da sua necessidade. Por exemplo, nesta implantação, implantei dois shards, mas você pode usar apenas um shard para começar, especialmente para pequenas implantações.

  1. Defina suas configurações de banco de dados

Neste ponto, pressione o botão deploy e apenas espere enquanto o trabalho é processado pelo ClusterControl.

  1. Ao terminar, agora você pode restaurar o backup que você fez do mongodump. Por exemplo, fiz um backup usando o ClusterControl e o usei como meu backup de origem. Ao usar o comando mongorestore, certifique-se de que seu host de destino seja uma de suas instâncias mongos. Para esta implantação de exemplo, tenho o 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. Agora, você está pronto e faça algumas alterações nos arquivos de configuração do Open edX . Na minha configuração de instalação, você pode atualizar os arquivos /edx/etc/studio.yml e  /edx/etc/lms.yml. Talvez seja necessário alterar também os arquivos nos arquivos /edx/app/edxapp/lms.auth.json e /edx/app/edxapp/cms.auth.json e substituí-los pelo nome de host correto de sua instância mongos.

  2. Verifique em seus mongos e verifique se os bancos de dados estão carregados e podem ser acessados,

[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

Agora você está pronto!!!

Na visualização web também do ClusterControl, assim que o ClusterControl terminar a implantação, você terá uma topologia que ficará assim,

Uma vez feito, você está pronto para gerenciar seu Open edX e gerenciar seus cursos!